【问题标题】:How can I fix "Exception Thrown" error in OpenCV?如何修复 OpenCV 中的“抛出异常”错误?
【发布时间】:2019-11-13 08:30:23
【问题描述】:

我在 Visual Studio 2017 中编译 OpenCV 程序时遇到错误。当我使用函数 imwrite 保存灰度图像时发生错误。您可以在此处查看屏幕截图

我尝试将文件 opencv_world320.dll 复制到我的目录项目中,但仍然不行。

这是代码:

#include <opencv2/opencv.hpp>
#include <opencv/highgui.h>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argv, char** argc)
{
   Mat img_original = imread("lisa.jpg",CV_LOAD_IMAGE_UNCHANGED);
   Mat img_grayscale = imread("lisa.jpg", CV_LOAD_IMAGE_GRAYSCALE);

   imshow("Lisa-Original", img_original);
   imshow("Lisa-Grayscale", img_grayscale);

   imwrite("LisaGray.jpg", img_grayscale);
   waitKey(0);
   return 0;
}

这是个例外:

在 0x00007FFC7D9B86C2 (opencv_world320.dll) 处抛出异常 1_open_image_lisa.exe: 0xC0000005: 访问冲突读取位置 0x000001926A40F000。发生了

【问题讨论】:

  • 我的第一个猜测是,由于您使用相对路径进行输入,因此您实际上并没有阅读图像。所以通过检查图像是否有数据来检查读取是否成功: if(img_original.empty()) return -1; //或者如果你没有得到图像,你可能想做的任何事情
  • 谢谢,读取图片成功。我刚刚遇到错误行代码 imwrite("LisaGray.jpg", img_grayscale) 保存图像。然后我检查我的项目文件夹,这个图像是创建的,但它的大小是 0kb 并且无法打开。
  • 我注意到你混合了旧的 c 和 c++ api,尝试包含 highgui.hpp:#include

标签: c++ image visual-studio opencv exception


【解决方案1】:

代码本身没有错,即使 imread 不成功,imwrite 也不会抛出。 (虽然,写入 jpg 文件的空 cv::Mat 会创建空文件,这些文件不会被识别为有效的图像文件)。

因此,要查明您的确切问题,请使用 try/catch 机制:

try {
    imshow("Lisa-Original", img_original);
    imshow("Lisa-Grayscale", img_grayscale);

    imwrite("LisaGray.jpg", img_grayscale);
}
catch(cv::Exception& e) {
    std::cout << e.msg << std::endl;
}

在我的电脑上,当imwrite由于格式而失败时,消息是:

OpenCV(4.0.0) D:\Dev\Opencv4\opencv-4.0.0\opencv-4.0.0\modules\imgcodecs\src\loadsave.cpp:661: error: (-2:Unspecified error) could not find a writer for the specified extension in function 'cv::imwrite_'

在这种情况下,请尝试使用其他格式来保存图片,和/或检查是否使用正确的选项和库编译了 opencv。

【讨论】:

  • catch 实际上不会捕获 访问冲突
  • Arf,确实是的。
  • 这个建议还是不错的,但是这个特殊的问题是由别的东西引起的,不会用 try/catch 解决
  • 还是不行。它显示相同的错误消息。在 1_open_image_lisa.exe 中的 0x00007FFB753786C2 (opencv_world320.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x000001A8226D4000。发生
  • @HoàngĐức 你有没有尝试我的建议:不要混合 c 和 c++ api? //通常这不应该是一个问题,但它可能是一些破坏兼容性的错误
【解决方案2】:

这也发生在我的身上。运行 C++ 代码时,您可以使用“发布”配置而不是“调试”配置。它对我有用,但不知道为什么!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2021-04-14
    相关资源
    最近更新 更多