学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型

2023-11-23 03:20

本文主要是介绍学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 总览
  • 2. 基础类型
    • 2.0 基础类型总览
    • 2.1 cv::Vec<>类
    • 2.2 cv::Matx<>类
    • 2.3 cv::Point类(cv::Point3_< >和cv::Point_< >)
    • 2.4 cv::Scalar(cv::Scalar_)类
    • 2.5 cv::Size(cv::Size_)类、cv::Rect(cv::Rect_)类和cv::RotatedRect 类
    • 2.6 基础类型支持的操作
      • 2.6.1 cv::Point
      • 2.6.2 cv::Scalar
      • 2.6.3 cv::Size类
      • 2.6.4 cv::Rect类
      • 2.6.5 cv::RotateRect类
      • 2.6.6 cv::Matx类
      • 2.6.7 cv::Vec类
      • 2.6.8 cv::Complex_
  • 3. 辅助对象
    • 3.1 cv::TermCriteria
    • 3.2 cv::Range
    • 3.3 cv::Ptr模版和垃圾回收
    • 3.4 cv::Exception类和异常处理
    • 3.5 cv::DataType<> 模板(traits)
    • 3.6 cv::InputArray和cv::OutputArray以及cv::_InputOutputArray类
      • 3.6.1 cv::InputArray(cv::InputArrayOfArrays)
      • 3.6.2 cv::OutputArray(cv::OutputArrayOfArrays)
  • 4. 工具函数(系统函数)
  • 5. 总结
  • X. 其他
    • X.1 OpenCV_cheatsheet中的关键数据类型
    • X.2 C++开发桌面程序和js开发
    • X.3 开源库的组织(如何更好的看文档)

1. 总览

关于OpenCV的数据结构,官方文档位于:Core functionality

主要就是下面这几项内容:
在这里插入图片描述

注意,下文中提到的C语言中的结构:例如:CvPoint和CvPoint2D32f
位于C structures and operations,4.x之后的文档就没有这些内容了
虽然文档没有了,但是源文件里依然有opencv-4.8.0/modules/core/include/opencv2/core/types_c.h相应的头文件

根据Learning OpenCV3,可知:
在这里插入图片描述

2. 基础类型

2.0 基础类型总览

在这里插入图片描述

参考:

  • https://docs.opencv.org/4.x/dc/d84/group__core__basic.html
  • https://docs.opencv.org/4.x/d2/d75/namespacecv.html中 搜索即可,这个网页中黑色无链接的类/结构是:“black box”与磁盘相关的文件存储。

2.1 cv::Vec<>类

cv::Vec<>——固定向量类(所存储的元素长度固定),用于维度固定的小型向量

cv::Vec< _Tp, cn > Class Template Reference

  • 尖括号是模板类的意思,
  • 相对于普通的STL的向量类,固定向量类在编译时就已知向量的维度,这样代码处理起来就会更高效。

虽然cv::Vec<>本身已经是模版形式了,但是实际上并不会直接使用这个形式。而是使用typedef定义的别名来使用一些更为通用/专门的实例。

  • 例如:cv::Vec2i就表示有两个元素的整型向量
  • 任何有着cv::Vec{2,3,4,6}{b,w,s,i,f,d}形式的声明,表示6种数据类型中某个具有2~6个元素数量的向量类型。
    • b: unsigned char
    • w: unsigned shor
    • s: short
    • i: int
    • f: float
    • d:double
  • 注意,cv::Vec最长的元素不止是6个,在cv::Vec< _Tp, cn > Class Template Reference中,可以看到cv::Vec<>的构造函数最长可以有14个元素。同时,还可以接受矩阵的某行作为参数。
  • 在Shorter aliases for the most popular specializations of Vec<T,n>中,有:在这里插入图片描述

另外,需要注意的一点是,在cv::Vec< _Tp, cn > Class Template Reference中,有:
在这里插入图片描述
即 cv::Vec< >模版类继承自cv::Matx< >模板类。

代码中可以看到:
在这里插入图片描述

2.2 cv::Matx<>类

除了cv::Vec<>固定向量类,还有cv::Matx<>固定矩阵类,
与cv::Vec<>类似,cv::Matx<>也是用于特定的一些小型矩阵中。
(cv::Mat类是用于任意维度的矩阵,一般用在大矩阵,比如存储图像等)

在计算机视觉中,有很多2X2,3X3以及少量的4X4矩阵(例如:3*3的卷积核,3*3或者2*2的变换矩阵等),cv::Matx<>用于设计容纳这些对象。

与cv::Vec<>类似,cv::Matx<>通常也是用别名的形式进行使用,其形式为:
cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d},只有浮点数类型和双浮点数类型。

  • f: float
  • d:double

在OpenCV——Basic structures——Typedefs中,可以看到:
在这里插入图片描述

固定矩阵类的维度在编译前已知,因此其运算效率高,消除很多动态内存分配操作。

2.3 cv::Point类(cv::Point3_< >和cv::Point_< >)

typedef Point2i Point;
默认使用cv::Point时其实调用的是cv::Point2i
cv::Point2itypedef cv::Point_<int>

cv::Point_类和cv::Point3_类

  • 与cv::Vec<>固定向量类很像。
  • cv::PointX类是用来存储2~3个原语类型的容器,用来表示2d或者3d的点
  • 不是从cv::Vec<>类继承的,是由自己的模板派生的,但也可以由固定向量类转变得到
  • cv::Point和cv::Vec<>最大的区别是:
    • 成员通过变量名称访问,如point.x,point.y,而不是通过下标访问,如vec[0],vec[1]等

OpenCV中的Point类包括cv::Point3_和cv::Point_

  • cv::Point3_< >:3D点坐标x,y,z的模板,这个结构可以与C语言中的结构CvPoint2D32f互换。
  • cv::Point_< >:2D点坐标x,y的模板,可以与C语言中的结构:CvPoint和CvPoint2D32f

与cv::Vec<>类似,cv::PointX通常也通过别名调用,

  • cv::Point{2,3}{i,d,f,I}
    • i: int
    • f: float
    • d:double
    • I: int64
  • 在OpenCV——Basic structures——Typedefs中,可以看到:
    在这里插入图片描述
    实际上是分别来自两个3d和2d的模板类构成的cv::PointXX。

2.4 cv::Scalar(cv::Scalar_)类

在OpenCV——Basic structures——Typedefs中,有:
在这里插入图片描述

在cv::Scalar_< _Tp > Class Template Reference中,可以看到:
在这里插入图片描述

cv::Scalar_继承自cv::Vec<_Tp,4>,即本质上是一个4维的固定向量。

代码中可以也看到:
在这里插入图片描述

cv::scalar类直接继承自cv::Vec4d(cv::Vec<double,4>)

2.5 cv::Size(cv::Size_)类、cv::Rect(cv::Rect_)类和cv::RotatedRect 类

typedef cv::Point2i cv::Point
typedef cv::Size2i  cv::Size
typedef cv::Rect2i  cv::Rect

cv::Size类和cv::Rect类与cv::Point类类似,但是也并不继承自cv::Point类,而是继承自己的模板类

  • 主要区别在于cv::Size有width和height这两个属性,而不是cv::Point_类的x和y
  • cv::Rect则是包含width、height、x和y这四个属性。

cv::Size_类和cv::Rect_一般也是通过别名使用,比如:

  • 在OpenCV——Basic structures——Typedefs中,可以看到:
    在这里插入图片描述
  • 最常见的就是直接使用整数型的cv::Sizecv::Rect

cv::RotatedRect类表示非轴对称的矩形,即矩形的四条边不与所在坐标轴平行,表示旋转的矩形。其包括:

RotatedRect (const Point2f &center, const Size2f &size, float angle)
1. Point2f类型的中心点
2. Size2f类型的高宽
3. float的角度

2.6 基础类型支持的操作

2.6.1 cv::Point

在这里插入图片描述
Cast to the fixed vector classes,映射成固定向量类,类似强制类型转换。

根据cv::Point3_< >和 cv::Point_< >的Public Member Functions可知:
cv::Point_< >类的对象有inside方法,cv::Point_< >类的对象是没有该方法的

2.6.2 cv::Scalar

在这里插入图片描述

  • Quaternion四元数,
  • conjugation共轭,连接
  • iff 当且仅当,if and only if
  • cv::Scalar可以和旧的C语言的接口类CvScalar自由转换

根据cv::Scalar_< _Tp > Class Template Reference可知,

  • scalar类除了有自己的一些方法,还有继承自cv::Vec以及更上层的cv::Matx的方法。
  • 例如:
    #include <iostream>
    #include <opencv2/opencv.hpp>
    int main(int argc, char 

这篇关于学习Opencv(蝴蝶书/C++)——3. OpenCV的数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414972

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列