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_32F32 位浮点数,常用于需要浮点运算的图像处理算法
CV_64F64 位浮点数,提供更高精度

以下是创建不同数据类型矩阵的示例代码:

#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 中固定数据类型、模板使用限制以及多通道数据类型的基本使用方法。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐