C ++中的openCV Mat访问冲突
Posted
技术标签:
【中文标题】C ++中的openCV Mat访问冲突【英文标题】:openCV Mat access violation in C++ 【发布时间】:2018-10-27 19:39:57 【问题描述】:我收到“在 ....exe 中的 0x00007FFF428944E0 (opencv_world343d.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x0000023339631FB8。”我已经阅读了一些“访问冲突读取位置”的帖子和主题,但我认为我正确分配和初始化内存,这似乎是最常见的问题。
我的代码包含一个“loadfits”函数,它加载 16 位灰度图片并将其存储在 openCV cv::Mat 中。该函数有效 - 在 return 语句之前的最后,我可以显示或保存图像,并且在函数内部一切正常。但是当我尝试访问并使用 main() 中的 cv::Mat 时,我得到了访问冲突错误。
#define DFTtypeCV CV_64FC1
#define PICtypeCV CV_16UC1 //16bit grayscale image
Mat loadfits(std::string path)
ifstream streamIN(path, ios::binary | ios::in);
vector<char> celyobraz_8(fitsSize*fitsSize * 2, 0);
streamIN.read(&celyobraz_8[0], fitsSize*fitsSize * 2);
... //some code
Mat fits_PICTURE_Mat = Mat(fitsSize, fitsSize, PICtypeCV, &celyobraz_8[0], Mat::AUTO_STEP);
showimg(fits_PICTURE_Mat, "fitsRaw"); //shows the correct image
return fits_PICTURE_Mat; //returns the same image
然后我使用这个函数来初始化和使用 main() 中的 cv::Mat
Mat picZERO(fitsSize, fitsSize, PICtypeCV);
Mat picZEROd(fitsSize, fitsSize, DFTtypeCV);
picZERO = loadfits(path);
picZERO.convertTo(picZEROd, DFTtypeCV); //I get the error here
我认为我能够轻松解决这个错误,因为我在函数返回语句之前有正确的数据,但似乎无法弄清楚。
有什么想法吗?谢谢。
【问题讨论】:
我假设celyobraz_8
是loatfits
中的局部变量(我猜是std::vector
)?如果您提供正确的minimal reproducible example,这将非常有用,因此我们不必猜测。
要记住的是,当您以这种方式构造cv::Mat
时,它不拥有像素数据数组,因此您必须确保该数组至少存在cv::Mat
包裹它。
是的,所以问题是矢量在loatfits
末尾超出范围,但您的cv::Mat
仍然指向矢量数据曾经所在的位置。如果您不介意复制整个图像,只需执行return fits_PICTURE_Mat.clone();
它起作用了,但不知道,这个 cv::Mat 构造只引用了一些数据,并不拥有它。谢谢!
@KeithRussell Mat
类能够以两种方式表现——它可以观察指向某个缓冲区的指针(如本函数的情况),或者它可以分配一个并拥有它,在这种情况下它会引用计数。调用clone
执行深拷贝,它分配一个新的引用计数的缓冲区。赋值是一个浅拷贝——在拥有的情况下引用计数增加,在非拥有的情况下它只是复制它观察到的指针。 |有关详细信息,请参阅docs.opencv.org/4.5.1/d6/d6d/…。
【参考方案1】:
遇到了同样的问题。就我而言,解决方案是在发布配置中删除指向 opencv_world343d.dll 的链接。此文件仅用于调试模式。
(最初,我按照这条指令http://shailendra.me/tutorial/add-opencv-to-visual-studio-c++-project/)
【讨论】:
以上是关于C ++中的openCV Mat访问冲突的主要内容,如果未能解决你的问题,请参考以下文章