Vec系列数据结构是Matx的一个派生类,其矩阵的行的大小永远固定为一行,列大小从1到6不等,可以认为类似与C++ vector,但与C++ 的vector又有很大不同,,以下不同来自于一段技术博客,讲的比较清楚:

                                                                                OpenCVC++ STL中的向量类比对
Item OpenCV C++ STL
数据存储

加快程序的运行效率(节省动态申请的时间)

动态申请内存

容器类型

1.固定大小向量类在编译期间就知道维度的向量且维度相对小

2.通常情况下仅用来装载C语言中原生的int或float基本类型

可以装载任何类型甚至包含自定义的类类型。

下面来自以《learning Opencv3》对vec与 STL vector的说明:

Why not just use STL classes? The key difference is that fixed vector classes are intended for small vectors whose dimensions are known at compile time, This allows for particularly efficient code to handle small common operations.

Vec 预定义

Vec的格式如下:

cv:;Vec{2,3,6,}{b,s,w,i,f,d}

{2,3,6}:为矩阵的列大小,行永远为1

{b,s,w,i,f,d}:为数据类型。b为uchar,s为short, w为ushort, i为int,f为float,d为double

提前预定义的有如下:

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

以上基本能够满足需求使用。

Vec类

Vec的类继承了Matx类,是一种特殊的矩阵,相当于Matx的行为1,由其定义就可以看出

Vec类方法总结如下:

Method Description
Vec 默认构造函数
 Vec(_Tp v0)  1-element构造函数
Vec(_Tp v0, _Tp v1)   2-element构造函数
Vec(_Tp v0, _Tp v1, _Tp v2)   3-element  构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3)   4-element 构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4)    5-element 构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5)    6-element  构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6)    7-element 构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7)    8-element  构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8)    9-element 构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9)   10-element 构造函数
Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9, _Tp v10, _Tp v11, _Tp v12, _Tp v13)   14-element 构造函数
Vec(const _Tp* values)   数组初始化函数
Vec(std::initializer_list<_Tp>)   list初始化函数
Vec(const Vec<_Tp, cn>& v)   copy构造函数
 static Vec all(_Tp alpha)  将所有的元素的值为 alpha
Vec mul(const Vec<_Tp, cn>& v)  矩阵元素相乘
Vec conj()   矩阵共轭
Vec cross(const Vec& v)    矩阵叉乘 为两个三元素矩阵
template<typename T2> operator Vec<T2, cn>() 类型强转,转换成其他类型的vec
const _Tp& operator [](int i) operator中的[]重构,能够像访问数组一样直接访问
_Tp& operator[](int i) operator中的[]重构,能够像访问数组一样直接访问
onst _Tp& operator ()(int i) operator中的()重构,能够直接使用()进行元素访问
_Tp& operator ()(int i) operator中的()重构,能够直接使用()进行元素访问
Vec<_Tp, cn>& operator=(const Vec<_Tp, cn>& rhs) = default; operator =重构
Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_AddOp) 矩阵相加
Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_SubOp) 矩阵相减
template<typename _T2> Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp) 矩阵缩放

下面例子列举出了几种创建初始化Vec的几种方法:

#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{Vec3i v3i;Vec3i v3i1(1, 2, 3);int value[] = { 4,5,6 };Vec3i v3i2(value);cout << "v3i= " << v3i << endl;cout << "v3i1= " << v3i1 << endl;cout << "v3i2= " << v3i2 << endl;Vec3i v3i3 = Vec3i::all(10);cout << "v3i3= " << v3i3 << endl;Vec3f v3i4;for (int i = 0; i < v3i4.rows; i++){v3i4[i] = i;}cout << "v3i4= " << v3i4 << endl;Vec3i v3i5;for (int i = 0; i < v3i5.rows; i++){v3i5(i) = i+10;}cout << "v3i5= " << v3i5 << endl;
}

运行结果:

其他用例:

#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{Vec3i v3i;Vec3i v3i1(1, 2, 3);Vec3i v3i2(4, 5, 6);cout << "v3i1 = " << v3i1 << endl;cout << "v3i2= " << v3i2 << endl;cout << "v3i1.mul(v3i2)= " << v3i1.mul(v3i2) << endl;cout << "v3i1.cross(v3i2)= " << v3i1.cross(v3i2) << endl;
}

运行结果:

Vec operator

由于Vec是继承了Matx类,所以Matx类的operator也同样做了继承,支持的operato和Matx一样,支持的主要如下:

All the expected vector operations are also implemented:
       -   v1 = v2 + v3
       -   v1 = v2 - v3
       -   v1 = v2 \* scale
       -   v1 = scale \* v2
       -   v1 = -v2
       -   v1 += v2 and other augmenting operations
       -   v1 == v2, v1 != v2
       -   norm(v1) (euclidean norm)

用例:

#include <stdio.h>
#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{Vec3i v3i;Vec3i v3i1(1, 2, 3);Vec3i v3i2(4, 5, 6);cout << "v3i1 = " << v3i1 << endl;cout << "v3i2= " << v3i2 << endl;cout << "v3i1+ v3i2= " << (v3i1 + v3i2) << endl;cout << "v3i1- v3i2= " << (v3i1 - v3i2) << endl;cout << "v3i1*2 = " << v3i1*2 << endl;cout << "v3i1/2 = " << v3i1 / 2 << endl;cout << "2* v3i1 = " << 2* v3i1 << endl;cout << "-v3i1 = " << (-v3i1) << endl;cout << "v3i1 == v3i2: " << (v3i1 == v3i2) << endl;cout << "v3i1 != v3i2: " << (v3i1 != v3i2) << endl;v3i1 += v3i2;cout << "v3i1 += v3i2: " << v3i1 << endl;
}

运行结果:

OpenCV中基本数据结构(7)_Vec相关推荐

  1. OPENCV中图像数据结构及其转化

    OPENCV中图像数据结构及其转化 1. IplImage 它是openCV库中表示图像的结构体. 初始化: cvLoadImage(),cvCreateImage() 访问元素:[行指针] b = ...

  2. OPENCV中的数据结构总结

    最近在写自己的算法,其实就是对一些传统算法的改进.传统算法可以参考opecv的源代码.在阅读源代码的过程中,我慢慢领会到了opencv的强大之处,并不是因为它实现了各种算法,而是在于它对于基本数据结构 ...

  3. OpenCV中的数据结构

    首先介绍2维点对Point_,它的是一个模板类.我们可以直接访问数据成员x,y.它不仅定了+.-.==.!=这4个基本的操作,还定义了点乘.叉乘等操作.特别的这个类还提供了inside函数来判断一个点 ...

  4. OpenCV中基本数据结构(4)_Rect

    Rect数据结构经常是在OpenCV中被用来表示为一个矩形尺寸,其成员包括x,y, width,height,其中x和y分别表示矩形框的左上角的起始点坐标,width和height分别表示宽和高. R ...

  5. OpenCV中基本数据结构(1)_Point

    为了便于对一些常见的数据进行操作,OpenCV定义了一些常见的数据结构(Point ,Scalar等),以方便后续对数据算法的实现,主要分为basic data type.helper objects ...

  6. OpenCV中基本数据结构(8)_Complex

    Complex为OpenCV中的复数表示类,与STL 中的complex类似但是不一样,两者可以互换,与STL的complex最大的不同是,STL中获取到实部和虚部的值 分别使用real()和imag ...

  7. OpenCV中基本数据结构(6)_Matx

    Matx为OpenCV轻量级的矩阵,被称为fixed matrix classes,意思是每个矩阵的大小都是固定的,主要是应对矩阵数据比较小的场景,最新的版本4.0不超过6*6大小的矩阵,旧版本一般不 ...

  8. OpenCV中基本数据结构(5)_RotatedRect

    RotatedRect也是表示一个矩形框,但是与Rect不同的是,RotatedRect可以带倾斜角的矩形,如下图所示: RotatedRect结构中包括三个变量: Point2f center:为矩 ...

  9. OpenCV中Mat数据结构使用举例

    #include "stdafx.h" #include <string> #include <iostream> #include <opencv2 ...

最新文章

  1. oracle 数据导入导出
  2. 关于WM_NCHITTEST消息(移动无标题对话框多个)
  3. [驱动注册]platform_driver_register()与platform_device_register()
  4. 可怕又可笑的看病经历
  5. Android O: View的绘制流程(二):测量
  6. java同步方法的特点_java多线程有哪些优点?同步实例代码展示
  7. php留言板实现留言评价,PHP实现留言板功能的思路
  8. 计算机在管理会计应用中的作用,信息化在管理会计中的作用
  9. 用Java描述数据结构之栈和队列,以及栈和队列的常用方法
  10. (转)oracle表分区详解
  11. 我的k8s随笔:命令实践
  12. 程序安装出现错误代码为2869
  13. Shell 特殊字符大全
  14. 【CCCC】L2-022 重排链表 (25分),,链表遍历
  15. Windows Media Player 键盘快捷键
  16. 终于解决了x64 win7上运行金山词霸的问题
  17. 电脑知识与技术杂志电脑知识与技术杂志社电脑知识与技术编辑部2022年第15期目录
  18. TrackFormer: Multi-Object Tracking with Transformers
  19. [高数][高昆轮][高等数学上][第一章-函数与极限]01.映射与极限
  20. ApriTag2 检测方法

热门文章

  1. JeecgBoot的前端Form升级为FormModel用法(支持 v-model 绑定)
  2. UI标签库专题十:JEECG智能开发平台 Form(form标签)
  3. 开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm
  4. 一个ALV(OO)的实例
  5. PDM 导出Excel
  6. Vim/Vi常用操作(第二版)
  7. svn中status为missing的文件的处理方式
  8. 云文件共享将为安全团队带来新的难题
  9. python之协程函数、递归、二分法
  10. Java创建型模式的讨论