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

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类直接支持的操作
操作示例
默认构造函数

cv::Size sz;

cv::Size2i sz;

cv::Size2f sz;

复制构造函数cv::Size2f sz2( sz1 );
值构造函数cv::Size2f sz( w, h );
成员访问

sz.width;

sz.height;

计算面积sz.area();

Rect类

Rect类又称矩形类,包含Point类的成员x和y(代表矩形左上角的坐标)和Size类的成员width和height(代表矩形的大小),但并非从它们继承过来。

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

cv::Rect r;

复制构造函数cv::Rect r2( r1 );
值构造函数

cv::Rect( x, y, w, h );

由起始点和大小构造cv::Rect( p,  sz );
由两个对角构造cv::Rect( p1, p2 );
成员访问r.x; r.y; r.width; r.height;
计算面积r.area();
提取左上角r.tl();    // top-left
提取右下角r.br();   // bottom-left
判断点p是否在矩形r内r.contains( p );
Rect对象的覆写操作符
操作示例
矩形r1和矩形r2的交集

cv::Rect r3 = r1 & r2;

r1 &= r2;

同时包含矩形r1和矩形r2的最小面积矩形cv::Rect r3 = r1 | r2;

r1 |= r2;

平移矩形r x个数量cv::Rect rx = r + x;

r += x;    // x为一个Point实例,左上角偏移量

扩大矩形r s大小cv::Rect rs = r + s;

r += s;    // s为一个Size实例,尺寸改变量

比较矩形r1和矩形r2是否相等bool eq = ( r1 == r2 );
比较矩形r1和矩形r2是否不相等bool ne = ( r1 != r2 );

RotatedRect类

cv::RotatedRect类是OpenCV中少数底层没有使用模板的C++接口之一。它是一个包含一个中心点cv::Point2f、一个大小cv::Size2f和一个额外的角度float的容器(表示图形绕中心点的旋转角度)。

RotatedRect类直接支持的操作
操作示例
默认构造函数cv::RotatedRect rr();
复制构造函数cv::RotatedRect rr2( rr1 );

值构造函数,需要一个点(point)、

一个大小(size)和一个角度(angle)

cv::RotatedRect rr( p, sz, theta );
成员访问rr.center; rr.size; rr.angle;
返回四个角的列表rr.points( pts[4] );
包含旋转矩形的最小矩形rr.boundingRect();

固定矩阵类

固定矩阵类cv::Matx<>的维度在编译之前必须知道,因此被称为“固定”。它们内部的所有数据都是在堆栈上分配的,所以分配和消除的很快,消除了许多动态内存分配操作,运行效率高。cv::Matx<>一般都以别名cv::Matx{1,2,3,4,5,6}{1,2,3,4,5,6}{f,d}的形式应用,适用于小型矩阵,并做了特别的优化。

cv::Matx类支持的操作
操作示例
默认构造函数

cv::Matx33f m33f;

cv::Matx43d m43d;

复制构造函数cv::Matx22d m22d( n22d );
值构造函数

cv::Matx21f m( x0, x1);

cv::Matx44d m( x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 );

函相同元素的矩阵m33f = cv::Matx33f::all( x );
全0矩阵m23d = cv::Matx23d::zeros();
全1矩阵m16f = cv::Matx16f::ones();
创建一个单位矩阵m33f = cv::Matx33f::eye();
创建一个可以容纳另一个矩阵对角线的矩阵m31f = cv::Matx31f::diag();
创建一个均匀分布的矩阵m33f = cv::Matx33f::randu( min, max );
创建一个正态分布的矩阵m33f = cv::Matx33f::nrandn( mean, variance );
成员访问

m( i, j);

m( i );

矩阵代数运算m1 = m0;  m0 * m1;  m0 + m1;  m0 - m1;
单例(singleton)代数m * a;  a * m;  m / a;
比较m1 == m2;  m1 != m2;
点积m1.dot( m2 );      // 使用默认精度运算法求点积
点积m1.ddot( m2 );    // 使用双精度运算法求点积
改变矩阵形状m91f = m33f.reshape<9, 1>();
变换操作符m44f = (Mat44f) m44d;
提取(i, j)处的2×2子矩阵m44f.get_minor<2, 2>( i, j );
提取第 i 行m14f = m44f.row( i );
提取第 j 列m41f = m44f.col( j );
提取矩阵对角线m41f = m44f.diag();
计算转置n44f = m44f.t();
逆矩阵

n44f = m44f.inv( method );   

// method为矩阵分解类型,默认为cv::DECOMP_LU

解线性系统

m31f = m33f.solve( rhs31f, method);

m32f = m33f.solve<2>( rhs32f, method);

每个元素的乘法m1.mul( m2 );

 

method:矩阵分解类型
名称描述
DECOMP_LU

Gaussian elimination with the optimal pivot element chosen.

选择了最优主元的高斯消去法。一定不能是单数的。

DECOMP_SVD 

singular value decomposition (SVD) method; the system can be over-defined and/or the matrix src1 can be singular

奇异值分解(SVD)方法;系统可以被过度定义和/或者矩阵src1可以是单数。

DECOMP_EIG

eigenvalue decomposition; the matrix src1 must be symmetrical

特征值分解;矩阵src1必须是对称的。

DECOMP_CHOLESKY

Cholesky LL^{T} factorization; the matrix src1 must be symmetrical and positively defined

柯列斯基LL^{T}分解;矩阵src1必须是对称的并是正定矩阵。该类型在处理大的矩阵时的速度是LU的两倍左右。

DECOMP_QR 

QR factorization; the system can be over-defined and/or the matrix src1 can be singular

QR分解;系统可以被过度定义和/或者矩阵src1可以是单数。

DECOMP_NORMAL 

while all the previous flags are mutually exclusive, this flag can be used together with any of the previous; it means that the normal equations src1^{T}\cdot src1\cdot dst=src1^{T}src2 are solved instead of the original system src1\cdot dst=src2

虽然前面所有的标志都是互斥的,但是这个标志可以和前面的任何一个一起使用;这意味着解的是正规方程src1^{T}\cdot src1\cdot dst=src1^{T}src2而不是原来的方程src1\cdot dst=src2

固定向量类

固定向量类cv::Vec是从固定矩阵类派生出来的,从C++继承的意义上,可以说固定向量模板cv::Vec是列为1的cv::Matx<>。其特例的形式为cv::Vec{2,3,4,6}{b,s,w,i,f,d}(w是无符号短整型),主要遍历方式是通过单个数索引各项。

cv::Vec类支持的操作
操作示例
默认构造函数

cv::Vec2s v2s;

cv::Vec6f v6f;

复制构造函数cv::Vec3f u3f( v3f );
值构造函数

cv::Vec2f v2f( x0,  x1);

cv::Vec6d v6d( x0, x1, x2, x3, x4, x5 );

成员访问v4f[ i ];  v3w( j );
向量叉乘v3f.cross( u3f );

复数类

cv::Complexf和cv::Complexd分别是单精度和双精度复数的别名。

复数类支持的操作
操作示例
默认构造函数

cv::Complexf z1;

cv::Complexd z2;

复制构造函数cv::Complexf z2( z1);
值构造函数

cv::Complexf z1( re0);

cv::Complexf z2( re0, im1);

成员访问z1.re; z1.im1;
复共轭z2 = z1.conj();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Process finished with exit code -1073741819 (0xC0000005)

运行TensorFlow出现如下错误&#xff0c;尝试了很多网上的方法都不行&#xff0c;最后把代码中的中文路径改为英文后就解决了

LeetCode - Partition List

题目&#xff1a; Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example, Given 1-…

Cell:重大突破!三位学术大咖,打造全新“DNA显微镜”

来源&#xff1a;中国生物技术网传统上&#xff0c;科学家们使用光、X射线和电子来观察组织和细胞的内部。如今&#xff0c;科学家们能够在整个大脑中追踪线状的神经纤维&#xff0c;甚至可以观察活的小鼠胚胎如何产生原始心脏中的跳动细胞。但是这些显微镜无法看到的是&#x…

OpenCV的数据类型——辅助对象

在上一篇文章中&#xff0c;主要介绍了OpenCV的基础数据类型。接下来在本篇文章中将主要对OpenCV的辅助对象进行介绍。 cv::TermCriteria类 在很多算法中都存在着循环嵌套&#xff0c;只有满足终止条件时才会退出。通常情况下&#xff0c;终止条件的形式要么是达到允许的有限…

概率密度函数某一点的意义

在连续型随机变量的概率密度函数中&#xff0c;某一点的值不等于该点的概率值&#xff0c;就像不能计算汽车在某一点的速度&#xff0c;因为速度是距离除以时间&#xff0c;对某一点来说不存在距离的概念。如果要计算某一点x的概率的话&#xff0c;就要对x取邻域&#xff08;无…

eclipse中monokai插件的安装

eclipse中monokai插件的安装转载于:https://www.cnblogs.com/zhujiabin/p/5099675.html

Science Robotics近日刊登CMU重大突破,无需手术,普通人就能用意念操控机械臂!...

来源&#xff1a;机器人大讲堂导读顶尖学术期刊《科学》旗下的Science Robotics本月19号刊登了脑机接口&#xff08;BCI&#xff09;领域的一项突破成果。美国卡内基梅隆大学的贺斌教授带领其研究团队与明尼苏达大学合作&#xff0c;成功开发出第一款非侵入式的意念控制机械臂&…

使用pymc3可能遇到的问题及解决方法

PyMC3机器学习库&#xff0c;基于heano, NumPy, SciPy, Pandas, 和 Matplotlib。 安装 pip install pymc3&#xff0c;pip命令可以安装pymc3并安装其依赖库 首次运行报错 这可能是缺少某些依赖库导致的&#xff0c;根据报错信息安装即可 运行出现一长串c代码&#xff0c;或…

【采药.】

采药 题目链接 题意 在这规定时间内采摘草药&#xff0c;使得获得的草药总价值最大&#xff08;动态规划&#xff09; 思路 初始化数组并输入动态规划输出 坑点 容易忘记初始化 算法一&#xff1a;动态规划 时间复杂度 O(n * T) 实现步骤 输入动态规划输出 代码 #include…

OpenCV的工具函数

OpenCV3也提供了一些经常用于计算机视觉的实用功能&#xff0c;列举如下: 功能描述cv::alignPtr() Align pointer to given number of bytes 对齐指针到指定字节数 cv::alignSize() Align buffer size to given number of bytes 将缓存区大小与给定的字节数对齐 cv::allocate(…

一文读懂全球自动驾驶传感器市场格局!

来源&#xff1a;智驾未来自动驾驶汽车作为汽车未来的重要发展方向&#xff0c;成为汽车零部件产业链的重要增长点。国内外的汽车零部件供应商积极布局自动驾驶传感器领域&#xff0c;在车载摄像头、毫米波雷达和激光雷达三大核心部件&#xff0c;以及产业链上下游的拓展为零部…

林志玲为何无法拯救都市丽人的遇冷?

6月11日&#xff0c;恰是备受瞩目的内衣股都市丽人的赴港推介会。公司董事长郑耀南携手林志玲在会上宣布。从6月16日起招股募资近18亿港元。26日将在联交所主板挂牌上市。而作为“在中国最了解女人的男人”的郑耀南。出于赴港上市造势须要&#xff0c;这次请来了都市丽人品牌代…

Chrome划词翻译插件

https://saladict.crimx.com/ 沙拉查词&#xff0c;同时支持几种翻译软件的翻译结果&#xff0c;实现网页划词划句即时翻译

OpenCV的数据结构——大型数组类型

OpenCV中的数据类型可分为三类&#xff0c;而前两类&#xff08;基础数据类型和辅助对象&#xff09;在前面已进行详细讲述&#xff0c;下面将对最后一种——大型数组类型进行讲解。 大型数据类型中最重要的当属cv::Mat&#xff0c;这可谓是OpenCV的核心&#xff0c;所有主要函…

MIT对话马斯克:关于自动驾驶、爱和未来世界|厚势汽车

来源&#xff1a;价值中国编译不论是在新能源汽车、私人航空航天、共通交通、还是在人工智能领域&#xff0c;埃隆马斯克天马行空的创想和脚踏实地的奋斗让人震惊不已。简直就是一个活着得的非物质文化遗产。马斯克在全球范围内收割了无数粉丝。不论是企业家、工程师、科技研究…

编写高质量代码:Web前端开发修炼之道(三)

第五章:高质量的Javascript 这章的内容我看的最久,这是跟我js基础没打好有着莫大的关系&#xff0c;但是还是耐着性子看完了&#xff0c; 不懂的东西都是百度上搜索&#xff0c;理解后再继续。下面是记录下来的笔记。 1&#xff09;如何避免JS冲突 A:匿名函数 在多人合作一个网…

OpenCV矩阵操作

矩阵类的成员函数可以进行很多基本的矩阵操作&#xff0c;在之前已经介绍过。除此之外&#xff0c;也有很多操作被表示为“友元”函数&#xff0c;它们的输入为矩阵类型&#xff0c;或者输出为矩阵类型&#xff0c;或者输入输出同为矩阵类型。下面将对这些函数及其参数进行详细…

LaTeX Error: Unknown graphics extension: .eps.解决办法

只要加一个包就行了&#xff01; \usepackage{epstopdf}

Android Studio中获取SHA1或MD5的方法

原来在Eclipse中获取SHA1或者MD5&#xff0c;在IDE界面上就可以查找到。 切换到Android Studio后&#xff0c;如何查看呢&#xff1f;找了半天没找到。那就老办法命令行。 第一步、打开Android Studio的Tools->Open Terminal... 第二步、输入命令&#xff1a;keytool -v -li…

关于机器意识的对话

来源&#xff1a; 人机与认知实验室S教授德高望重&#xff0c;建立了一个关于人工智能的微信群&#xff0c;吸引了很多关心人工智能的专业人士参与讨论。群中常有热烈的讨论。前些天恰好有一场关于机器意识的对话。感觉比较有意思&#xff0c;觉得放任这些讨论在微信群里被遗忘…