1.问题描述
在配置好opencv后的第一个测试程序一般都是调用cvLoadImage()函数来读取一幅图像,但是却会遇到整个窗口都是灰色的情况。如下图所示。
2. 问题分析
上面的图像是用如下的代码运行的结果。
#include
#include
using namespace cv;
int main(void)
{
IplImage* img = cvLoadImage("D:\Opencv Picture\Lena.jpg");//对应的路径下保存有此图片
cvShowImage("p", img);
waitKey();
return 0;
}
为了解决这一问题,又用imread()函数去读取图像,并加入图像是否读取成功的判断,代码如下:
#include
#include
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;
}
显然图像并没有被读取到,那要么是图像的路径不对,要么是图像的格式不支持,对于JPG格式的图片后者显然不成立。
3. 图像的路径问题
关于路径有一点需要说明的是,在C和C++里面,输出字符串时,如果想输出一个换行,那就要加上'\n'这个标志,类似的,输出一个TAB,就加上'\t',也就是说,反斜杠("\")这个符号会把跟在它后面的字符结合起来转义成其它字符。根据这个原理,如果想输出双引号('"'),就需要输入'\"',这样才会将包含了双引号的字符串正确的写入内存中。那么如果想输入一个反斜杠呢?很简单,只要敲'\\'就可以了。(关于为什么斜杠和反斜杠都可以的用来表示路径,可以点 这里为什么Windows 系统中用反斜杠表示路径,而C语言教材中都是用斜杠表示头文件的路径?)
要读取图像的存放路径有如下两种情况:
a. 存放在项目的根目录下
拿VS来说,就是如下的项目的根目录下(注意是项目的根目录,也就是选中解决方案后的地址,比如解决方案“test1”的路径是.../opencv/test1/test1.sln,那么就把图片保存到.../opencv/test1/test1这个路径下),对于这种情况,可以直接用相对路径去读取图像,因为程序默认的是从项目根目录下去寻找目标。
可以通过如下方式访问:
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";