最近感觉opencv里面 cvGetSubRect 这个函数很好用,特别是在对矩阵中局部区域进行计算的时候,下面将其用法和注意事项简述如下:
cvGetSubRect的语法为:CvMat * cvGetSubRect(const CvArr *arr,CvMat *submat,CvRect rect);
cvGetSubRect(cvMat *src,cvMat *submat1,cvRect ROI1);
cvGetSubRect(cvMat *src,cvMat *submat2,cvRect ROI2);
在项目中我在src中 提取了submat1和submat2后(这两个矩阵的大小都是一样的,只是提取了src中不同的区域),然后执行了如下求和操作:
cvSub(submat1,submat2,submat2);
这个时候问题来了:src中在submat2所在的区域中的值变成了上述求和后的值了,因此以后在使用cvGetSubRect和cvSub这两个函数时,不可节约变量,即应该
将cvSub(submat1,submat2,submat2)改成cvSub(submat1,submat2,subtemp);subtemp是某个和submat1和submat2大小一样的矩阵变量,
个人觉得cvGetSubRect这个函数怎么与它的局部区域会联系起来有点疑惑?
最近发现cvGetSubRect这个函数居然存在内存泄露,优快云上已经有很多人发现这个问题了,这里将GetSubRect的语法结构列举如下:
功能:函数 cvGetSubRect 根据输入图像或矩阵的矩形数组子集返回矩阵头
格式:
CvMat *cvGetSubRect(const CvArr * arr,CvMat *submat,CvRect rect);
调用该函数时 注意第二个矩阵CvMat *submat不可以预先分配内存空间,这里给出有内存泄露的表达形式,和没有内存泄露的表达形式:
有内存泄露的表达形式:
CvRect ROI_1;
ROI_1.x = s_col;
ROI_1.y = s_row;
ROI_1.width = n - s_col;
ROI_1.height = m - s_row;
(上面 s_col,s_row,m,n是整形变量)
CvMat *IP = cvCreateMat(m,n,CV_32FC1);
CvMat *submat_IP = cvCreateMat(ROI_1.height,ROI_1.width,CV_32FC1);
cvGetSubRect(IP,submat_IP,ROI_1);
没有内存泄露的表达形式:
CvMat *IP = cvCreateMat(m,n,CV_32FC1);
CvMat *submat_IP;
submat_IP = cvCreateMatHeader(ROI_1.height,ROI_1.width,CV_32FC1); cvGetSubRect(IP,submat_IP,ROI_1);
cvGetSubRect(IP,submat_IP,ROI_1);