OpenCV: Matrix type矩阵类型宏定义探究

7 篇文章 2 订阅

OpenCV:Matrix type矩阵类型宏定义探究

作者:Eswai (eswai@foxmail.com)


问题描述

在进行OpenCV开发时,我们经常会遇到矩阵类型转换的陷阱,例如cv::cvtColor()颜色空间转换函数只适用于8位、16位、32位图。老司机可能会知道CV_8UC3=16,CV_32FC3=21,那么这些数字到底怎么算呢?

探索宏定义

  1. 基本类型
#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_USRTYPE1 7

为了方便描述,我们设基本类型函数为Basic(x),x=8U,8S,…64F,USRTYPE1,对应函数值Basic(x)=0,1,…,6,7.
2. 辅助设定

#define CV_CN_MAX     512
#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
//                   = (1 << 3) = 8,即 1 左移3位
  1. 计算规则
#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
//                               = (8-1) = 7
#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
//                              = flags & 7
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
//                          = (depth & 7) + ((cn-1) << 3)
#define CV_MAKE_TYPE CV_MAKETYPE

我们把矩阵类型CV_(x)C(y)设为Type(x,y),有

Type(x,y)=Basic(x)&7+(y1)<<3=Basic(x)&7+8(y1)

也就是说把基本类型作为后三位,通道数作为高位
4. 常用矩阵类型总结

基本类型C1(或留空)C2C3C(n)
CV_8U08168(n-1)
CV_8S19178(n-1)+1
CV_16U210188(n-1)+2
CV_16S311198(n-1)+3
CV_32S412208(n-1)+4
CV_32F513218(n-1)+5
CV_64F614228(n-1)+6

其中C(k)表示有k个通道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值