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 << img << 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(...))
生成图像,其中X和Y是图像的尺寸,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 未处理的异常错误的主要内容,如果未能解决你的问题,请参考以下文章