【问题标题】:Reasons for OpenCV imread to silently fail?OpenCV imread 静默失败的原因?
【发布时间】: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,看看是否能解决任何问题。

【问题讨论】:

标签: c++ opencv


【解决方案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)

【讨论】:

  • 很高兴知道未来的情况,到目前为止,无论如何我都将二进制文件放在同一个文件夹中,但我可能会在更大的项目中错过这个细节。话虽如此,问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2014-06-05
  • 2017-01-10
相关资源
最近更新 更多