OpenCV(C语言API) cvGetSubRect中的坑

首先cvGetSubRect的定义如下:

cvGetSubRect( const CvArr* arr, CvMat* submat, CvRect rect );

第一个参数是输入图像,第二个参数是裁切后的输出图像,第三个参数是裁切的范围

主要注意一下第三个参数的设置:

cvRect(offset, offset, W, H)

首先是宽和高的偏移量,接下来要注意先设置“宽”再设置“高”

容易发生的错误:很多人将第二个参数预先初始化并分配内存:

CvMat *src = cvCreate(H, W , CV_64FC1);
CvMat *srcPlus = cvCreateMat(H + offset * 2, W + offset * 2, CV_64FC1);
cvGetSubRect(srcPlus, src, cvRect(offset, offset, W, H));

上面这种写法是不对的,因为cvGetSubRect的裁切并不是真正的裁切出一个新的图像,生成的目标src图像对应指针指向的源数据其实是srcPlus,并没有分配新的内存;所以预先分配了src的内存会造成内存泄漏

因此以上情况中,如果释放了srcPlus的内存(cvRelease(void **)&srcPlus),src也会失效

正确的使用方式如下:

CvMat *src = cvCreateMatHeader(H, W, CV_64FC1);
CvMat *srcPlus = cvCreateMat(H + offset * 2, W + offset * 2, CV_64FC1);
CvMat *dst = cvCreateMat(H, W, CV_64FC1);

cvGetSubRect(srcPlus, src, cvRect(offset, offset, W, H));
cvCopy(src, dst, NULL);

cvRelease((void **)&src);
cvRelease((void **)&srcPlus);
cvRelease((void **)&dst);

cvCreateMatHeader() 函数创建CvMat结构,不为数据分配内存,所以不会造成内存泄漏,如果想“单独”存取裁切后的数据,创建一个新的变量dst,并使用cvCopy实现数据的复制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值