还有一封信导致 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 中的访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

给毕业生的一封信

写给初学前端工程师的一封信

清华学子写给高中生的一封信!

人生如水,由溪入海(给大学的一封信)

给考研迷茫中的你的一封信

呦呦鹿鸣,食野之苹-- 给新生儿的一封信