码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 学习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中,有:在这里插入图片描述

    另外,需要注意的一点是,在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::Point2i是 typedef cv::Point_

    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)

    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
    
    • 1
    • 2
    • 3

    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::Size和cv::Rect

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

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

    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 
      #include 
      int main(int argc, char 
      • 1
      • 2
  • 相关阅读:
    ls -l 命令列出的total是什么
    react中利用useRef、forwardRef、useImperativeHandle获取并处理dom
    【Gazebo要素01】术语和概念
    安装 paddlepaddle paddleocr库,避坑指南
    递归:为运算表达式设计优先级
    [VIM]spcaevim
    MybatisPlus 4 DML 编程控制 4.3 逻辑删除
    【基础篇】三、Flink集群角色、系统架构以及作业提交流程
    Python关于 *args 和 **kwargs 参数的详解(全)
    大数据(9h)FlinkSQL之Lookup Join
  • 原文地址:https://blog.csdn.net/Castlehe/article/details/134519857
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号