opencv 宏

1、CV_MAKETYPE(depth,cn) 

 

作用:#define CV_MAKETYPE(depth,cn) 宏读入位深度depth和通道数cn生成矩阵类型type.

 

Depth是位深度,定义如下:

#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

 

Depth的最大值为8,一般07,CV_8UCV_USRTYPE1:

#define CV_CN_SHIFT   3

#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)

 

Cn为通道数,cn的最大值为64:

 #define CV_CN_MAX     64

 

#define CV_MAKETYPE(depth,cn)depth作低三位,cn-1作高6(Cn-1的值为063,占用6),形成type值,type最大可为9位:

#define CV_MAKETYPE(depth,cn) ((depth) + (((cn)-1) << CV_CN_SHIFT))

 

例如:

#define CV_8UC3 CV_MAKETYPE(CV_8U,3)

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)

 

2CV_MAT_TYPE(flags)宏

 

 

作用:CV_MAT_TYPE(flags)宏读入类型type,并将type规范化为9位的矩阵类型。

 

#define CV_CN_MAX     64

#define CV_CN_SHIFT   3

#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)

 

#define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)

#define CV_MAT_TYPE(flags)      ((flags) & CV_MAT_TYPE_MASK)

 

CV_MAT_TYPE_MASK511,十六进制为0x1FF; CV_MAT_TYPE(flags)flags截为9位,flags一般为type,所以CV_MAT_TYPE(flags)宏用来规范type值:type正常为9位,如果超过9(比如将通道cn 定义为64以上),可用CV_MAT_TYPE(flags)宏将type 值规范为9位以内。

 

3CV_MAT_CN(flags)

 

作用:CV_MAT_CN(flags)宏用来求矩阵类型flags的通道数

 

#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_MAKETYPE(depth,cn) 宏就不难理解CV_MAT_CN(flags)宏了。

 

4、  CV_ELEM_SIZE(type)

 

作用:计算类型type的“通道数*位深度所占字节”值

 

#define CV_ELEM_SIZE(type) /

(CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))

 

((sizeof(size_t)/4+1)*16384|0x3a50)的值为oxba50,其二进制值为1011,1010,0101,0000。(0xba50>>depth*2)&3的值见下表的第四列,经过该运算,具有相同位深度字节数的type有相同的(0xba50>>depth*2)&3值(如CV_8U和CV_8S结果都为00,CV_32S和CV_32F的结果都为10)。CV_ELEM_SIZE(type)为通道数向左移动”(0xba50>>depth*2)&3”个bit位,即通道数乘以2的”(0xba50>>depth*2)&3”次方,见下表第五列,可见,CV_8U和CV_8S所占字节为1,CV_32S和CV_32F所占字节为4。

 

depth

Value

depth*2

(0xba50>>depth*2)&3

(二进制)

CV_ELEM_SIZE(type)

CV_8U

0

0

00

cn*pow(2,0)=cn*1

CV_8S

1

2

00

cn*pow(2,0)=cn*1

CV_16U

2

4

01

cn*pow(2,1)=cn*2

CV_16S

3

6

01

cn*pow(2,1)=cn*2

CV_32S

4

8

10

cn*pow(2,2)=cn*4

CV_32F

5

10

10

cn*pow(2,2)=cn*4

CV_64F

6

12

11

cn*pow(2,3)=cn*8

CV_USRTYPE1

7

14

10

cn*pow(2,2)=cn*4

### OpenCV 的安装与配置 #### 1. 下载 OpenCV 为了使用 OpenCV 库,首先需要从官方网站下载预编译的二进制文件或者源码包。通常推荐下载已经编译好的发行版以简化安装过程[^1]。 访问官网地址 https://opencv.org/releases/ 并选择适合操作系统的最新稳定版本进行下载。对于 Windows 用户来说,应选择 `.exe` 文件形式的安装程序来完成初始设置。 #### 2. 配置环境变量 下载并解压完成后,在系统中添加必要的路径至环境变量以便于全局调用动态链接库 (DLLs)。具体步骤如下: - 将 `opencv\build\x64\vc15\bin` 路径加入到系统的 PATH 环境变量里[^2]。 此路径包含了运行时所需的 DLL 文件,确保任何命令行工具或 IDE 均能识别这些依赖项。 #### 3. Visual Studio 中配置 OpenCV 针对不同版本的 Microsoft Visual Studio 进行适当调整可以实现无缝集成开发体验。以下是基于 VS2019 和 VS2022 的通用指导原则: ##### a. 设置附加包含目录 在项目的属性页 -> C/C++ -> General -> Additional Include Directories 添加头文件位置: ```plaintext $(OPENCV_DIR)\include ``` 其中 `$(OPENCV_DIR)` 是指代本地存储 opencv 解压缩后的根目录。 ##### b. 指定库目录 转到 Linker -> General -> Additional Library Directories 插入静态/共享库所在的位置: ```plaintext $(OPENCV_DIR)\x64\vc15\lib # 对应 vs2019/vc15 版本 $(OPENCV_DIR)\x64\vc17\lib # 如果是 vs2022 则需改为 vc17 ``` 注意:上述示例假设已正确设置了 OPENCV_DIR 变量;如果未定义,则手动输入绝对路径代替表达式即可。 ##### c. 关联目标库 (.lib) 最后一步是在 Linker -> Input -> Additional Dependencies 字段追加实际使用的模块名称列表,比如基础功能可能涉及以下几项之一或多者组合: ```plaintext opencv_world460.lib // 单独打包模式下的综合库 or separately linked modules like: opencv_core460.lib // Core functionality opencv_imgproc460.lib // Image processing algorithms opencv_highgui460.lib // GUI features including window display and video capture. ... ``` 这里列举的例子适用于 OpenCV 4.x 系列产品,请依据实际情况替换相应编号部分(即 '460' 表示第四个主要发布序列中的第六次次要更新迭代号)。 通过以上三个方面的细致调节之后,应该能够在所选平台上成功加载和运用 OpenCV 功能集了! --- ### 示例代码片段展示如何读取图像并显示窗口 下面给出一段简单的 Python 实现例子用于验证安装成果: ```python import cv2 as cv img = cv.imread('example.jpg') # 加载图片资源 if img is None: print("Could not open or find the image!") else: cv.imshow('Display Window', img) # 创建新窗体呈现内容 key = cv.waitKey(0) # 等待按键事件触发关闭动作 if key == ord('q'): cv.destroyAllWindows() ``` 同样地也可以尝试编写 C++ 版本来测试效果: ```cpp #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> int main() { cv::Mat img = cv::imread("example.jpg"); if(img.empty()) { std::cout << "Error loading image!" << std::endl; return -1;} cv::namedWindow("Example",cv::WINDOW_AUTOSIZE); cv::imshow("Example",img); char k = static_cast<char>(cv::waitKey()); if(k=='q') cv::destroyAllWindows(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值