OpenCV基础数据类型
发布日期:2021-05-04 19:17:36 浏览次数:55 分类:精选文章

本文共 3450 字,大约阅读时间需要 11 分钟。

1. 基础数据类型(basic data types)

首先记住六种数据类型:

  • b = unsigned char
  • w = unsigned short
  • s = short
  • i = int
  • f = float
  • d = double

Point 类

Point类是OpenCV中最基础、最简单的类型。

操作 例子
默认构造 cv::Point2i p;
cv::Point3f p;
拷贝构造 cv::Point3f p2( p1 );
赋值 cv::Point2i p( x0, x1);
cv::Point3d p( x0, x1, x2 );
强制转换类型 (cv::Vec3f) p;
访问成员 p.x; p.y; //三维的话:p.z
点积 float x = p1.dot( p2 ); //点积是对应元素相乘再向加
双精度点积 double x = p1.ddot( p2 );
叉乘 p1.cross( p2 ); //只有三维点类有用,返回值为Point类
判断点是否在矩形内 p.inside( r ); //只对二维点有效,返回值为bool

Scalar 类

标量类,用来平移图像或者用于Mat颜色通道的赋值。

操作 例子
默认构造 cv::Scalar s;
拷贝构造 cv::Scalar s2( s1 );
赋值构造 cv::Scalar s ( x0 ); cv::Scalar s( x0, x1, x2, x3 );
逐元素乘法 s1.mul( s2 ); //相同位置元素相乘,返回同类型
s2 = [5, 2, 3, 4]
s1 = [1, 2, 3, 4]
s1.mul(s2) = [5, 4, 9, 16]
(四元数)共轭 s.conj(); // ( returns cv::Scalar(s0, -s1, -s2, -s3))
(四元数)为真 s.isReal(); // ( returns true if s1s2s3==0)

Size 类

定义一个有大小的矩形框,帮助构造Rect、Mat等

操作 例子
默认构造 cv::Size sz;
cv::Size2i sz;
cv::Size2f sz;
拷贝构造 cv::Size sz2( sz1 );
赋值构造 cv::Size2f sz( w, h ); //w = width, h = height
访问成员 sz.width;
sz.height;
计算面积 sz.area();

Rect 类

感兴趣区间

操作 例子
默认构造 cv::Rect r;
拷贝构造 cv::Rect r2 ( r1 );
赋值构造 cv::Rect r( x, y, w, h);
从点(point类)和大小(size类)来构造 cv::Rect r( p, sz );
两个点来构造 cv::Rect r( p1, p2 );
访问成员 r.x; r.y; r.width; r.height;
面积 r.area();
左上角的点 r.tl();
右下角的点 r.br();
点p是否在矩形rect内 r.contains( p );


关于Rect的函数重载 例子
两矩形交集
(r1 和 r2)
cv::Rect r3 = r1 & r2;
r1 &= r2;
包含两矩阵最小区域
(r1 和 r2)
cv::Rect r3 = r1 | r2;
r1 |= r2;
平移
( r 平移 x(用Point来构造))
cv::Rect rx = r + x;
r += x;
扩大
( r 扩大 s(用Size来构造))
cv::Rect = rs = r + s;
r += s;
判断相等 bool eq = ( r1 == r2 );
判断不相等 bool ne = ( r1 != r2);

RotatedRect 类

  • cv::Point2f 用于定义 center

  • cv::Size2f 用于定义 size

  • float 用于定义 angle

操作 例子
默认构造 cv::RotatedRect rr();
拷贝构造 cv::RotatedRect rr2( rr1 );
赋值构造
(从三点构造)
cv::RotatedRect( p1 , p2, p3 );
赋值构造
(从中心点、尺寸、旋转角度)
cv::RotatedRect( p, sz, theta )
访问成员 rr.center; rr.size; rr.angle;
返回列表(四个点的坐标) rr.points ( pts[4] );

注:返回列表依次为(pts[0] – 左下角、pts[1] – 右下角、pts[2] – 右上角、pts[3] – 左上角)

Matx 类(固定尺寸)

  • 固定矩阵类的大小固定,往往比较小,编译速度很快

  • 形式如: cv::Matx{1,2,3,…}{1,2,3,…}{f, d}

  • 图片或者大型点构成的数组不适用

操作 例子
默认构造 cv::Matx33f m33f;
cv::Matx43d m43d
拷贝构造 cv::Matx22d m22d( n22d );
赋值构造 cv::Matx21f m(x0, x1);
cv::Matx33d m(x0,x1,x2,x3,x4,x5,x6,x7,x8);
赋特殊值 m33f = cv::Matx33f::all( x );
赋0 m23d = cv::Matx23d::zeros();
单位矩阵 m33f = cv::Matx33f::eye();
接收主对角的元素 cv::Matx31f m31f = m33f.diag();
均匀分布条目的矩阵 m33f = cv::Matx33f::randu( min, max );
正态分布条目的矩阵 m33f = cv::Matx33f::randn( mean, variance );
访问成员 m( i , j );
m( i ); //一维矩阵有效
矩阵算术 m1 = m0;
m0 * m1;
m0 + m1;
m0 - m1;
数乘 m * a; a * m; m / a;
比较 m1 == m2; m1 != m2;
点积 m1.dot( m2 );
m1.ddot( m2 ); //双精度
Reshape m91f = m33f.reshape<9,1>();
强制转换 m44f = (Matx44f)m44d;
在某点(0,1)
提取axb(2x3)的矩阵
Matx23f m23f = m44f.get_minor<2,3>(0,1);
提取行 m14f = m44f.row( i );
提取列 m41f = m44f.col( j );
提取对角 m41f = m44f.diag();
转置 m44f = m44f.t();
m44f = m44f.inv( method );
//默认方法为 cv::DECOMP_LU
解线性系统
x1 + x2 + x3 = 6
x1 + 0 + x3 = 4
2x1+ x2 + x3 + 7
Ax = b
Matx33f A(1,1,1,1,0,1,2,1,1);
cout << “A= \n” << A << endl;
Matx31f b(6,4,7);
cout << “b= \n” << b << endl;
Matx31f x = A.solve(b);
cout << “x= \n” << x << endl;
每个元素的乘法 m1.mul(m2);

Vec 类(固定尺寸)

  • Vec类是Matx类更为简单的形式,就是Matx类的列为1。

  • 形如:cv::Vec{2,3,4,6}{b,s,w,i,f,d}

操作 例子
默认构造 Vec2s v2s; Vec6f v6f;
拷贝构造 Vec3f u3f( v3f );
赋值构造 Vec2f v2f(x0, x1); Vec6d v6d(x0,x1,x2,x3,x4,x5)
访问成员 v4f[ i ]; v3w( j ); []和()都可以工作
叉乘 v3f.cross( u3f );

complex number classes

2. 帮助类型(helper objects)

3. 大型数组类型(large array types)

上一篇:SLAM求职和学习经验
下一篇:前端学习笔记52-相对定位

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月29日 12时57分50秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章