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;
}