使用imshow的OpenCV 2.0 C ++ API:返回未处理的异常和“bad-flag”

时间:2010-04-12 15:23:01

标签: visual-c++ opencv

我正在尝试在MS Visual C ++ 2008中使用新的OpenCV 2.0 API并编写了这个简单的程序:

cv::Mat img1 = cv::imread("image.jpg",1);
cv::namedWindow("My Window", CV_WINDOW_AUTOSIZE);
cv::imshow("My Window", img1);

Visual Studio返回未处理的异常,控制台返回:

OpenCV Error: bad flag (parameter or structure field) 
(Unrecognized or unsupported array type) in unknown function, 
file ..\..\..\..\ocv\opencv\src\cxcore\cxarray.cpp, line 2376

不显示图像。此外,窗口“我的窗口”有一个奇怪的标题:“我的窗口”,这不依赖于名称。

使用cvLoadImage,cvNamedWindow或cvShowImage等命令的“旧”C API对同一图像文件没有任何问题。我尝试了很多不同的东西而没有成功。

我感谢你们的任何帮助。

康拉德

6 个答案:

答案 0 :(得分:6)

正如我刚才所说,imread也不适用于我。一个小小的谷歌搜索显示其他人有同样的问题;我想这是库代码中的一个错误。现在,这是一个hacky解决方法:

IplImage* img = cvLoadImage("lena.jpg");
cv::Mat lena(img);
cvReleaseImage(&img);

这样,您至少可以使用C ++ API来完成剩下的工作。

答案 1 :(得分:6)

这个问题有帮助。

解决方案是,链接器中通常提出的opencv库文件无法正常工作。而是尝试使用调试库文件:

在Visual C ++中:

转到Project->属性(或Alt-F7) 配置属性 - >链接器 - >输入 - >附加依赖性

取代平常 “cv210.lib cxcore210.lib highgui210.lib”by “cv210d.lib cxcore210d.lib highgui210d.lib” - 这是调试库。

OpenCv 2.0 API命令现在可以正常工作。

答案 2 :(得分:3)

我遇到了上述相同的问题,原因是链接器的设置造成的。

我在另一个帖子中找到答案, OpenCV 2.3 and Visual Studio 2010

在此重复一遍:

  

项目的属性(右键单击它)

     
      
  • C / C ++
  •   
    •   
    • 一般
    •   
  •   
    •   
      •   
      • 包含目录添加 <您的目录> \ OpenCV2.3 \ include \ opencv2, <您的目录> \ OpenCV2.3 \ include \ opencv和 <您的目录> \ OpenCV2.3 \ include
      •   
    •   
  •   
  • 链接器

  •   
    •   
    • 一般
    •   
  •   
    •   
      •   
      • 列表项
      •   
    •   
  •   
    •   
    • 输入
    •   
  •   
    •   
      •   
      • 添加所有libs,例如opencv_core230d.lib opencv_highgui230d.lib等......
      •   
    •   
  •   

完成上述操作后,我可以无缝运行imshowimread +所有其他cpp函数! OP的问题可能已经解决了,但希望这对于在这里寻找相同解决方案的其他人有用。

答案 3 :(得分:2)

首先,您最好编译自己的OpenCV版本。

我在构建时遇到了同样的错误(我从 Sourceforge 获得),并通过在调试和发布版本中编译我自己的版本来解决。

并确保将原始系统env变量PATH更改为新的构建文件夹build/bin,然后您可以在调试模式下构建并运行imshow()

答案 4 :(得分:2)

您确定从/home/...开始添加整个路径。我遇到了和你一样的问题但是当我添加整个路径时,事情就会很顺利。尽管包含文件中存在路径,但必须添加整个路径。

openCV中的

imread与Matlab不同,当找不到文件/文件夹时,它不返回错误 - 而是返回一个空矩阵,而后者在imshow期间反映为错误。 此外,imread不会在包含的文件夹或工作区中查找图像文件。因此,尽可能指定整个路径。

请注意这一点以备将来参考。

答案 5 :(得分:0)

我相信这可能与unicode有关。

尝试使用宏_TEXT()

例如:

cv::Mat img1 = cv::imread(_TEXT("image.jpg"),1);

Unicode in Visual C++ 2