【OpenCV】从Mat的flags中可以读到的信息,以及相关宏定义

在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) != 0; }
也可以通过宏定义来实现:

#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) != 0; }
对应的宏定义:

#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框架的核心构成 OpenCV 是一个开源计算机视觉库,广泛应用于图像处理、视频分析以及机器学习等领域。其架构设计旨在提供高效、灵活的功能支持,以下是关于 OpenCV 框架核心组成部分的详细介绍。 #### 1. **Core 模块** 这是 OpenCV 的基础模块,提供了许多底层的数据结构和工具函数。具体来说,它包含了以下内容[^1]: - **基本数据结构**: 如 `Mat` 类型用于表示矩阵或图像。 - **动态数据结构**: 提供了诸如链表、树等复杂数据类型的实现。 - **绘图函数**: 支持绘制几何图形(直线、圆、矩形)、文字等功能。 - **数组操作相关函数**: 包括矩阵变换、算术运算、逻辑运算等。 - **辅助功能与系统函数**: 提供调试、性能评估以及其他实用工具。 - **宏定义**: 方便开发者快速调用常用设置。 - **与其他技术的互操作性**: 实现了与 OpenGL 的无缝集成,便于三维可视化应用开发。 #### 2. **构建方式** 为了更好地利用 OpenCV 功能并将其嵌入到自己的项目中,通常采用 CMake 工具来完成编译过程。下面是一段典型的 CMake 脚本示例[^2]: ```cmake # 指定需要的 cmake 最低版本 cmake_minimum_required(VERSION 2.8) # 创建工程 project(hello_opencv) # 设置 C++ 编译标准为 C++11 set(CMAKE_CXX_FLAGS "-std=c++11") # 查找 OpenCV 安装路径 find_package(OpenCV REQUIRED) # 引入 OpenCV 头文件路径 include_directories(${OpenCV_INCLUDE_DIRS}) # 指定源码文件及其生成的目标可执行程序名称 add_executable(hello_opencv hello_opencv.cpp) # 将目标链接至 OpenCV 库 target_link_libraries(hello_opencv ${OpenCV_LIBS}) ``` 这段脚本展示了如何通过 CMake 来配置环境以便于使用 OpenCV 开发应用程序。 #### 3. **命名空间管理** 在实际编程过程中需要注意的一点是,尽管所有的类和方法都被封装进了名为 `cv` 的命名空间下[^3],但为了避免潜在的名字冲突问题,推荐显式地加上前缀而不是全局导入整个命名空间。例如: ```cpp // 推荐的方式 cv::Mat image; image = cv::imread("example.jpg"); // 不推荐的方式 (可能引发名字污染) using namespace cv; Mat image; image = imread("example.jpg"); ``` 此外还提到 `.jpg` 图像格式由于采用了有损压缩算法,在精度要求较高的场合应谨慎选用;而自动内存管理机制则进一步简化了资源释放的工作量。 #### 4. **深度神经网络(DNN)模块** 随着人工智能的发展,OpenCV 中也加入了对 DNN 的支持。其中一个重要接口就是读取预训练模型的方法——`dnn.readNet()` 函数[^4]。该函数允许用户加载由其他框架导出的深度学习模型,并可以直接运行推理任务。主要涉及以下几个方面: - 参数说明: - `model`: 存储已训练好权重值的二进制文件地址; - `config`: 描述网络拓扑结构的小巧文本文件位置; - `framework`: 可选字段,默认情况下能够自行判断所使用的框架类型。 综上所述,以上便是围绕着 OpenCV 主要组成单元的一些概述信息
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值