OpenCV imread静默失败的原因

Reasons for OpenCV imread to silently fail?

本文关键字:失败 imread 静默 OpenCV      更新时间:2023-10-16

我是openCV和C/C++的新手。我正在学习本教程,并使用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 << "startn";
     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} )

关于为什么会出现问题,有什么见解吗?

编辑

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

首先你需要确保问题是找到图像,所以请不要跳过这部分代码:

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

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

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

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

configure_file(MyPic.jpg MyPic.jpg COPYONLY)