opencv图像处理学习(五十九)——数据与指针
发布日期:2021-05-24 12:40:25 浏览次数:24 分类:精选文章

本文共 1779 字,大约阅读时间需要 5 分钟。

OpenCV 指针与数据类型

1. 指针

在 OpenCV 开发中,指针 是直接操作图像数据的基础工具。以下是关于指针操作的关键知识点:

1.1 saturate_cast

saturate_cast

是一个 wichtiger工具,用于确保 RGB 值在 0~255 的范围内。

  • 输入为负数时会自动设置为 0
  • 输入超过 255 时会自动截断为 255
  • 输入值在 0~255 之间则保持不变
uchar value = src;
if (src < 0) {
value = 0;
} else if (src > 255) {
value = 255;
} else {
value = src;
}
// 或者直接使用 saturate_cast
value = saturate_cast
(src);

1.2 OpenCV Mat 数据类型指针 ptr 的使用

Mat 类 型 的 ptr 是一个指针,用于访问图像的内部数据。以下是常见操作:

cv::Mat image = cv::Mat(400, 600, CV_8UC1); // 创建一个宽度为 400、高度为 600、单通道 8 位无符号整型的图像矩阵
uchar * data00 = image.ptr
(0); // 获取第 0 行的起始指针
uchar * data10 = image.ptr
(1); // 获取第 1 行的起始指针
uchar * data01 = image.ptr
(0)[1]; // 获取第 0 行的第 2 个元素的指针

如果你想直接操作图像数据,可以使用更低级的方法:

uchar * data = img.data; // 获取所有数据的指针
// 例如:
data = img.data + i * img.step + j * img.elemSize();

2. 数据类型

2.1 Mat 数据类型格式

OpenCV Mat 的数据类型 格式为 CV_<位数>(U|S|F)C<通道数>:

  • bitDepth:位数值为 8、16、32、64
  • U|S|F:表示数据类型,U 为无符号整型,S 为有符号整型,F 为浮点型
  • C:通道数,后续数字表示具体通道数

常见类型:

  • CV_8UC1:单通道 8 位无符号整型(灰度图像)
  • CV_8UC3:三通道 8 位无符号整型(RGB 图像)

2.2 单通道对应关系

以下是 OpenCV 数据类型与基本数据类型的对应关系:

OpenCV 数据类型 基本数据类型 取值范围
CV_8U uchar 0~255
CV_8S char -128~127
CV_16U ushort 0~65535
CV_16S short -32768~32767
CV_32S int -2^31~2^31-1
CV_32F float -DBL_MAX~DBL_MAX
CV_64F double -DBL_MAX~DBL_MAX

2.3 多通道对应关系

多通道数据类型的对应关系如下:

OpenCV 数据类型 C2 C3 C4 C6
CV_8U Vec2b Vec3b Vec4b
CV_16S Vec2s Vec3s Vec4s
CV_32S Vec2i Vec3i Vec4i
CV_32F Vec2f Vec3f Vec4f Vec6f
CV_64F Vec2d Vec3d Vec4d Vec6d

3. 总结

3.1 内存分配

内存分配需谨慎优化,避免频繁分配或释放大的块内存。

3.2 重复计算

避免在循环中重复计算已获得的值,优化循环体。

3.3 迭代器与 at操作

迭代器能减少错误率,但速度较慢。

  • 使用 at操作适合单点处理。
  • 对于连续数据,建议直接操作指针或逐点访问。

3.4 连续扫描

将图像视为一维数组可提升效率,短循环优于长循环。

3.5 多线程

使用 OpenMP 或 TBB 等多线程库优化运行速度。

3.6 行或列操作

如需单独处理行或列,可使用:

img.row(i).setTo(Scalar(255));
img.col(j).setTo(Scalar(255));
上一篇:opencv图像处理学习(六十)——系统函数
下一篇:opencv之坑(五)——mask与ROI

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年05月05日 15时22分58秒