C++ 使用OpenCV显示图像时出现异常

C++ 使用OpenCV显示图像时出现异常,c++,opencv,imshow,C++,Opencv,Imshow,我尝试使用OpenCV函数“imshow()”显示图像 现在它告诉我: OpenCV错误:cvtColor文件/build/OpenCV-L2vuMj/OpenCV-3.2.0+dfsg/modules/imgproc/src/color.cpp第9716行中的断言失败(scn==3 | | scn==4) 在引发“cv::Exception”的实例后调用terminate what():/build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc

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

现在它告诉我:

OpenCV错误:cvtColor文件/build/OpenCV-L2vuMj/OpenCV-3.2.0+dfsg/modules/imgproc/src/color.cpp第9716行中的断言失败(scn==3 | | scn==4) 在引发“cv::Exception”的实例后调用terminate what():/build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/color.cpp:9716:函数cvtColor中的错误:(-215)scn==3 | | scn==4

当我用
cv::IMREAD_COLOR
替换
cv::IMREAD_GRAYSCALE
时,会显示图片,一切正常。但我需要灰度图像

编辑:整个代码:

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的版本不一样…

我找到了解决方案, 问题是,我的代码依赖于另一个函数,这是一个特定的库。
这个库使用Opencv 2.3。我开始使用fork,有人将这个lib移植到opencv4。现在整个事情都很顺利

如果要使用正确的设置编译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 make install

您需要提取并提供一个,如果没有这个,您的问题就离题了。无论如何,请使用调试器获取回溯并检查程序状态,以了解问题。错误消息表示您的错误是在使用
cv::cvtColor()
而不是
cv::imshow()时发生的。请发布相关代码。@Shawn我知道,错误来自
cv::cvtColor()
@UlrichEckhardt堆栈跟踪显示,函数
cv:cvtColor()
在内部调用一些函数,并且在跟踪上有对
cv::cvtColor()
的调用。我发现,例外情况是“嘿,你想用RGB把东西转换成灰度,但是你的inputimage只有一个通道”,但我不知道,为什么
imShow()
要转换图像。@Franek你的应用程序中只有这两行代码与
im
有关吗?如果在读取帧和显示帧之间有任何区别,请将其发布。@ShawnMathew,不,上面只有一行是创建Imview的地方。
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