OpenCV的数据类型——基础数据类型

本文介绍了OpenCV的基础数据类型,包括Point类、Scalar类、Size类、Rect类、RotatedRect类、固定矩阵类、固定向量类和复数类。Point类是二维和三维点的容器,Scalar类用于快速表示四维向量,Size类表示尺寸,Rect类描述矩形,RotatedRect类表示旋转矩形,固定矩阵和固定向量类提供了高效的内存管理,复数类则涵盖了单精度和双精度复数。

OpenCV有很多数据类型,从组织结构的角度来看,OpenCV的基础类型类型主要分为三类。第一类是直接从C++原语中继承的基础数据类型;第二类是辅助对象;第三类是大型数据类型。本文主要介绍OpenCV的基础数据类型。

目录

Point类

Scalar类

Size类

Rect类

RotatedRect类

固定矩阵类

固定向量类

复数类


Point类

cv::Point类是两到三个原语类型的容器,其成员是通过变量名称x、y、z访问的,而不是通过下标访问。Point类是通过自己的模板派生来的,这是一个基础模板;实际上由两个这样的模板,分别是给二维、三维的点提供的。这些类的实例有cv::Point2i、cv::Point2f、cv::Point2d或cv::Point3i、cv::Point3f、cv::Point3d(在这里,最后一个字母表示构造该点所需要的原语,i是一个32位整形,f是一个32位浮点数,d是一个64位浮点数,还可以有无符号字符b和短整型s)。

优势:简单且开销小。Point类可以转换成固定向量类或固定矩阵类,同样也可由它们转换得到Point类。

Point类直接支持的操作
操作 示例
默认构造函数

cv::Point2i p2;

cv::Point3i p3;

复制构造函数

cv::Point3i p1( p );   

注:若p为浮点型,则会自动取整

值构造函数

cv::Point2i( x0, x1 );

cv::Point3d( x0, x1, x2 );

构造成固定向量类 (cv::Vec3f) p;
成员访问 p.x, p.y, p.z
点乘 float x = p1.dot( p );
双精度点乘 double x = p1.dot( p );
叉乘

p1.cross( p );   注:只用于三维的点

判断一个点p是否在矩形r内 p1.inside( r );   注:只用于二维的点

Scalar类

cv::Scalar是四维点类,是四维双精度向量的快速表示。cv::Scalar直接从固定向量类模板实例(cv::Vec<double, 4>)中继承而来,所以继承了所有向量代数操作、成员访问函数(比如[]操作符)和一些固定向量类的特性,如:其元素是通过整数下标来访问的。

Scalar类直接支持的操作
操作 示例
默认构造函数 cv::Scalar s;
复制构造函数 cv::Scalar s2( s1 );
值构造函数

cv::Scalar s( x0 );

cv::Scalar s( x0, x1, x2, x3 );

元素相乘 s1.mul( s2 );
(四元数)共轭

s.conj();

// return cv::Scalar( x0, -x1, -x2, -x3 );

(四元数)真值测试

s.isReal();

// if x1 == x2 == x3 == 0{ return true; }

Size类

Size类在实际操作时和Point类相似,可以进行互相转换。主要区别在于Size类中对应的成员是width和height,而不是x和y,并且不支持转换到固定向量类。Size类的别名有cv::Size、cv::Size2i和cv::Size2f,其中前两个都表示整型,最后一个表示单精度浮点型。

Size类直接支持的操作
### 如何避免或处理 OpenCV 数据类型转换过程中的数值截断 #### 理解数据类型的范围和特性 OpenCV 中 `Mat` 对象支持多种不同的数据类型,每种类型都有其特定的取值范围。当进行不同类型间的转换时,如果目标类型的表示能力不足以容纳源类型的数据,则会发生截断现象[^2]。 对于常见的几种基本数据类型及其对应的深度(depth),如下所示: - **CV_8U**: 无符号字符型 (0 ~ 255) - **CV_8S**: 布尔型 (-127 ~ 127) - **CV_16U**: 半字节无符号整数 (0 ~ 65,535) - **CV_16S**: 半字节有符号整数 (-32,767 ~ 32,767) - **CV_32S**: 整形 (-2,147,483,647 ~ 2,147,483,647) - **CV_32F**: 浮点型 (~±3.4e−38 to ±3.4e+38) - **CV_64F/double**: 双精度浮点型 (~±2.2e−308 to ±1.8e+308) 这些不同类型的适用场景决定了它们之间互相转化的可能性与风险所在[^4]。 #### 防止截断的方法 为了防止在转换过程中发生不必要的截断错误,在执行任何可能改变像素值大小的操作之前应当采取预防措施: ##### 方法一:使用合适的缩放因子调整原始图像亮度级别 通过乘法运算可以有效地扩大或缩小输入矩阵内的每一个元素值,从而确保最终结果能够被新的数据类型所接受而不丢失信息量。例如,当你想要把一个单通道灰度级图片由 CV_8UC1 转变为更高位宽的形式如 CV_32FC1 或者相反方向的时候就可以考虑这种方法。 ```cpp // 将 uint8 图像转换为 float 并除以最大值使其归一化到 [0,1] img.convertTo(img_flt, CV_32F); img_flt /= 255; ``` ##### 方法二:利用饱和算术操作代替简单的强制转型 某些情况下直接应用 C++ 的 static_cast<> 函数可能会带来意外的结果;因此建议采用更安全的方式——即调用 convertScaleAbs() API 来完成这项工作。该函数会自动处理超出界限的情况并返回经过适当裁剪后的版本给用户。 ```cpp // 使用 convertScaleAbs 进行安全转换 cv::convertScaleAbs(src_mat, dst_mat); // 自动处理溢出情况 ``` 另外值得注意的是,在实际编程实践中还应该时刻关注可能出现的各种异常状况,并编写相应的错误捕捉机制以便及时发现潜在隐患并加以修复[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值