【问题标题】:Exception when showing an Image with OpenCV使用 OpenCV 显示图像时出现异常
【发布时间】:2019-07-18 17:56:23
【问题描述】:

我尝试使用 OpenCV 函数“imshow()”显示图像。

 cv::Mat im = cv::imread("/home/franek/Schreibtisch/image.jpg",cv::IMREAD_GRAYSCALE);
 cv::imshow("original", im);

现在它告诉我:

OpenCV 错误:cvtColor 中的断言失败 (scn == 3 || scn == 4),文件 /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp,行9716 在抛出 'cv::Exception' 的实例后调用终止 什么():/build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp:9716:错误:(-215)scn == 3 ||函数 cvtColor 中的 scn == 4

当我将cv::IMREAD_GRAYSCALE 替换为cv::IMREAD_COLOR 时,图片显示并且一切正常。但我需要一张灰度图。

编辑:整个代码:

cv::namedWindow("original", cv::WINDOW_GUI_EXPANDED);
  cv::namedWindow("grayScale", cv::WINDOW_GUI_EXPANDED);
  cv::namedWindow("cornerImage", cv::WINDOW_GUI_EXPANDED);
  cv::startWindowThread();

  cv::Mat im = cv::imread("/home/franek/Schreibtisch/image.jpg", cv::IMREAD_COLOR);
  cv::imshow("original", im);
  cv::waitKey(0);
  cv::Mat img = cv::imread("/home/franek/Schreibtisch/image.jpg", cv::IMREAD_GRAYSCALE);
  cv::imshow("grayScale", img);
  cv::waitKey(0);

编辑编辑: 与ldd 我发现了依赖关系:

libopencv_imgcodecs.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2 (0x00007f2ba95d0000) libopencv_imgproc.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2 (0x00007f2ba8d77000) libopencv_core.so.3.2 => /usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2 (0x00007f2ba893c000) libopencv_highgui.so.4.1 => /usr/local/lib/libopencv_highgui.so.4.1 (0x00007f2ba8724000) libopencv_imgcodecs.so.4.1 => /usr/local/lib/libopencv_imgcodecs.so.4.1 (0x00007f2ba7e72000) libopencv_imgproc.so.4.1 => /usr/local/lib/libopencv_imgproc.so.4.1 (0x00007f2ba557e000) libopencv_core.so.4.1 => /usr/local/lib/libopencv_core.so.4.1 (0x00007f2ba429b000)

这是解决方案吗? core和highui不是同一个版本...

【问题讨论】:

  • 您需要提取并提供minimal reproducible example,否则您的问题将是题外话。无论如何,使用调试器获取回溯并检查程序状态以深入了解问题。
  • 错误消息说你的错误是使用cv::cvtColor()而不是cv::imshow()。请贴出相关代码。
  • @ShawnMathew 我知道,错误来自cv::cvtColor()。 @UlrichEckhardt StackTrace 显示,函数 cv:cvtColor() 在内部调用了一些函数,并且在 TraceEnd 上有对 cv::cvtColor() 的调用。我发现,异常说“嘿,你想将 RGB 转换为灰度,但你的输入图像只有一个通道”,但我不知道,为什么 imShow() 想要转换图像。
  • @Franek 是您的应用程序中与im 相关的仅有的两行代码吗?如果在阅读框架和显示框架之间有什么问题,请发布。
  • @ShawnMathew,不,上面只有一行,创建 Imview。

标签: c++ opencv imshow


【解决方案1】:

我找到了解决方案, 问题是,我的代码依赖于来自< <cv_bridge/cv_bridge.h> 的另一个函数,这是一个 ROS 特定的库。 这个库使用 Opencv 2.3。我开始使用 fork,有人将这个库移植到 OpenCV 4 here。现在整个事情都很好了!

【讨论】:

    【解决方案2】:

    如果你打算用正确的设置编译opencv,你可以解决你的问题:

    git clone https://github.com/opencv/opencv.git
    git clone https://github.com/opencv/opencv_contrib.git
    cd opencv
    mkdir build
    cd build/
    cmake -D CMAKE_BUILD_TYPE=DEBUG -D CMAKE_INSTALL_PREFIX=/opt/opencv -D \ WITH_V4L=ON BUILD_EXAMPLES=ON -D WITH_OPENGL=ON -D \ OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
    make -j4
    

    sudo 安装

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多