gpt4 book ai didi

OpenCV Mat图像在通过引用调用函数后改变大小

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:31 25 4
gpt4 key购买 nike

我正在使用 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 819819 819__________________819 819435 435__________________819 819435 435

所以出于某种原因,bin1 和 bin2 图像 (cv::Mat) 改变了大小。但是,如果我设置 double scale=0.4; to double scale=1;,因此不调整图像大小但保留其原始大小,图像大小在函数内外匹配:

__OUT__2048 10882048 1088__________________2048 20481088 1088__________________2048 20481088 1088

我做错了什么?调整大小如何影响垫子对象?为什么它完全不同,如果它是通过引用传递的,我应该在函数内部有相同的对象。

谢谢

最佳答案

传递图像作为函数的引用不应该改变它们的大小!快速查看您的代码,我没有看到任何特定错误,但您程序的另一部分可能存在一些内存访问,这会损坏您的数据但不会使程序崩溃。你应该用分析器检查你的程序。

另一个建议是,您的函数 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;

关于OpenCV Mat图像在通过引用调用函数后改变大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12903542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com