最近在使用OpenCV中的imread函数时,对该函数的第二个参数flags的使用心存疑虑,不太明白其使用方法,因此对其做了一些
研究。
首先,看一下它的定义,该函数位于Highgui.h和Loadsave.cpp文件中。
Mat imread( const string& filename, int flags )
{
Mat img;
imread_( filename, flags, LOAD_MAT, &img );
return img;
}
接下来看一下imread_函数中关于flags的部分 int type = decoder->type();
if( flags != -1 )
{
if( (flags & CV_LOAD_IMAGE_ANYDEPTH) == 0 )
type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type));
if( (flags & CV_LOAD_IMAGE_COLOR) != 0 ||
((flags & CV_LOAD_IMAGE_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1) )
type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3);
else
type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1);
}
其中,CV_LOAD_IMAGE_XXX定义位于Highgui_c.h文件中
enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-1,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =0,
/* ?, color */
CV_LOAD_IMAGE_COLOR =1,
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =2,
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =4
};
由此,我们可以得出如下结论:
flags = -1:imread按解码得到的方式读入图像
flags = 0:imread按单通道的方式读入图像,即灰白图像
flags = 1:imread按三通道方式读入图像,即彩色图像