固定数据类型和对模板的限制使用【OpenCV_C++_VS】
·
2.3.5固定数据类型和对模板的限制使用
1. OpenCV 固定数据类型
OpenCV 定义了多种固定的数据类型,每种类型对应不同的数据精度和取值范围。以下是一些常见类型及其应用场景:
| 类型名称 | 含义 |
|---|---|
CV_8U | 无符号 8 位整数,范围是 0 - 255,常用于普通灰度图像或彩色图像通道。 |
CV_8S | 有符号 8 位整数,范围是 -128 - 127。 |
CV_16U | 无符号 16 位整数,范围是 0 - 65535,适用于高精度图像数据。 |
CV_16S | 有符号 16 位整数,范围是 -32768 - 32767。 |
CV_32S | 有符号 32 位整数,用于整数计算结果。 |
CV_32F | 32 位浮点数,常用于需要浮点运算的图像处理算法。 |
CV_64F | 64 位浮点数,提供更高精度。 |
以下是创建不同数据类型矩阵的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 创建一个无符号8位整数类型的矩阵
cv::Mat mat_8u = cv::Mat::zeros(3, 3, CV_8U);
std::cout << "CV_8U matrix:\n" << mat_8u << std::endl;
// 创建一个32位浮点数类型的矩阵
cv::Mat mat_32f = cv::Mat::zeros(3, 3, CV_32F);
std::cout << "CV_32F matrix:\n" << mat_32f << std::endl;
return 0;
}

2. 模板的限制使用
OpenCV 在设计时为了保证编译效率和跨平台兼容性,对模板的使用有所限制:
- 编译时效率:大量模板实例化会显著增加编译时间,在核心算法中会尽量避免过度使用模板。
- 兼容性:为确保不同版本和平台间的兼容性,API 设计会保持稳定,避免复杂模板特性。
OpenCV 通常会针对不同数据类型提供多个重载函数,而非使用单一通用模板函数。
例如cv::add函数就有针对不同数据类型的重载版本。
3. 多通道数据类型的使用
OpenCV 支持多通道数据类型,可用于表示彩色图像、向量场等。常见的多通道数据类型有单通道、三通道和四通道。
| 类型名称 | 含义 |
|---|---|
CV_8UC1 | 单通道无符号 8 位整数类型。 |
CV_8UC3 | 三通道无符号 8 位整数类型,常用于 RGB 彩色图像。 |
CV_8UC4 | 四通道无符号 8 位整数类型,可用于 RGBA 图像。 |
以下是创建和操作三通道矩阵的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 创建一个三通道的无符号8位整数类型的矩阵
cv::Mat mat_8uc3 = cv::Mat::zeros(3, 3, CV_8UC3);
// 设置矩阵的第一个通道的值
for (int i = 0; i < mat_8uc3.rows; ++i) {
for (int j = 0; j < mat_8uc3.cols; ++j) {
mat_8uc3.at<cv::Vec3b>(i, j)[0] = 255;
}
}
std::cout << "CV_8UC3 matrix:\n" << mat_8uc3 << std::endl;
return 0;
}

代码解释
- 固定数据类型:通过
cv::Mat::zeros函数创建不同数据类型的矩阵,CV_8U和CV_32F分别指定矩阵元素的数据类型。 - 多通道数据类型:创建
CV_8UC3类型的矩阵表示三通道图像。使用cv::Vec3b类型访问每个像素的三个通道,at方法用于定位矩阵中的具体元素,[0]表示访问第一个通道。
越复杂的算法对类型格式支持得越少。以下是被限制的典型例子:
(1)人脸检测算法仅支持8位的灰度或者彩色图像;
(2)线性代数算法和大多数的机器学习算法仅支持浮点数组;
(3)基础函数,例如cv::add,支持所有类型;
(4)色彩空间转换函数支持8位、16位无符号类型和32位浮点类型。
通过上述示例,你可以了解 OpenCV 中固定数据类型、模板使用限制以及多通道数据类型的基本使用方法。
更多推荐

所有评论(0)