还有一封信导致 imread 中的访问冲突
Posted
技术标签:
【中文标题】还有一封信导致 imread 中的访问冲突【英文标题】:One more letter causes Access Violation in imread 【发布时间】:2013-01-12 04:16:38 【问题描述】:由于某种原因,此代码在第二次读取时产生了访问冲突,但不是第一次。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, char **argv)
Mat mat1, mat2;
char imgname1[255]="cise_StackD.tif";
mat1 = imread( imgname1, CV_LOAD_IMAGE_GRAYSCALE);
char imgname2[255]="ecise_StackD.tif";
mat2 = imread( imgname2, CV_LOAD_IMAGE_GRAYSCALE);
return 0;
确切的运行时错误消息是:“MLMVNroThrust.exe 中 0x61f437ef (msvcr100d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xcccccccc。”具有相同可见项目设置的相同代码可以在另一台 PC 上运行。图像是相同的副本。
我正在使用 OpenCV 2.4.3 预构建的二进制文件;这些项目也设置为使用 CUDA,但我已经剥离了所有 CUDA 代码以隔离问题。
是什么造成了这种访问冲突,我该如何摆脱它?
谢谢。
【问题讨论】:
它实际上是文件名中的额外字母吗?如果您将两个调用交换为imread
,那么是否是第一个调用?不知何故,这对我来说似乎不太可能。
SO 上的其他一些人发现使用发布库可能会有所帮助:***.com/questions/8164932/…
你能把文件贴在某个地方让我们试试吗?去掉char数组,直接在函数调用中粘贴图片名称字符串。文件可用吗?尝试使用 fopen 打开文件只是为了查看它们是否存在于您运行它的工作目录中。 Visual Studio 有一个讨厌的习惯,即使用源文件夹作为工作目录,而不是实际的 exe 文件所在的位置。我在调试中使用过这种代码没有问题。
@us2012 - 事实上,如果我交换调用顺序,第一个会抛出。
@Gustavo Litovsky,直接使用图像名称仍然会导致违规。我确保图像在两个名称下都存在,并且加载的副本可以正常显示。但即使目录中没有任何名称下的图像,行为也不会改变。 image with full name is here
【参考方案1】:
根据this post on the OpenCV forums,当使用 Visual C++ 2008 和用于 2010 的 OpenCV 路径时会发生这种情况(OPENCV_AV 设置为“%OPENCV_ROOT%\x86\vc10”)。
我已经在我的实验室 PC 上纠正了这个问题(OPENCV_AV 现在设置为“%OPENCV_ROOT%\x86\vc9”),它是用 Visual C++ 2010 设置的,供以前的研究人员使用。
感谢所有回复的人!
【讨论】:
以上是关于还有一封信导致 imread 中的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章