OpenCV的cvLoadImage()函数在Visual Studio调试器中无法加载图像?

6

我想尝试写一个OpenCV的简单hello world程序,但是不知道为什么它不能正常工作。

当我编译并运行以下代码时:

#include <cv.h>
#include <highgui.h> 
int main(int argc, char* argv[])
{
 IplImage* img = cvLoadImage( "myjpeg.jpg" );
 cvNamedWindow( "MyJPG", CV_WINDOW_AUTOSIZE );
 cvShowImage("MyJPG", img);
 cvWaitKey(0);
 cvReleaseImage( &img );
 cvDestroyWindow( "MyJPG" );
 return 0;
}

我得到了一个大约200x200的灰色框,而不是所指定的.jpg文件。 如果我使用不同的jpg,我会得到同样类型的窗口,如果我放入一个无效的文件名,则会得到非常小的窗口(预期)。
我正在使用Windows 7 Professional下的Visual Studio 2008。
大多数示例程序似乎都能正常工作,因此我对于代码如何正常加载示例jpg但在上面的代码中却无法正常工作感到困惑(甚至尝试了示例jpeg)。
更新
编译产生的可执行文件可以正常工作,但是Visual Studio 2008调试器每次尝试运行调试器时都会将空指针加载到img中 - 无论文件位置是否隐式或显式。

1
你使用哪个平台编译程序? 您可以检查图像是否已加载吗?if(img == NULL) { std :: cout <<“有问题”<< std :: endl; } - midtiby
更多的测试表明,只要OpenCV .dll文件存在于同一目录中,可执行文件在Visual Studio环境之外运行良好,但是,在调试环境下运行时,cvLoadImage()被调用后img确实是一个空指针。 - Nerf42
问题可能是您的程序没有在图像文件所在的相同目录中执行。(这是一个问题,因为您使用了相对路径) - midtiby
这似乎是与调试器相关的问题。我已经用显式路径替换了相对路径,但在 cvLoadImage() 之后 img 变量仍然返回一个空指针,但在独立运行时可执行文件正常运行(图像被显示),并且局部文件已被正确加载。 - Nerf42
你使用的OpenCV版本是哪个? - Jacob
OpenCV2.0 是正在使用的版本。 - Nerf42
4个回答

8
似乎路径到myjpeg.jpg有问题,因为在调试器下运行时当前目录可能不同。
默认情况下,Visual Studio调试器使用包含.vcproj文件的目录作为当前目录,但您可以在项目属性(调试 -> 工作目录)中更改它。
您是否百分之百确定正确传递了绝对路径?尝试将相同的路径传递给fopen,看看它是否也返回NULL。如果是,则路径不正确。
如果您想要准确地查看库正在尝试打开的文件,可以使用Project Monitor,并过滤myjpeg.jpg

那个做到了。.jpg文件在调试目录中与可执行文件放在一起,而不是与vcproj文件放在项目目录中。我不知道为什么显式的路径声明不起作用,我猜可能是我没有正确传递显式路径。非常感谢大家! - Nerf42
@Catalin_lacob 我需要你的帮助。我尝试了你说的方法。fopen没有返回NULL,cvLoadImage也没有,但是cvShowImage显示了一个灰色的框...... - John Demetriou
没关系,找到了。因为我没有在后面加上waitkey和cvrelease,所以它不起作用,不知道为什么。 - John Demetriou

1
你使用的OpenCV版本是哪个?我已经在最新版本(OpenCV2.0)上尝试了你的代码,它可以正常工作。你可以从这里下载OpenCV2.0。
如果你想要最新的构建版本,你可以从这里使用SVN检查它。

如果是这样,你应该考虑使用Mat类和imread函数 - 新的C++接口要好得多 :) - Jacob

0

我遇到了同样的问题。调试版本无法加载图像,但当我将其编译并链接为发布版本时,它可以正常工作。希望这可以帮到你。


0
尝试将HAVE_JPEG添加到预处理器定义中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接