上下求索之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 图像深度 图像通道
-1 8位 在原图基础上增加alpha通道
0 8位 1通道
1 8位 3通道
2 如果原图是16或32位,则为跟原图一样,其他的就返回8位的 1通道
4 8位 3通道
另外以上所举的8组数据可以看成一个大组,在这个组内图像大小(变长的关系,如果严格来考量,以下的相对大小需要平方)的关系如下:
范围 图像大小(相对原图)
-1到15 1
16到31 1/2
32到47 1/4
48到63 1/2
64到79 1/8
80到95 1/2
96到111 1/4
112到127 1/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;
}







 

猜你喜欢

转载自blog.csdn.net/ruibin_cao/article/details/80312799