OpenCV imread 静默失败的原因?

Posted

技术标签:

【中文标题】OpenCV imread 静默失败的原因?【英文标题】:Reasons for OpenCV imread to silently fail? 【发布时间】:2016-01-08 19:37:09 【问题描述】:

我是 openCV 和一般 C/C++ 的新手。我正在编写 this 教程并使用 CMake 生成我的 makefile。我构建第一个程序(读取和显示)没有问题,但是当我运行可执行文件时,什么也没有发生,我必须关闭我的终端,因为它只是挂起。即使我只使用以下代码也会发生这种情况:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, const char** argv )

     cout << "start\n";
     Mat img = imread("MyPic.jpg");
     return 0;

当我删除Mat img 行时,会输出“start”,但是当我包含它时,即使这样也不会发生。 MyPic.jpg 肯定与 ReadDisplay.cpp 和 CMakeLists.txt 位于同一目录中。我正在运行 Ubuntu 14.04。最后,这里是 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project( ReadDisplay )
find_package( OpenCV REQUIRED )
include_directories( $OpenCV_INCLUDE_DIRS )
add_executable( ReadDisplay ReadDisplay.cpp )
target_link_libraries( ReadDisplay $OpenCV_LIBS )

关于为什么这会导致问题的任何见解?

编辑

上面的代码是为了解释我是如何调试的以及是什么导致了问题;我已经尝试通过检查图像大小和其他方法将其隔离为系统/配置问题来捕获故障。根据this 的帖子,我正在从源代码重建openCV,看看是否能解决任何问题。

【问题讨论】:

你用其他图片试过了吗? 你能不能换成 cout OpenCV Error: Assertion failed (size.width>0 && size.height>0) simple code的可能重复 用另一张图片尝试过,在cout 行中添加了&lt;&lt; endl,我几乎可以肯定,这不是图片是空的,而是试图用不同的库,看看它是否只是某种访问或其他系统问题。 【参考方案1】:

首先你需要确定问题出在图片上,所以请不要跳过这部分代码:

if (img.empty()) //check whether the image is loaded or not
  
      cout << "Error : Image cannot be loaded..!!" << endl;
      //system("pause"); //wait for a key press
      return -1;
  

因此,如果问题在于查找图像,为避免混淆,您可以传递绝对路径,例如:/home/user/my_pic.jpg

【讨论】:

即使使用完整路径名,甚至是不存在的图像路径,也会以同样的方式失败。 您是否添加了我建议的代码?它输出错误吗? 是的,我用那个代码试过了,没有输出错误 更重要的是,代码所做的唯一可见的事情就是输出“start\n”。所以请在 Mat img = imread("MyPic.jpg"); 之后设置一个 getchar() 或 system("pause");并重新编译您的代码。我想你会看到开始输出,但显然你不会看到任何图像。 很好的调试技巧,谢谢!这很奇怪:如果我将system("pause") 放在Mat img = imread("MyPic.jpg"); 之后,不仅不会输出“开始”,如果我将它紧跟在cout 行之后,它甚至都不会输出。但是,如果我评论除 cout 行之外的所有内容,我会得到输出。【参考方案2】:

不是完整的答案,这只是一个注释。

“MyPic.jpg”需要在您的二进制/程序运行的同一目录中,与编译时的实现文件(.cpp)无关。

要让 cmake 自动将文件从源目录复制到构建目录,请将以下内容添加到 CMakeLists.txt:

configure_file(MyPic.jpg MyPic.jpg COPYONLY)

【讨论】:

很高兴知道未来的情况,到目前为止,无论如何我都将二进制文件放在同一个文件夹中,但我可能会在更大的项目中错过这个细节。话虽如此,问题仍然存在。

以上是关于OpenCV imread 静默失败的原因?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV imread读取图片失败

当我们混合 opencv 和 dlib 时,cv::imread() 在 c++ 项目中失败

opencv imread和imwrite

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败

OpenCV4.5.2 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo, imread失败