1.问题描述 

在配置好opencv后的第一个测试程序一般都是调用cvLoadImage()函数来读取一幅图像,但是却会遇到整个窗口都是灰色的情况。如下图所示。

                                                                           

opencv无边框显示图片 opencv不显示图像_opencv无边框显示图片


2. 问题分析

上面的图像是用如下的代码运行的结果。

#include<highgui.hpp>
#include<iostream>
using namespace cv;

int main(void)
{	
	IplImage* img = cvLoadImage("D:\Opencv Picture\Lena.jpg");//对应的路径下保存有此图片
	cvShowImage("p", img);
	waitKey();
	return 0;
}


为了解决这一问题,又用imread()函数去读取图像,并加入图像是否读取成功的判断,代码如下:

#include<highgui.hpp>
#include<iostream>
using namespace cv;

int main(void)
{	
	const char* imagename = "D:\Opencv Picture\Lena.jpg";


	//从文件中读入图像
	Mat img = imread(imagename);

	//如果读入图像失败
	if (img.empty())
	{
	std::cout << "Can not load image" << "\n";
	return -1;
	}

	//显示图像
	imshow("image", img);

	//此函数等待按键,按键盘任意键就返回
	waitKey();

	return 0;
}




运行结果如图

opencv无边框显示图片 opencv不显示图像_opencv无边框显示图片_02

显然图像并没有被读取到,那要么是图像的路径不对,要么是图像的格式不支持,对于JPG格式的图片后者显然不成立。


3. 图像的路径问题

关于路径有一点需要说明的是,在C和C++里面,输出字符串时,如果想输出一个换行,那就要加上'\n'这个标志,类似的,输出一个TAB,就加上'\t',也就是说,反斜杠("\")这个符号会把跟在它后面的字符结合起来转义成其它字符。根据这个原理,如果想输出双引号('"'),就需要输入'\"',这样才会将包含了双引号的字符串正确的写入内存中。那么如果想输入一个反斜杠呢?很简单,只要敲'\\'就可以了。

要读取图像的存放路径有如下两种情况:


a. 存放在项目的根目录下

拿VS来说,就是如下的项目的根目录下(注意是项目的根目录,也就是选中解决方案后的地址,比如解决方案“test1”的路径是.../opencv/test1/test1.sln,那么就把图片保存到.../opencv/test1/test1这个路径下),对于这种情况,可以直接用相对路径去读取图像,因为程序默认的是从项目根目录下去寻找目标。

opencv无边框显示图片 opencv不显示图像_灰色_03

可以通过如下方式访问:

const char* imagename = "Lena.jpg";//项目根目录下存放Lena.jpg图片


或者在debug文件夹同级目录下建立一个文件夹专门用来存放图片,通过如下代码访问:



const char* imagename = "Opencv Picture\\Lena.jpg";//或者const char* imagename = "Opencv Picture/Lena.jpg";


此外,也可以将图片放在和生成的可执行文件(.exe)同级的目录下,直接通过"Lena.jpg",运行.exe来访问图片。


b. 存放在项目以外的地方


这种情况下需要通过绝对地址来进行访问,如下在D盘中建有Opencv Picture的文件夹,将图片存放其中,可以通过如下方式访问


const char* imagename = "D:\\Opencv Picture\\Lena.jpg";//或者const char* imagename = "D:/Opencv Picture/Lena.jpg";