Opencv函数使用注意事项(持续更新)

    最近感觉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这个函数居然存在内存泄露,CSDN上已经有很多人发现这个问题了,这里将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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值