博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV中矩阵类型的个人理解
阅读量:5918 次
发布时间:2019-06-19

本文共 2771 字,大约阅读时间需要 9 分钟。

hot3.png

在应用OpeCV函数库的时候经常需要查看图像的类型(也就是矩阵的类型,因为在OpenCV中图像是以Mat保存的),如果直接打印image.type,如:

image=imread("lina.jpg");cout<
<

会发现,打印出来的是数字,而不是我们在OpenCV中常见的CV_8UC3等类型。看起来很不方便和直观。原来CV_8UC3等内置类型是OpenCV定义的宏,它们都是int型。同样地,image.type()返回的也是int类型。

我们需要的是找到它是怎样定义该宏的。

OpenCV的core文件夹下types_c.h中含有对矩阵类型的宏定义。 

/****************************************************************************************\*                                  Matrix type (CvMat)                                   *\****************************************************************************************/#define CV_CN_MAX     512#define CV_CN_SHIFT   3#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)#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#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))#define CV_MAKE_TYPE CV_MAKETYPE#define CV_8UC1 CV_MAKETYPE(CV_8U,1)#define CV_8UC2 CV_MAKETYPE(CV_8U,2)#define CV_8UC3 CV_MAKETYPE(CV_8U,3)#define CV_8UC4 CV_MAKETYPE(CV_8U,4)#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))#define CV_8SC1 CV_MAKETYPE(CV_8S,1)#define CV_8SC2 CV_MAKETYPE(CV_8S,2)#define CV_8SC3 CV_MAKETYPE(CV_8S,3)#define CV_8SC4 CV_MAKETYPE(CV_8S,4)#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))#define CV_16UC1 CV_MAKETYPE(CV_16U,1)#define CV_16UC2 CV_MAKETYPE(CV_16U,2)#define CV_16UC3 CV_MAKETYPE(CV_16U,3)#define CV_16UC4 CV_MAKETYPE(CV_16U,4)#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))#define CV_16SC1 CV_MAKETYPE(CV_16S,1)#define CV_16SC2 CV_MAKETYPE(CV_16S,2)#define CV_16SC3 CV_MAKETYPE(CV_16S,3)#define CV_16SC4 CV_MAKETYPE(CV_16S,4)#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))#define CV_32SC1 CV_MAKETYPE(CV_32S,1)#define CV_32SC2 CV_MAKETYPE(CV_32S,2)#define CV_32SC3 CV_MAKETYPE(CV_32S,3)#define CV_32SC4 CV_MAKETYPE(CV_32S,4)#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))#define CV_32FC1 CV_MAKETYPE(CV_32F,1)#define CV_32FC2 CV_MAKETYPE(CV_32F,2)#define CV_32FC3 CV_MAKETYPE(CV_32F,3)#define CV_32FC4 CV_MAKETYPE(CV_32F,4)#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))#define CV_64FC1 CV_MAKETYPE(CV_64F,1)#define CV_64FC2 CV_MAKETYPE(CV_64F,2)#define CV_64FC3 CV_MAKETYPE(CV_64F,3)#define CV_64FC4 CV_MAKETYPE(CV_64F,4)#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))

通过上面的源代码,我们发现OpenCV对depth的定义已经一目了然,分别是从0到7。由于type是由depth和channels组成的,OpenCV通过CV_MAKETYPE(depth, cn)来实现宏定义。上面代码中有CV_MAKETYPE的定义过程,也是用宏来实现的,为了便于理解,我重新把他写成了函数形式。

#include 
using namespace std;#define CV_CN_SHIFT 3int DepthMax()          //数字1向左移3位,16进制的低8位为:00001000{    return (1<

程序运行结果:

原理:因为depth用三位就可以表示,作为低三位;通道cn最大值为512,把cn作为高9位,生成可达12位的type,例如CV_16UC2。

 

转载于:https://my.oschina.net/u/923087/blog/279315

你可能感兴趣的文章
VueJS 开发常见问题集锦
查看>>
2019年,ECS开发者招募啦!
查看>>
Linux基础命令---ifconfig
查看>>
java B2B2C Springboot电子商务平台源码-Feign设计原理
查看>>
程序员啊,他又加班了
查看>>
Link Develop平台之初体验
查看>>
大数据已成为人工智能的助推力
查看>>
什么是阿里云服务器【针对新手用户的详细解答】
查看>>
Angular 部署生产
查看>>
3.3 自定义控件基础 之 View的绘制
查看>>
揭秘“菲住布渴”中运用的黑科技:除了check in、坐电梯、开门...全部刷脸之外,还有什么?...
查看>>
如何使用python分析CPU使用情况? 大概是这样吧
查看>>
如何评估深度学习模型效果?阿里工程师这么做
查看>>
3月8日云栖精选夜读 | 阿里云:5G时代云边端将三体协同,边缘计算也将成为基础设施...
查看>>
如何构建一个器学习项目来找到工作?
查看>>
阿里面试题BIO和NIO数量问题附答案和代码
查看>>
Flask 教程 第三章:Web表单
查看>>
4月数据库排行:MySQL 得分强劲,PG 稳步前进
查看>>
windows与unix思想
查看>>
离线批量数据通道Tunnel的最佳实践及常见问题
查看>>