组里用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);
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然后再转灰度。不升级比较难解。