/** Opencv 中 Mat.type(),返回的是一个int类型的数值
* 在opencv算法实现过程中存在大量的类型转换,往往涉及到type判定。而且cv::imshow(),默认以
* 3通道BGR格式读取图像,就算原图像是gray类型的jpg,tif图像,这就容易产生类型转换错误 **/
/**********************************************************************************************************
opencv Mat.type()由两部分组成,depth和channels,type=f(deth,channels);
depth是图像深度,表示每一个图像像素在内存中占的位数,有8种:
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_16F 7
channels 常用的就是灰度(1通道),彩色(3通道)
type定义如下
#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT) //CV_DEPTH_MAX =8
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1) //CV_MAT_DEPTH_MASK=7
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK ) //CV_MAT_DEPTH(flags)=flags&00000111
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT ))
//最后可得type=CV_MAKETYPE(depth,cn)=(depth&00000111)+((cn)-1) *8
各类型type计算可得:
CV_8UC1 = 0
CV_8UC3 = 16
CV_8SC1 = 1
CV_8SC3 = 17
CV_16UC1 = 2
CV_16UC3 = 18
CV_16SC1 = 3
CV_16SC3 = 19
CV_32SC1 = 4
CV_32SC3 = 20
CV_32FC1 = 5
CV_32FC3 = 21
CV_64FC1 = 6
CV_64FC3 = 22
CV_16FC1 = 7
CV_16FC3 = 23
由此可见1通道的type数值按照深度大小从0-7,3通道16-23.
/**********************************************************************************************************
常见类型判断有
if(traits::Type<_Tp>::value==m.type()) //m为输入图像
/....../
else(traits::Type<_Tp>::depth==m.depth())
/....../
else
cerr(...);
解析:
上面的traits是opencv创建的一个专门用于进行类型判断的命名空间,定义在traits.hpp中
example:_Tp=float //float类型判断
template<> class DataType<float>
{
public:
typedef float value_type;
typedef value_type work_type;
typedef value_type channel_type;
typedef value_type vec_type;
enum { generic_type = 0,
depth = CV_32F,
channels = 1,
fmt = (int)'f',
type = CV_MAKETYPE(depth, channels)
};
};
//定义Depth和Type
struct Depth
{ enum { value = DataType<T>::depth }; };
template<typename T>
struct Type
{ enum { value = DataType<T>::type }; };
由上可知:
traits::Type<flaoat>::value=CV_MAKETYPE(CV_32F,1)=5
traits::Type<flaoat>::depth=CV_32F