OpenCV 2.4.2 imread函数导致运行时错误

时间:2012-08-16 14:16:31

标签: c++ opencv

我是OpenCV的先驱。我的编程环境是VC ++ Express 2010 + OpenCV 2.4.2 + Win 7 64位。

我在VC ++和Path中使用纯粹的32位配置。

我输入以下代码:

#include "opencv2\highgui\highgui.hpp"
#include "opencv2\core\core.hpp"
using namespace cv;

int main(int argc, char** argv) {
    char* imgPath = "logo.png";
    Mat img = imread(imgPath);
    namedWindow( "Example1", WINDOW_AUTOSIZE);
    imshow("Example1", img);
    waitKey(0);
    return 0;
}

然后我编译并运行。它确实提出了一个窗口(但没有图片),但后来给了我这个(运行时错误?)

Unhandled exception at 0x770515de in Helloworld2.exe: Microsoft C++ exception: cv::Exception at memory location 0x001ef038..

然后我将imread更改为cvLoadImage,它没有任何错误。

有人可以告诉我出了什么问题吗?

5 个答案:

答案 0 :(得分:2)

我已尝试过您提供的代码。我安装OpenCV时效果非常好。

但是我收到警告:

char* imgPath = "logo.png";

main.cpp:6:21: warning: deprecated conversion from string constant to 'char*' [-

Wwrite串]

我认为使代码崩溃并不严重,但是在您的情况下可能是问题,因为我没有使用VC ++进行编译。

你可以尝试检查这是否是问题是直接用字符串替换imgPath,所以代码现在就像

Mat img = imread("logo.png"); 

答案 1 :(得分:1)

我也遇到了这个问题,但我修复了以下内容。关键是使用相对路径以外的绝对路径,并在文件路径中将“\”更改为“/”。

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

int main() {
    cv::Mat image = cv::imread("D:/projects/test/Debug/1.jpg");
    if (image.empty()) {
        return 0;
    }
    cv::namedWindow("my image");
    cv::imshow("my image", image);
    cv::waitKey(5000);
    return 1;
}

答案 2 :(得分:0)

在opencv文档中可以看到cvLoadImageimread之间的差异:

  

C ++:Mat imread( const string&amp; filename ,int flags = 1)

  

C:CvMat * cvLoadImageM( const char * filename ,int   iscolor = CV_LOAD_IMAGE_COLOR)

但是从const char *string的隐式转换。正如masad所说,这种转换已被弃用,因此它非常依赖于编译器。

由于cvLoadImage适合您,您似乎应该将代码更改为以下内容:

#include "opencv2\highgui\highgui.hpp"
#include "opencv2\core\core.hpp"
#include <string>
using namespace cv;

int main(int argc, char** argv) {
    std::string imgPath("logo.png");
    Mat img = imread(imgPath);
    namedWindow( "Example1", WINDOW_AUTOSIZE);
    imshow("Example1", img);
    waitKey(0);
    return 0;
}

Visual Studio中有一些problems带有C ++接口,但您可能会尝试查看它是否适合您。

答案 3 :(得分:0)

我遇到了同样的问题,我遇到了Installing OpenCV 2.4.3 in Visual C++ 2010 Express,它提到在为链接器添加依赖项时使用更新的库集* d.lib。我试了一下,C ++界面也运行了。不确定这是否是一般的情况。我在64位Windows机器上使用OpenCV 2.4和Visual Studio 2010。

答案 4 :(得分:0)

我遇到了类似的问题。当我使用imread函数时,程序崩溃并显示系统错误消息: opencv_debug.exe中的0x0036299f处未处理的异常:0xC0000005:读取位置0xcccccccc时发生访问冲突

然后我将imread更改为cvLoadImage,它没有任何错误。

最后,我解决了这个问题,因为我使用VS2008编译了dll的VS2008项目

这是我的故事。

环境: VS2008 + opencv2.4.7

首先,我只需点击链接http://docs.opencv.org/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html,然后编译我的测试项目。

但是,当我运行我的测试项目时,系统错误对话框告诉我,我丢失了 MSVCP100D.dll MSVCR100D.dll 。所以我下载了两个dll,dll丢失问题解决了,但问题是运行时崩溃。

注意前面的链接,它说: setx command

这意味着,在opencv2.4.7中,它们只提供在vs2010或vs2012中编译的dll,而不是vs2008。

当我使用vs2010编译的dll编译vs2008项目时,我遇到了有线问题。

如何解决此问题?

  1. 使用较旧的opencv版本,如opencv2.3,此版本包含vs2008编译的dll。 vc9

  2. 自己编译opencv。

  3. 我注意到您的环境是:VC ++ Express 2010 + OpenCV 2.4.2 + Win 7 64位。 确保OPENCV_DIR设置正确。

    setx -m OPENCV_DIR D:\ OpenCV \ Build \ x64 \ vc10