OpenCV实践之路——使用imread()函数读取图片的六种正确姿势

Posted 冰不语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV实践之路——使用imread()函数读取图片的六种正确姿势相关的知识,希望对你有一定的参考价值。


本文由@星沉阁冰不语出品,转载请注明作者和出处。

文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/51375078

微博:http://weibo.com/xingchenbing 


经常看到有人在网上询问关于imread()函数读取图片失败的问题。今天心血来潮,经过实验,总结出imread()调用的四种正确姿势。

通常我要获取一张图片的绝对路径是这样做的:在图片上右键——属性——安全——对象名称。然后复制对象名称就得到了图片的绝对路径。

如图:



然而这样得到的路径直接复制粘贴到vs里面会直接报错,如下:




可以看出我们获取的绝对路径的表示方法是单右斜线形式的。显然opencv的imread()不支持这种方式。但是!!!经过实验发现imread()除了不支持单右斜线形式,其他斜线形式都支持!!!比如双右斜线形式、双左斜线形式、单左斜线形式、前述三种斜线混合型式都是支持的!!我想知道为什么??

看图,下面的六种方式任何一种都是支持的,都可以成功读取并显示图片。




我个人经常用的方法是第5种,相对路径法。只需要把图像文件放在工程文件夹下和.cpp文件放在一起就行了,读取的时候就可以直接用名字读取,如imread("miao.jpg");

最后一种命令行参数法是源码中比较常见的。设置方法是:

工程——属性——配置属性——调试——命令行参数,然后设置就行了。如图:



设置之后miao.jpg就是argv[1],2.jpg就是argv[2]。

这次的完整代码如下(路径因人而异的):

#include<opencv2\\opencv.hpp>

using namespace cv;

int main(int argc,char* argv[])

	Mat img;

	//-- 1 --双右斜线法
	//string imgpath = "C:\\\\Users\\\\bingbuyu\\\\Pictures\\\\photo\\\\miao1.jpg";
	//-- 2 --双左斜线法
	//string imgpath = "C://Users//bingbuyu//Pictures//photo//miao1.jpg";
	//-- 3 --单左斜线法
	//string imgpath = "C:/Users/bingbuyu/Pictures/photo/miao1.jpg";
	//-- 4 --以上三种混合法
	//string imgpath = "C:/Users//bingbuyu\\\\Pictures//photo//miao1.jpg";
	//-- 5 --相对路径法
	//string imgpath = "miao.jpg";
	//-- 6 --命令行参数法
	string imgpath = argv[1];

	img = imread(imgpath, 1);
	imshow("img", img);

	waitKey(0);
	return 0;

以上六种的运行结果,还是这只喵:




知识星球

除了平时发文章之外,也会发一些平时学习过程中其他的参考资料和代码,欢迎加入。





以上是关于OpenCV实践之路——使用imread()函数读取图片的六种正确姿势的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习之路(21)模板匹配及应用

opencv学习之路(36)运动物体检测

opencv学习之路(10)ROI与mask掩码

Opencv --- 我不能使用函数 imread

OpenCV:用 cv::imread 替换 ilLoadImage

在 OpenCv 中使用“cv::imread”函数读取图像的问题