栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OpenCV(C语言API) cvGetSubRect中的坑

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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实现数据的复制

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883455.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号