opencv type类型计算

/** 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

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值