opencv-flag
http://blog.csdn.net/yiyuehuan/article/details/43701797
在Mat类中定义了这样一个成员变量:
- /*! includes several bit-fields:
- - the magic signature
- - continuity flag
- - depth
- - number of channels
- */
- int flags;
从flags的注释来看,这个变量应该是用来作为标志的。主要包含magic signature、submat flag、continuity flag、number of channels、depth。
从定义可以看出flags是int类型,共占32位,结合上图可以看出各位所代表的意思。
从低位到高位:
0-2位代表depth即数据类型(如CV_8U),OpenCV的数据类型共7类,故只需3位即可全部表示。
3-11位代表通道数channels,因为OpenCV默认最大通道数为512,故只需要9位即可全部表示,可参照下面求通道数的部分。
0-11位共同代表type即通道数和数据类型(如CV_8UC3)
12-13位暂没发现用处,也许是留着后用,待发现了再补上。
14位代表Mat的内存是否连续,一般由creat创建的mat均是连续的,如果是连续,将加快对数据的访问。
15位代表该Mat是否为某一个Mat的submatrix,一般通过ROI以及row()、col()、rowRange()、colRange()等得到的mat均为submatrix。
16-31代表magic signature,暂理解为用来区分Mat的类型,如果Mat和SparseMat
上面对flags中的信息作了剖析,接下来看获取这些信息的函数或方法:
获得depth:
- inline int Mat::depth() const { return CV_MAT_DEPTH(flags); }
可以看出获取depth,实际是通过宏定义CV_MAT_DEPTH来实现的,该宏定义实际上就是取flags的0-2位来计算depth的。看看与这个宏定义相关的内容:
- #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)
获取channels:
- inline int Mat::channels() const { return CV_MAT_CN(flags); }
可以看出获取channels也是宏定义来实现,该宏定义为CV_MAT_CN,作用是取flags的3-11位,然后计算通道数。相关内容:
- #define CV_CN_MAX 512
- #define CV_MAT_CN_MASK ((CV_CN_MAX - 1) << CV_CN_SHIFT)
- #define CV_MAT_CN(flags) ((((flags) & CV_MAT_CN_MASK) >> CV_CN_SHIFT) + 1)
CV_CN_MAX - 1将通道的可能值变为[0,511],这样就能够用9位来表示所有的可能值。左移CV_CN_SHIFT(=3)位,是为了在&运算时排除depth所在位的影响。
获取type:
- inline int Mat::type() const { return CV_MAT_TYPE(flags); }
计算type用到了宏定义CV_MAT_TYPE,相关内容:
- #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
- #define CV_MAKE_TYPE CV_MAKETYPE
- // 具体类型太多,不一一列出了
- #define CV_MAT_TYPE_MASK (CV_DEPTH_MAX*CV_CN_MAX - 1)
- #define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK)
是否Continuous:
- inline bool Mat::isContinuous() const { return (flags & CONTINUOUS_FLAG) != ; }
也可以通过宏定义来实现:
- #define CV_MAT_CONT_FLAG (1 << CV_MAT_CONT_FLAG_SHIFT)
- #define CV_IS_MAT_CONT(flags) ((flags) & CV_MAT_CONT_FLAG)
- #define CV_IS_CONT_MAT CV_IS_MAT_CONT
是否submatrix:
- inline bool Mat::isSubmatrix() const { return (flags & SUBMATRIX_FLAG) != ; }
对应的宏定义:
- #define CV_SUBMAT_FLAG_SHIFT 15
- #define CV_SUBMAT_FLAG (1 << CV_SUBMAT_FLAG_SHIFT)
- #define CV_IS_SUBMAT(flags) ((flags) & CV_MAT_SUBMAT_FLAG)
上面主要是分析了flags所代表的意思,以及与其相关的一些成员变量或成员函数的求值和实现。
opencv-flag的更多相关文章
- OpenCV 学习笔记 07 支持向量机SVM(flag)
1 SVM 基本概念 本章节主要从文字层面来概括性理解 SVM. 支持向量机(support vector machine,简SVM)是二类分类模型. 在机器学习中,它在分类与回归分析中分析数据的监督 ...
- Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决
前提: 1.安装Android Studio(过程略) 2.官网下载OpenCV for Android 网址:http:opencv.org/downloads.html 我下载的是下图的版本 3. ...
- OpenCV图像的全局阈值二值化函数(OTSU)
cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最 ...
- OpenCv Mat操作总结
Author:: Maddock Date: 2015-03-23 16:33:49 转载请注明出处:http://blog.csdn.net/adong76/article/details/4053 ...
- 使用OpenCV&&C++进行模板匹配.
一:课程介绍 1.1:学习目标 学会用imread载入图像,和imshow输出图像. 用nameWindow创建窗口,用createTrackbar加入滚动条和其回调函数的写法. 熟悉OpenCV函数 ...
- OpenCV MAT基本图像容器
参考博客: OpenCv中cv::Mat和IplImage,CvMat之间的转换 Mat - 基本图像容器 Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Mat ...
- opencv从txt文本读取像素点并显示
opencv从txt文本读取像素点并显示 文本储存格式为每行一个像素点,排列为RGB.每帧图像的帧头为65535. 如下图所示 废话不多说,代码如下: // #include <iostrea ...
- 将图片在指定窗口中显示-OpenCV应用学习笔记一
1.OpenCV模块划分 OpenCV其实就是一堆用C和C++语言来实现计算机视觉算法的源代码文件:例如C接口函数cvCany()实现了Canny边缘提取算法,我们可以直接将这些源代码添加到自己的软件 ...
- OpenCV进阶之路:一个简化的视频摘要程序
一.前言 视频摘要又称视频浓缩,是对视频内容的一个简单概括,先通过运动目标分析,提取运动目标,然后对各个目标的运动轨迹进行分析,将不同的目标拼接到一个共同的背景场景中,并将它们以某种方式进行组合.视频 ...
- OpenCV进阶之路:神经网络识别车牌字符
1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...
随机推荐
- jeesite快速开发平台
兴致勃勃地下载下来准备好好研究一番,安装启动结果报错啦: java.lang.ClassNotFoundException: com.thinkgem.jeesite.modules.sys.list ...
- 常用的机器学习&数据挖掘知识点总结
Basis(基础): MSE(Mean Square Error 均方误差),LMS(LeastMean Square 最小均方),LSM(Least Square Methods 最小二乘法),ML ...
- Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)
Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(V 时间:2010-04-12 16:06来源:SilverlightChina. ...
- 2强类型DataSet (2011-12-30 23:16:59)转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 http://blog.sina.com.cn/s/blog_9d90c4140101214w.html
强类型DataSet (2011-12-30 23:16:59) 转载▼ 标签: 杂谈 分类: Asp.Net练习笔记 using System; using System.Collections.G ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- 基于 jQuery 的专业 ASP.NET WebForms/MVC 控件库!
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- I.MX6 天嵌 E9 U-boot menu hacking
/************************************************************************************ * I.MX6 天嵌 E9 ...
- 【HNOI2004】 打鼹鼠
[题目链接] 点击打开链接 [算法] 动态规划 f[i]表示上一次打了第i只鼹鼠,所能打死的最多的鼹鼠数量 [代码] #include<bits/stdc++.h> using names ...
- Java使用动态代理实现AOP
参考资料: http://www.importnew.com/15420.htmlhttp://www.cnblogs.com/techyc/p/3455950.html Spring是借助了动态代理 ...
- 461. Hamming Distance(汉明距离)
The Hamming distance between two integers is the number of positions at which the corresponding bits ...