通过引用而不是按值传递 OpenCV C++
Posted
技术标签:
【中文标题】通过引用而不是按值传递 OpenCV C++【英文标题】:Pass by refrence instead of by value OpenCV C++ 【发布时间】:2014-03-14 01:27:08 【问题描述】:在使用 C++ 时我不是很有经验,当我使用不处理图像的方法时,我得到了来自 Andrey Smorodov 的一些代码。我相信它是按值传递的,一旦方法完成运行,变量就消失了。有人可以告诉我通过引用与值传递是否有问题?当我注释掉该方法时,它不会改变结果图像。
方法:
void CalcBlockMeanVariance(cv::Mat Img,cv::Mat Res,float blockSide=21) // blockSide - the parameter (set greater for larger font on image)
cv::Mat I;
Img.convertTo(I,CV_32FC1);
Res=cv::Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
cv::Mat inpaintmask;
cv::Mat patch;
cv::Mat smallImg;
cv::Scalar m,s;
for(int i = 0;i < Img.rows-blockSide;i+=blockSide)
for (int j=0;j<Img.cols-blockSide;j+=blockSide)
patch=I(cv::Rect(j,i,blockSide,blockSide));
cv::meanStdDev(patch,m,s);
if(s[0]>0.01) // Thresholding parameter (set smaller for lower contrast image)
Res.at<float>(i/blockSide,j/blockSide)=m[0];
else
Res.at<float>(i/blockSide,j/blockSide)=0;
cv::resize(I,smallImg,Res.size());
cv::threshold(Res,inpaintmask,0.02,1.0,cv::THRESH_BINARY);
cv::Mat inpainted;
smallImg.convertTo(smallImg,CV_8UC1,255);
inpaintmask.convertTo(inpaintmask,CV_8UC1);
inpaint(smallImg, inpaintmask, inpainted, 5, cv::INPAINT_TELEA);
cv::resize(inpainted,Res,Img.size());
Res.convertTo(Res,CV_32FC1,1.0/255.0);
调用方法:
cv::Mat cvImage = [self cvMatFromUIImage:image];
cv::Mat res;
cv::cvtColor(cvImage, cvImage, CV_RGB2GRAY);
cvImage.convertTo(cvImage,CV_32FC1,1.0/255.0);
//CalcBlockMeanVariance(cvImage,res);
res=1.0-res;
res=cvImage+res;
cv::threshold(res,res, 0.85, 1, cv::THRESH_BINARY);
cv::resize(res, res, cv::Size(res.cols/2,res.rows/2));
cvImage.convertTo(cvImage,CV_8UC3,255.0);
_endImage = [self UIImageFromCVMat:cvImage];
在转换回UIImage
时会丢失任何数据吗?
这是我生成的图像:
Andrey 使用这种方法得到的结果:
谁能解释为什么我会得到与安德烈不同的结果? 谢谢
【问题讨论】:
顺便说一句,请记住在调用此函数之前进行预处理,并在返回结果后进行后处理,如您上一篇文章中 Andrey 的代码中所述。否则你不会得到他的结果。 【参考方案1】:把函数定义改成如下:
void CalcBlockMeanVariance(const cv::Mat &Img, cv::Mat &Res, float blockSide=21)
【讨论】:
以上是关于通过引用而不是按值传递 OpenCV C++的主要内容,如果未能解决你的问题,请参考以下文章