opencv3.2 的一些坑

组里用3.2.0很久了,不能更新,然而也踩了不少坑,尤其在传统图像处理,像亮度计算、模糊、归一化设计的矩阵操作。。

1、计算perceived brightness,输入是CV_8U

原版本方法:

...

for(size_t j=0; j<bgr.size(); j++){

bgr[j].convertTo(bgr[j],CV_32F);

}

Mat img_pb = (0.2126*bgr[2] + 0.7152*bgr[1] + 0.0722*bgr[0])/255.0;

return mean( img_pb )[0]

原方法可能会提示bgr[x] imcomplete sequence之类的错误。。有说法是CV_8U可能存在内存泄漏 https://blog.csdn.net/wsj998689aa/article/details/46627347,不确定。

3.2版本:

double sum_scaler = 0.;

for(size_t j=0; j<bgr.size(); j++){

bgr[j].convertTo(bgr[j],CV_32F);

sum_scaler += sum( bgr[j] * bright_weis[j] ).val[0];

}

double val_pb = sum_scaler/bgr[0].cols/bgr[0].rows;

return val_pb

2、两矩阵相减

原代码

v_diff[i] = (double) (cv::norm( cv::abs(_v_frm_rgb[i]-_v_frm_rgb[i-1])                       
       + cv::norm( cv::abs(_v_frm_rgb[i]-_v_frm_rgb[i+1]) )) / (2.0*img_sz);

可能提示incomplete sequence或<Address 0x1 out of bounds>,这里关系到多个MatOp操作的问题,MatOp定义与执行不同时进行,需要把一些步骤赋值保存下来。

3.2版本

    Mat diffMat1,diffMat2;
    cv::absdiff(_v_frm_rgb[i],_v_frm_rgb[i-1],diffMat1);
    cv::absdiff(_v_frm_rgb[i],_v_frm_rgb[i+1],diffMat2);
    double norm1i = cv::norm( diffMat1 );
    double norm2i = cv::norm( diffMat2 );
    v_diff[i] = (double) (norm1i + norm1i) / (2.0*img_sz);

参考 OpenCV两个Mat相减的隐藏秘密 |

3、多个MatOp操作

原代码 

rho_out = 1.0 - min(1.0,sum(v_edge[i-1].mul(v_edge_dl[i]))[0]/max(1e-6,sum(v_edge[i-1])[0]));
rho_in  = 1.0 - min(1.0,sum(v_edge_dl[i-1].mul(v_edge[i]))[0]/max(1e-6,sum(v_edge[i-1])[0]));

1) segmentation fault,提示sum计算有问题,把mul相关的4个变量记为v1, v1_dl, v2, v2_dl, 下述单步计算发现sum(v1)在 sum(v1.mul(xxx))之后会一直失败,推测是MatOp定义的操作问题,sum(v1)放前面就可以了

2)<Address 0x80 out of bounds>, mul计算需要32F/64F等类型

3.2版本

      Mat v1, v1_dl, v2, v2_dl;
      v_edge[i-1].convertTo(v1, CV_32F);  //before 8UC1, mul or * must use 32F/64F
      v_edge_dl[i-1].convertTo(v2_dl, CV_32F);
      
      Scalar sum3s = sum(v1);
      v_edge_dl[i].convertTo(v1_dl, CV_32F);
      v_edge[i].convertTo(v2, CV_32F);  // in next iter, no need to convert
      Mat tmpMat = v1.mul(v1_dl); 
      Mat tmpMat2 = v2_dl.mul(v2);
      Scalar sum1s = sum(tmpMat);
      Scalar sum2s = sum(tmpMat2);

      sum1 = (double)(sum1s.val[0]);//4811 == sum3??
      sum2 = (double)(sum2s.val[0]);//4827
      sum3 = sum3s.val[0]; 

      rho_out = 1.0 - min(1.0,sum1/max(1e-6,sum3));
      rho_in  = 1.0 - min(1.0,sum2/max(1e-6,sum3));

4、灰度图gaussianblur问题

Memory leak in GaussianBlur · Issue #11449 · opencv/opencv · GitHub

据说更新到3.4.11之后解决了。灰度图CV_8UC1格式,采用blur不一定解决。可以先对彩色图blur然后再转灰度。不升级比较难解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值