OpenCV+VS2010出现未处理异常

5

我可以成功构建和执行下面的代码:

 IplImage* img = cvLoadImage("C:\\hello.jpg");
 cvNamedWindow("myfirstwindow");
 cvShowImage("myfirstwindow", img);

但是我在执行以下代码时遇到了未处理的异常:
    cv::Mat image= cv::imread("boldt.jpg");
    cv::namedWindow("Image");
    cv::imshow("Image",image);

虽然我可以成功构建代码,但是我在使用opencv2.2和VS2010 x86版本的Windows 7 x86版本时遇到了问题。请帮忙!更新:我在WinXP上尝试过,它可以正常工作...只有在Release模式下才能在Win7上正常工作。
6个回答

5
可能是人们没有意识到,当VStudio运行应用程序时,它会尝试在已编译可执行文件的同一目录中查找资源,而不是在源文件所在的文件夹中查找。您的第一个代码之所以有效,是因为您正在传递文件的完整路径来加载图像!这就是为什么在编码时检查函数成功非常重要的原因:
try 
{
    cv::Mat image = cv::imread("boldt.jpg");

    if (!image.data) 
        printf("!!! No data !!!");
} 
catch(std::exception e) 
{
    printf("Exception: [%s]\n", e.what());
}

这种编程实践会为您节省大量时间。

编辑

如果崩溃仍在发生,那么可能是cv::namedWindow()cv::imshow()的问题,我认为问题出在cv::namedWindow()

其他用户在Windows上报告了类似的行为:

OpenCV 2.2 Windows XP MinGW build crashes on namedWindow, imshow

Open CV crashes under WIN7 when opening NamedWindow

namedWindow() causes crash in opencv 2.3.1? (Eclipse+MinGW on XP, C++)

看起来解决问题需要禁用SSE优化


谢谢您的回答。但是,即使我改为完整路径,仍然遇到了相同的问题。上面的异常代码也没有起作用,当执行代码时仍然会出现相同的未处理异常错误。 - Zombia
2
更新答案!这可能是OpenCV在Windows上的已知错误。请参考此链接:https://code.ros.org/trac/opencv/ticket/583。 - karlphillip
感谢您的回复。我更新到2.3.1后仍然遇到崩溃问题,SSE方法对我也没有用。不过,在发布模式下它运行良好,似乎是一个不错的替代方案。 :) - Zombia

3
我正在使用OpenCV 2.3.1,当我在发布模式下运行它(连接到发布highgui库)时,一切都很好。 当我切换到调试模式(仍然连接到发布highgui库)时,它会崩溃。 连接到调试highgui库可以解决这个问题。 也许你有同样的问题...

是的,我们遇到了同样的问题。我升级到OpenCV2.3.1,但在调试模式下仍然崩溃,但在发布模式下运行良好。 - Zombia
2
将你的项目中的调试和发布库文件分开,这样可以解决我的问题。 - Mattias

1

我有与描述的完全相同的问题。

事实证明,问题非常在于链接器的设置!

我在另一个线程中找到了答案: OpenCV 2.3 and Visual Studio 2010

这是答案:

“项目属性(右键单击)

  • C/C++
    • 通用
      • 包含目录添加 <你的目录>\OpenCV2.3\include\opencv2, <你的目录>\OpenCV2.3\include\opencv 和 <你的目录>\OpenCV2.3\include
  • 链接器

    • 通用
      • 列表项
    • 输入
      • 添加所有库,如 opencv_core230d.lib、opencv_highgui230d.lib 等等..."

完成上述步骤后,我可以无缝运行 imshow 和 imread + 所有其他 cpp 函数!提问者可能已经解决了这个问题。但以防万一,如果有其他人在寻找同样的解决方案,可以看看这里!

干杯!


1
你有检查过imread()函数的输出吗?
if(image.empty())
{
        cout << "where's my image?" << endl;
        return 0;
}

感谢您的回答。未处理的异常错误出现在一行代码中:“cv :: Mat image = cv :: imread(“1.jpg”); ”..我认为imread函数无法在我的VS2010中执行。 - Zombia

0

0

检查生成编译文件夹,因为其中一个文件夹中有编译的.exe文件,你想要打开的图像可能不在那里。在我的情况下,.exe(在Debuge模式下)位于C:\ Users \ Name \ source \ repos \ HolaMundox \ x64 \ Debug中,而不是我创建的.cpp所在的位置C:\ Users \ Name \ source \ repos \ HolaMundox。类似的事情也适用于Release模式。 另一件事是你必须仔细检查图像的扩展名,如果是.jpg,.jpeg,.bmp等等...我遇到的一个错误是我把扩展名.jpg写成了.jpeg。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接