我正在使用OpenCV编写应用程序。最近我注意到cv :: Mat对象在通过引用传递给函数时有时会发生奇怪的事情。这是代码:
cv::Mat img1=cv::imread(argv[1]);
cv::Mat img2=cv::imread(argv[2]);
double scale=0.4;
int thr=52;
//resize image
cv::Mat tmp;
img1.copyTo(tmp);
cv::resize(tmp,img1,cv::Size(),scale,scale);
img2.copyTo(tmp);
cv::resize(tmp,img2,cv::Size(),scale,scale);
cv::Mat im1,im2;
try
{
cv::Sobel(img1,im1,CV_8U , 0/*x order*/, 1/*y order*/,5/*kernel size*/,1/*scale*/);
cv::Sobel(img2,im2,CV_8U , 0/*x order*/, 1/*y order*/,5/*kernel size*/,1/*scale*/);
}
catch(...)
{
std::cout << "Something went wrong calculating Sobel!" << std::endl;
}
cv::imshow("im1",im1);
cv::imshow("im2",im2);
//create empty mat with the same size as im1, im2
cv::Mat bin1(im1.size().height, im1.size().width, CV_8UC1);
cv::Mat bin2(im2.size().height, im2.size().width, CV_8UC1);
std::cout << "_________OUT_________" << std::endl;
std::cout << im1.size().width << " " << bin1.size().height << std::endl;
std::cout << im2.size().width << " " << bin2.size().height << std::endl;
getExtreme(im1,bin1,thr);
getExtreme(im2,bin2,thr);
getExtreme函数的定义如下:
void getExtreme(cv::Mat &img, cv::Mat &dst,int prag)
{
int x=img.size().width;
int y=img.size().height;
std::cout << "_________________IN______________________" << std::endl;
std::cout << x << " " << dst.size().width << std::endl;
std::cout << y << " " << dst.size().height << std::endl;
int i,j;
for (i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
if(img.data[img.channels()*img.cols*j+i]>prag)
dst.data[dst.channels()*dst.cols*j+i]=255;
}
}
}
虽然我正在打印的图像是相同的,但程序的输出是:
的 的 __ OUT 的 _ _ 819 819 819 819 的 _ __ _ ____ IN 的 _ __ _ < / EM> __ _ ___ 819 819 435 435 的 的 __ _ __ _ _ IN 的 _ __ _ __ _ ____ 819 819 435 435
因此由于某种原因,bin1和bin2图像(cv :: Mat)会改变大小。但是,如果我设置双刻度= 0.4;为了缩小比例= 1;因此不调整图像大小但保留其原始大小,图像的大小在函数的内部和内部匹配:
的 的 __ OUT 的 _ _ 2048 1088 2048 1088 的 _ __ _ ____ IN 的 _ __ _ < / EM> __ _ ___ 2048 2048 1088 1088 的 的 __ _ __ _ _ IN 的 _ __ _ __ _ ____ 2048 2048 1088 1088
我做错了什么?调整大小如何影响mat对象?为什么它完全不同,如果它通过引用传递,我应该在函数内部具有相同的对象。
感谢
答案 0 :(得分:1)
将图像作为参考传递给函数不应改变它们的大小!快速查看代码,我没有看到任何特定的错误,但程序的另一部分可能会有一些内存访问损坏您的数据,但不会导致程序崩溃。您应该使用分析器检查您的程序。
另一个建议是,你的函数getExtreme似乎执行一个简单的阈值操作。这可以在OpenCV中使用cv::threshold
或使用cv :: Mat中的operator>
来实现(请参阅Matrix expressions)。例如:
cv::threshold(im1,bin1,thr, 255, CV_THRESH_BINARY);
cv::threshold(im2,bin2,thr, 255, CV_THRESH_BINARY);
或
bin1 = im1 > thr;
bin2 = im2 > thr;