上下求索之OpenCV中imread的学习心得

CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );


/** @brief Loads a multi-page image from a file.


The function imreadmulti loads a multi-page image from the specified file into a vector of Mat objects.
@param filename Name of file to be loaded.
@param flags Flag that can take values of cv::ImreadModes, default with cv::IMREAD_ANYCOLOR.
@param mats A vector of Mat objects holding each page, if more than one.
@sa cv::imread

*/

以上是imread的声明形式,第一个参数是读入的文件名(包含地址),第二个参数是输入图像的样式,这个很重要,具体的说明在OpenCV之imread解析中已经说得很清楚了,但是这个说的还不是太“亲民”,特别是对我这样的小白来说,所以我在firebird的基础上再加点小白看得清楚,使得明白的东西吧。

通过大量数据(应该满足统计学了)的分析,在不计较图像深度的前提下,我把flags的取值分为两个层次:小层次是16个数字一组,如-1到15、16到31、32到47、48到63、64到79、80到95、96到111、112到127等等,在每组中从头依次数第1,2,3,4,6数字(以-1到15的小组为例)分别表示的是:

 

 

 

 

flags图像深度图像通道
-18位在原图基础上增加alpha通道
08位1通道
18位3通道
2如果原图是16或32位,则为跟原图一样,其他的就返回8位的1通道
48位3通道

另外以上所举的8组数据可以看成一个大组,在这个组内图像大小(边长的关系,如果严格来考量,以下的相对大小需要平方)的关系如下:

范围图像大小(相对原图)
-1到151
16到311/2
32到471/4
48到631/2
64到791/8
80到951/2
96到1111/4
112到1271/2

然后,对于其他数字就按照这个规律循环即可,比如flags=199,因为199-128=71,这个数字在64到79的范围处,所以图像是原图像的1/8。因此,在《OpenCV3编程入门》的3.1.9的例程里,由于image的已经被缩小,使得后面寻找ROI时出错(设置的起始坐标点已经超出了image的范围),作为小白的我被这个bug给搞得差点就要“OpenCV从入门到放弃了”大哭

 

另外,为了四六级都是飘过的自己查阅方便,在偷一个中文的过来,嘻嘻。

 

IMREAD_UNCHANGED:载入源图像,并添加alpha通道. (常用) 

IMREAD_GRAYSCALE:始终将图像转换为灰度图再返回(常用选项)   

IMREAD_COLOR:总是转换图像为3通道(BGR注意顺序)的彩色图像(常用选项)     

IMREAD_ANYDEPTH:如果设置了这个,且载入的图像深度为16位/32位,那么就返回相应深度的图像,否则,   转换为8位返回(常用) 

IMREAD_ANYCOLOR:如果设置了,那么就载入任意可能的颜色格式而不进行转换. (常用)


IMREAD_LOAD_GDAL :If set, use the gdal driver for loading the image.
IMREAD_REDUCED_GRAYSCALE_2:如果设置了这个,图像总是转换为单通道灰度图,且尺寸缩减为1/2  
IMREAD_REDUCED_COLOR_2:图像总是转换为彩色3通道BGR且尺寸缩减为1/2.    

IMREAD_REDUCED_GRAYSCALE_4:同上,灰度,缩减为1/4     
IMREAD_REDUCED_COLOR_4 :同上,彩色,缩减为1/4    

IMREAD_REDUCED_GRAYSCALE_8:同上,灰度,缩减为1/8     
IMREAD_REDUCED_COLOR_8:同上,彩色,缩减为1/8 

感谢:OpenCV从入门到放弃(四):HighGui组件细讲的博主

 

附上我的测试小代码吧~

 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <string>
#include <sstream>
using namespace cv;


int main()
{
	//Mat Ali = imread("E:\\document\\picture\\阿狸.jpg");
	//namedWindow("[1] 阿狸原图", WINDOW_NORMAL);
	//imshow("[1] 阿狸原图", Ali);


	//Mat AliROI = Ali(Rect(300,500,200,200));
	//imshow("AliROI", AliROI);
	//for (int i = -1; i < 32; i++)
	//{
	int i =2;
		char str[30] = "DOTA原图";
		char str0[10];
		char str1[5] = ".jpg";
		sprintf(str0, "%d", i);
		Mat image = imread("dota.jpg", i);
		strcat(str, str0);
		namedWindow(str, WINDOW_FULLSCREEN);
		imshow(str, image);
		//Mat logo = imread("dota_logo.jpg");
		strcat(str, str1);
		imwrite(str, image);
		/*namedWindow("[2] DOTA原图", WINDOW_FULLSCREEN);
		imshow("[2] DOTA原图", image);*/
	//}
	//namedWindow("[3] logo图");
	//imshow("[3] logo图", logo);




	//Mat imageROI = Ali(Rect(800, 350, logo.cols, logo.rows));
	//imshow("AliROI", imageROI);
	// //Mat imageROI = image(Range(350, 350 + logo.rows), Range(800, 800 + logo.cols));
	//addWeighted(imageROI, 0.5, logo, 0.5, 0.0, imageROI);


	//namedWindow("[4] DOTA原图 + logo 图");
	//imshow("[4] DOTA原图 + logo 图", Ali);


	//imwrite("由IMwrite生成的图.jpg", Ali);
	waitKey();
	return 0;
}

 

 

 

 

 

 

 

 
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值