OpenCV 未处理的异常错误

Posted

技术标签:

【中文标题】OpenCV 未处理的异常错误【英文标题】:OpenCV unhandled exception error 【发布时间】:2015-02-19 17:07:04 【问题描述】:

我正在运行我正在使用 opencv 函数 imread() 和数据结构 Mat 的代码。

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main()
    int x;
    Mat img = imread("D:/OwnResearch/photo2.jpg");
    std::cout << img << std::endl;
    std::cin >> x;
    return 0;



我在 opencvtest.exe 中的 0x0000000000000000 处不断收到错误未处理的异常:0xC0000005:访问冲突执行位置 0x0000000000000000。似乎什么都没有加载。我检查了文件的目录,它似乎是正确的。我不确定问题是什么。

【问题讨论】:

好像你没有在运行时加载 dll。确保将它们复制到 bin/debug 或 release 我不确定std::cout &lt;&lt; img &lt;&lt; std::endl; 的定义是否明确。您应该使用 OpenCV 的简单图像显示功能。 我同意@Cheersandhth.-Alf 和Gilad 的观点,除此之外,我认为这样做没有意义。如果您打印数据(cv::Mat::data),即使是 100x100 的图像,您也会得到 10000 个值。如果您想检索有关图像及其内容的一些附加信息,您可以通过调用 cv::Mat::row 和 cv::Mat::col 以及各种其他参数轻松打印图像的宽度和高度。 @Cheersandhth.-Alf 定义为:docs.opencv.org/doc/tutorials/core/… 【参考方案1】:

问题可能出在您要链接的 DLL 中。确保使用正确的 - 发布 dll 用于发布构建,调试 dll 用于调试构建。这是一个非常常见的错误,所以我建议你先看看它。其次,正如 cmets 和@1nflktd 的回复中提到的,您还试图在终端中打印您的图像。 首先我不认为这确实是在库中定义的,其次我真的不明白这样做的意义(the new C++ interface allows printing a cv::Mat directly )。如果您想打印图像的属性,您可以使用 cv::Mat::row、cv::Mat::col 等(请参阅here 或简单地写img.[TRIGGER AUTOCOMPLETE] 以获取您可以在 cv 中访问的所有内容::垫对象)。如果您真的想打印图像的数据(像素数组),您需要调用 cv::Mat::data 并在需要时进行相应的转换。不过要小心,因为您将获得大量值。 10x10 的图像有 100 个值,100x100 有 10000 个值,1000x1000 的像素数组有 1000000 个值。

如果 DLL 正常,请尝试执行以下操作:

    使用Mat img(X,Y,CV_XXXX,Scalar(...))生成图像,其中XY是图像的尺寸,CV_XXXX是用于存储的内存单元存储像素数据(例如 CV_32FC2),Scalar(...) 表示要用于图像中所有像素的每个颜色通道的值。 尝试显示生成的图像。不久前,我在使用 OpenCV 的 Windows 中遇到了不好的经验,出现了类似的错误,因为我在 Visual Studio 中删除了 stdafx.h,这导致我传递给 的字符串的解释不正确>cv::imread(...) 函数。这是我过去实际看到问题出在哪里的方式。如果您正在使用 Windows 机器并遇到此问题,那么这也是一个不错的选择。如果程序生成的图像确实加载并正确显示,那么这可能是问题所在(如果您已删除上述标题)。

【讨论】:

我能够以这种方式打印矩阵 img(类型 mat)。我只是想查看矩阵的值。当我打印矩阵的维度时,它显示为 0。我想知道为什么会这样? 啊,好的。好吧,矩阵维度显示为 0 的原因是它是空的(使用 cv::Mat::empty() 进行额外检查应该返回 TRUE)。在您的情况下,一个空矩阵意味着图像没有正确加载。您能在问题中写下您使用的是什么操作系统、IDE 和编译器吗?在 Windows 中,您必须在哪里放置图像以便可执行文件实际看到它,这有点棘手。我发现这种行为非常烦人,并且已经存在很多很多年了。如果是这种情况,请将图像放在项目的根文件夹中。我认为那是正确的。【参考方案2】:

如果你想显示你的图片,只需使用imgshow

Mat img = imread("D:/OwnResearch/photo2.jpg"); 
if(!img.data) // check if it is loaded

    cout <<  "Could not open or find the image" << std::endl ;
    return -1;


namedWindow("TestWindow", WINDOW_AUTOSIZE); // Create a window for display.
imshow("TestWindow", img); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;

For more information see the docs

【讨论】:

我能够在这种方式之前打印矩阵 img 矩阵。我只是想查看矩阵的值。当我打印矩阵的维度时,它显示为 0。我想知道为什么会这样? 我仍然在 opencvtest.exe 中的 0x0000000000000000 处收到未处理异常:您的代码出错 @kingofjong 你用的是什么编译器?您是否链接了库、包含目录等?发布您用于编译它的完整参数。 错误答案:cout a cv::Mat 是在 OpenCV 中定义的 docs.opencv.org/doc/tutorials/core/… @Dan 很有趣,从答案中删除了那部分,无论如何,OP 应该清楚他在他的问题中试图做什么

以上是关于OpenCV 未处理的异常错误的主要内容,如果未能解决你的问题,请参考以下文章

opencv3.1dnn 未处理异常

使用 Visual C++ 2008 时如何解决未处理的异常错误?

异常未处理:在 openCV 中的 cvtColor()

未处理的异常访问冲突错误

未处理的拒绝(错误):调用恢复异常

对象识别 OpenCV 中未处理的异常