学习OpenCV(3)了解OpenCV的数据类型-1

2023-05-16

目录

openCV的数据类型

基础类型

固定向量类cv::Vec<>

固定矩阵类 cv::Matx<>

cv::Point<>类

cv::Scalar<>

Size类

cv::Rect类

cv::RotatedRect类

复数类


openCV的数据类型

OpenCV有很多数据类型,他们都基于一些重要视觉概念的抽象而设计,以此提供相对简单、直观的表示和处理。

OpenCV的基础数据类型主要分为三类:

  1. 第一类是直接从C++原语中继承的基础数据类型(如int和float等)。

  2. 第二类是辅助对象:这些对象代表更抽象的概念,比如垃圾收集指针类、用于数据切片的范围对象(range objects)以及抽象的终止条件等。

  3. 第三类可以称为大型数组类型。这些对象原本目的是涵盖数组或一些其他的原语、程序集或更常见的基础数据类型。代表:cv::Mat

OpenCV还使用了很多标准模板库(STL)。OpenCV相当依赖vector类,许多OpenCV库函数在参数列表中有vector模板类。

基础类型

固定向量类cv::Vec<>

最简单的基础数据类型是模板类cv::Vec<>,它是一个原语的容器类,即固定向量类。

固定向量类是从固定矩阵类派生出来的,固定向量模板cv::Vec 是列为 1 的cv::Matx<>

cv::Vec<>是一个适用任何类型的容器。

虽然cv::Vec<>是模板,但一般使用它的别名(typedef)以便用于通用的实例。任何有着cv::Vec{2, 3, 4, 6}{b, w, s, i, f, d}形式的生命,对于2-6个维度的6种数据类型的任何组合都是有效的。

例如:

名称对应解释
cv::Vec2i2个元素的整型向量
cv::Vec3i3个元素的整型向量
cv::Vec4d4个元素的双精度浮点向量

6种数据类型的对应:

缩写数据类型
bunsigned char
wunsigned short
sshort
iint
ffloat
ddouble

cv::Vec 支持的操作

操作示例
默认构造函数cv::Vec2s v2s;
复制构造函数cv::Vec3f u3f(v3f);
值构造函数cv::Vec6d v6d(x0, x1, x2, x3, x4, x5);
成员访问u3f[i]; u3f(j); ( ()和[] 操作符都可以使用)
向量叉乘v3f.cross(u3f);(仅用于三维,其他异常)
int main()
{
	cv::Vec<int, 2> v3b;
	cv::Vec2b v2b(1, 2);
	cv::Vec2b v2b2(3, 5);

	cv::Vec3f v3b2(1, 2, 3);
	cv::Vec3f v3b3(2, 5, 3);

	int n = v2b[1];
	cout << "元素访问:" << (int)v2b[1] << (int)v2b(1) << endl;

	cv::Vec3f res = v3b2.cross(v3b3);
	cout << "叉乘:" << res[1] << endl;

	return EXIT_SUCCESS;
}

固定矩阵类 cv::Matx<>

cv::Matx<>并不是用于大型数组的,相反,它是设计用于一些特定的小型矩阵操作。

cv::Matx<>一般都以别名cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}的形式应用。

固定矩阵类的维度在编译之前必须已知,正因如此使得固定矩阵类的运算效率高,同时消除了许多动态内存分配操作。内部的数据都是在栈上分配的,所以分配和清楚都很快。

固定矩阵类也是在OpenCV的C++接口中基本类型的核心。

当你要表示一个用来处理矩阵代数的矩阵时,就需要用到固定矩阵类。

cv::Matx支持的操作

操作示例
默认构造函数cv::Matx33f m33f; cv::Matx43d m43d;
复制构造函数cv::Matxm22d(n22d);
值构造函数cv::Matx22d m(x0, x1, x2, x3);
含相同元素的矩阵m33f = cv::Matx33f::all(x);
全零矩阵m23d = cv::Matx23d::zeros();
全一矩阵m16f = cv::Matx16f::ones();
创建一个单位矩阵m33f = cv::Matx33f::eye();
创建一个可以容纳另一个矩阵对角线的矩阵m31f = cv::Matx33f::diag();
创建一个均匀分布的矩阵m33f = cv::Matx33f::randu(min, max);
创建一个正态分布的矩阵m33f = cv::Matx33f::nrandn(mean, variance);
成员访问m(i, j); m(i)(一个参数只对应一维矩阵)
矩阵代数运算m1 = m0; m1 * m0; 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 = (cv::Matx44f)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();
计算转置m44f = m44f.t();
逆矩阵n44f = m44f.inv(method);(默认方法:cv::DECOMP_LU)
解线性系统m31f = m33f.solve( rhs31f, method ); m32f = m33f.solve<2>( rhs32f, method );(默认方法:DECOMP_LU)
逐元素相乘m1.mul( m2 );

解线性系统:当隐含的矩阵方程的右边有多个列时使用模板的形式,在上例中,本质是在同时解决k个不同的系统,k的值必须作为模板参数传递给solve<>();它还决定结果矩阵中的列数。

bool cv::solve(
	inputArray		src1,
    inputArray		src2,
    outputArray		dst,
    int				flags = DECOMP_LU
);
//解线性方程 A*X=B
//src1 线性系统的左侧(相当于上面的A),src2 线性系统的右侧(相当于上面的B),dst 输出的解决方案(相当于要求解的X),flag为使用的方法
//使用CV_LU方法,如果src1不是奇异矩阵(奇异矩阵行列式为0 ,没有逆矩阵)则返回1,否则返回0 
//如果A是奇异矩阵 也就不存在逆矩阵 所以无法计算

cv::Point<>类

Point类由自己的模板派生的,但同时他们也可以从固定向量类转换得到。

Point类和固定向量类之间不同处:

  1. Point类:成员通过名称变量访问的(mypoint.x, mypoint.y)

  2. Vec类:成员通过下标访问(myvec[0], myvec[1])

Point类是通过别名调用作为一个正确模板的实例。这些别名可以是:cv::Point2i, cv::Point2f, cv::Point2d, cv::Point3i, cv::Point3f, cv::Point3d.

下表中有几个非常重要的受支持的操作,但它们是间接的通过隐式转换到固定向量类而受支持。这些操作显著包含所有的向量(vector)和标量(singleton),重载了线性代数的操作符以及比较运算符。

注释:singleton表示:任何类型的向量都是一个数组的实例。

Point类支持的操作

操作示例
默认构造函数cv::Point2i p;cv::Point3i p;
复制构造函数cv::Point3f p2(p1);
值构造函数cv::point2i(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 )(只针对3维point)
判断一个点p是否在矩形r内p.inside( r )(只针对2维point)

cv::Scalar<>

cv::Scalar本质上是一个四维Point类,且一般是双精度四元素向量的别名。其所有成员都是双精度浮点数。

cv::Scalar对象的元素是通过证书下标来访问的,与cv::Vec<>相同,因为cv::Scalar直接继承cv::Vec<double, 4>实例。

cv::Scalar类支持的操作

操作示例
默认构造函数cv::Scalar s;
复制构造函数cv::Scalar s2(s1);
值构造函数cv::Scalar s(x0); cv::Scalar s(x0, x1, x2, x3);
元素相乘s1.mul(s2);
(四元数)共轭s.conj();(返回cv::Scalar(s0, -s1, -s2, -s3))
(四元数)真值测试s.isReal(); (如果s1 == s2 == s3 == 0, 返回true)

cv::Scalar直接从固定向量类模板实例中继承而来,它继承了所有的向量代数操作、成员访问函数(操作符[])和一些固定向量类的特性。

Size类

Size类在实际操作时与Point类相似,而且可以与Point类相互转换。区别在于Point类的数据成员是x和y,而Size的成员是 width 和 height。

Size类有三个别名:cv::Size, cv::Size2i, cv::Size2f. 前两个是等价的。

Size类支持的操作

操作示例
默认构造函数cv::Size sz; cv::Size2i sz; cv::Size2f sz;
复制构造函数cv::Size sz2(sz1);
值构造函数cv::Size2f sz(w, h);
成员访问sz.width, sz.height;
计算面积sz.area();

cv::Rect类

矩形类包含Point类的成员x和y(矩形左上角)和Size类的成员width和height(代表矩形的大小)。然而他们并没有继承关系。

cv::Rect支持的操作

操作示例
默认构造函数cv::Rect r;
复制构造函数cv::Rect r2(r1);
值构造函数cv::Rect(x, y, w, h);
由起始点和大小构造cv::Rect(cv::Point, cv::Size);
由两个对角构造cv::Rect(cv::Point, cv::Point);
成员访问r.x; r.y; r.width; r.height
计算面积r.area()
提取左上角r.tl();
提取右下角r.br();
判断点p是否在矩形r内r.contains(p);

cv::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;
扩大矩形r s大小cv::Rect rs = r + s; r += s;
比较矩形r1 和矩形r2是否相等bool eq = (r1 == r2);
比较矩形r1 和矩形r2是否不相等bool ne = (r1 != r2);

cv::RotatedRect类

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

  1. cv::RotatedRect 是以中心为原点

  2. cv::Rect 以左上角为原点

cv::RotatedRect 支持的操作

操作示例
默认构造函数cv::RotatedRect rr();
复制构造函数cv::RotatedRect rr2(rr1);
从两个点构造cv::RotatedRect(cv::Point, cv::Point);
值构造函数(一个点,一个大小,一个角度)cv::RotatedRect rr(cv::Point, cv::Size, float angle);
成员访问rr.center, rr.size, rr.angle;
返回四个角的列表rr.points(pts[4]);

复数类

OpenCV的复数类与STL复数类模板complex<> 不一样,但与之兼容,可以互相转换。

区别:STL中,使用成员函数 real() 和 imag() 获取实部和虚部

OpenCV中通过成员变量 re 和 img 获取。

Opencv复数类支持的操作

操作示例
默认构造函数cv::Complexf z1; cv::Complexd z2;
复制构造函数cv::Complexf z2(z1);
值构造函数cv::Complexd z1(re0);cv::Complexd(re0, im1);
复制构造函数cv::Complexf u2f(v2f);
成员访问z1.re; z1.im;
复共轭z2 = z1.conj();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习OpenCV(3)了解OpenCV的数据类型-1 的相关文章

  • 使用 OpenCV 进行车牌识别

    我有一个项目 需要使用 OpenCV 识别汽车的车牌 我想加载数字或字母的图像 让 OpenCV 识别它并将其打印到控制台 有一个函数可以做到这一点吗 如果没有 我该怎么办 Note 我正在研究灰度级 请帮忙 我必须在一周后完成 谢谢你的快
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 使用畸变从图像平面计算相机矢量

    我正在尝试使用相机模型来重建可以使用某些相机及其 外部 内部 参数拍摄的图像 这一点我没有任何问题 现在我想添加扭曲 正如它们中所描述的那样OpenCV https docs opencv org 4 x dc dbb tutorial p
  • 如何使用 OpenCV 找到红色区域? [复制]

    这个问题在这里已经有答案了 我正在尝试编写一个检测红色的程序 然而有时它比平常更暗 所以我不能只使用一个值 检测不同深浅的红色的最佳范围是多少 我目前使用的范围是 128 0 0 255 60 60 但有时它甚至检测不到我放在它前面的红色物
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中
  • cv2.cv.BoxPoints(rect) 返回什么?

    rect cv2 minAreaRect largest contour rect rect 0 0 self scale down rect 0 1 self scale down rect 1 0 self scale down rec
  • 将四边形(四边形)拟合到斑点

    应用不同的过滤和分割技术后 我最终得到如下图像 我可以访问一些轮廓检测函数 这些函数返回该对象边缘上的点列表 或者返回一个拟合的多边形 尽管有很多边 远多于 4 个 我想要一种将四边形适合该形状的方法 因为我知道它是应该是四边形的鞋盒的正面
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • opencv如何使用compareHist函数

    img cv2 imread mandrill png histg cv2 calcHist img 0 None 256 0 256 if len sys argv lt 2 print gt gt sys stderr Usage sy
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 使用 openCV 和 python 检测物体

    我正在尝试使用 OpenCV 和 Python 检测下图中的白点 我尝试使用函数 cv2 HoughCircles 但没有成功 我需要使用不同的方法吗 这是我的代码 import cv2 cv import numpy as np impo
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 在 RGB 图像上绘制多类语义分割透明叠加

    我有语义分割掩码的结果 值在 0 1 之间 需要大津阈值来确定什么是积极的 我想直接在 RGB 图像上绘制 在 RGB 图像上每个预测类具有不同的随机颜色 我使用以下内容绘制了具有单一颜色的单个蒙版 是否有一个包或简单的策略可以为多类别做到
  • 来自 OpenCV 的外部参数

    我正在使用 OpenCV 来校准立体相机对 我拍摄了各种校准照片 并且使用 cv2 calibrateCamera 对内在参数进行了令人满意的拟合 然而 目前尚不清楚如何获取外部参数 该函数仅返回cameraMatrix 尽管它很有用 但实
  • 我是否必须使用我的数据库训练 Viola-Jones 算法才能获得准确的结果?

    我尝试提取面部数据库的面部特征 但我认识到 Viola Jones 算法在两种情况下效果不佳 当我尝试单独检测眼睛时 当我尝试检测嘴巴时 运作不佳 检测图像的不同部分 例如眼睛或嘴巴 或者有时会检测到其中几个 这是不可能的情况 我使用的图像
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 如何将输出视频保存到 OpenCV 中的文件中

    我想将输出视频保存到文件中而不是显示它并尝试使用 cvcaptureimage 但仍然无法获得结果 include
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma

随机推荐