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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

OpenCV矩阵操作

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

关于机器意识的对话

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

OpenCV绘图和注释

OpenCV的绘图函数可以在任意深度的图像上工作&#xff0c;但在大多数情况下&#xff0c;它们只对图像的前三个通道有影响BGR&#xff0c;如果是单通道图像&#xff0c;则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型和亚像素对齐等参数。 艺术线条 …

012.对netmap API的解读

一.简要说明&#xff1a; 1.netmap API主要为两个头文件netmap.h 和netmap_user.h &#xff0c;当解压下载好的netmap程序后&#xff0c;在./netmap/sys/net/目录下&#xff0c;本文主要对这两个头文件进行分析。 2.我们从netmap_user.h头文件开始看起。 二.likely()和unlikely…

【学术笔记】探索大脑静息态活动中的动态信息

来源&#xff1a;脑科学2019年6月18日下午&#xff0c;来自加州大学河滨分校(The University of California, Riverside) Bourns工程学院的生物工程系主任Xiaoping Hu (胡小平)教授应北京大学麦戈文脑研究所方方老师的邀请来到北京大学&#xff0c;在王克桢楼1113室为老师和同学…

OpenCV中的函数子

随着OpenCV的发展&#xff0c;封装了越来越多的功能&#xff0c;而往往这些功能不是一个函数就能完成的&#xff0c;实现为一组函数又会导致整个库的函数变得杂乱无章&#xff0c;因此常常使用一个新的对象类型来实现这个新功能。通过重载operator()来生成对象或函数子。下面主…

查找会议论文的会议地址

有时候会议论文conference proceedings引用格式中要求出现会议地址&#xff0c;如下所示 查找会议地址的方法为直接搜索该会议论文&#xff0c;以ieee为例&#xff0c;会议地址信息在该论文的首页信息中&#xff1a; Conference Location: Arlington, VA, USA中的三项就分别对应…

OpenCV可移植图形工具HighGUI实现图像和视频操作

OpenCV把用于操作系统、文件系统以及摄像机等硬件设备交换的函数纳入了HighGUI&#xff08;High-level Graphical User Interface&#xff09;模块中。有了HighGUI模块&#xff0c;我们可以方便地打开窗口、显示图像、读出或写入图像相关的文件、鼠标事件和键盘事件。下面将对三…

华为内部深度解读,关于5G发展的28个核心问题

来源 | 腾讯深网关于5G技术动态与商用进展业界最关心的核心问题&#xff0c;华为5G产品线相关负责人近日对《深网》等进行了详细解读&#xff0c;以下是《深网》整理的问答实录&#xff1a;一、5G先进性与行业应用1. 5G到底是什么&#xff1f;和4G比有什么不一样&#xff1f;从…

OpenCV鼠标事件和滑动条事件

鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成。 void your_mouse_callback(int event, int x, int y, int flags, void* param) 其中&#xff0c;第一个参数要指明事件&#xff0c;第二个和第三个参数是鼠标事件的位置&#xff0c;第四个参数是标志位&#xff0c;第…

GSMA:中国有望成为全球领先的5G市场之一

来源&#xff1a;GSMA移动智库近日&#xff0c;GSMA&#xff08;全球移动通信协会&#xff09;发布首个《中国移动经济发展报告2019》。报告称&#xff0c;中国的移动生态系统在2018年为中国经济创造了5.2万亿元 (7,500亿美元) 的附加值&#xff0c;相当于2018年中国GDP的5.5%。…

canal —— 阿里巴巴mysql数据库binlog的增量订阅消费组件

阿里巴巴mysql数据库binlog的增量订阅&消费组件canal &#xff0c;转载自 https://github.com/alibaba/canal 最新更新 canal QQ讨论群已经建立&#xff0c;群号&#xff1a;161559791 &#xff0c;欢迎加入进行技术讨论。canal消费端项目开源: Otter(分布式数据库同步系统…

OpenCV的滤波与卷积

目录 预备知识 滤波、核和卷积 边界外推和边界处理 阈值化操作 Otsu算法 自适应阈值 平滑 简单模糊和方框型滤波器 中值滤波器 高斯滤波器 双边滤波器 导数和梯度 索贝尔导数 Scharr滤波器 拉普拉斯变换 图像形态学 膨胀和腐蚀 通用形态学函数 开操作和闭操…

中国科协发布20个重大科学问题和工程技术难题

来源&#xff1a;晓艳的科技坊6月30日&#xff0c;中国科协在第二十一届中国科协年会闭幕式上发布了2019年20个对科学发展具有导向作用、对技术和产业创新具有关键作用的前沿科学问题和工程技术难题。   中国科学院院士、中国科协名誉主席韩启德表示&#xff0c;中国科协重大…

OpenCV常见的图像变换

拉伸、收缩、扭曲和旋转 最简单的图像变换是调整图像大小&#xff0c;使其变大或变小。但实际操作时要比想象的复杂一些&#xff0c;因为调整大小带来了像素如何插值&#xff08;放大&#xff09;或合并&#xff08;减少&#xff09;的问题。 均匀调整 cv::resize() void c…

边缘计算对于工业物联网的重要性

来源&#xff1a;物联网世界随着物联网的发展&#xff0c;工业制造设备所产生的数据量将越来越多。如果这些数据都要放到云端处理&#xff0c;就需要无穷无尽的频谱资源、传输带宽和数据处理能力&#xff0c;“云”难免不堪重负&#xff0c;此时就需要边缘计算来分担云计算的压…