1. Vec 对象类型

Vec 是一个主要用于数值向量的模板类。我们可以定义向量的类型和组件的数量:

Vec<double, 19> myVector

我们还可以使用任何的预定义类型:

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<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;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;

实现了以下所有向量操作:

v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2
v1 == v2
v1 != v2

2. 点的表示 Point 类

Point 类数据结构表示了二维坐标系下的点,即由其图像坐标 xy 指定的 2D 点。用法如下:

Point point;
point.x = 10;
point.y = 8;

或者

Point point = Point(10, 8 );

另外, 与 Vec 类一样, OpenCV 为方便起见定义了以下 Point 别名:

typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

所以, Point_<int>Point2iPoint 互相等价,Point_<float>Point2f 互相等价。

同样的,就像 Point 一样, Point3 模板类用于指定 3D 点。

OpenCVPoint 定义了以下运算符:

pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 = pt2 / a;
pt1 += pt2;
pt1 -= pt2;
pt1 *= pt2;
pt1 /= pt2;
double value = norm(pt);
pt1 == pt2;
pt1 != pt2;

3. 颜色的表示 Scalar 类

Scalar 对象类型是从 Vec 派生的模板类,有四个元素。

Scalar 表示具有 4 个元素的数组,在 OpenCV 中被大量用于传递和读取像素值,如 RGB 颜色值。而 RGB 颜色值为三个参数,其实对于 Scalar 函数来说, 如果用不到第四个参数, 则不需要写出来;若只写三个参数, OpenCV 会认为我们就想表示三个参数。

来看个例子。如果给出以下颜色参数表达式:

Scalar(b, g, r)
  • b 表示蓝色
  • g 表示绿色
  • r 表示红色

Scalar 类的源头为 Scalar_ 类,而 Scalar_ 类是 Vec4x 的一个变种,我们常用的 Scalar 其实就是 Scalar_<double> 。这就解释了为什么很多函数的参数输入可以是 Mat ,也可以是 Scalar

要访问 VecScalar 值,可以使用 [] 运算符,其初始化可以用传值的方式通过设置另一个标量、向量或值来完成,如下例所示:

Scalar s0(0);
Scalar s1(0.0, 1.0, 2.0, 3.0);
Scalar s2(s1);

4. 尺寸的表示 Size 类

OpenCV 中对 Size 类源代码有以下定义,用于指定图像或矩形大小。这个类添加了两个成员 widthheight ,以及有用的 area() 函数。

typedef Size_<int> Size2i;
typedef Size2i Size;

其中, Size_ 是个模板类,在这里 Size_<int> 表示其类体内部的模板所代表的类型为 int 。那这两句代码的意思,就是首先给已知的数据类型 Size_<int> 起个新名字, 叫 Size2i 。然后又给已知的数据类型 Size2i 起个新名字,叫 Size 。所以,连起来就是, Size_<int>Size2iSize 这三个类型名等价。

我们可以用 X.widthX.height 来分别表示其宽度和高度。

 Size s = Size(3, 4);cout << "s.width is " << s.width << endl;  // s.width is 3cout << "s.height is " << s.height << endl;  // s.height is 4

area 用法:

 Size s(10, 10);Mat img = Mat::zeros(s, CV_8UC1);s.width = 20;int area = s.area();cout << "area is " << area << endl; // area is 200

5. 矩形的表示 Rect 类

Rect 类的成员变量有 xywidthheight , 分别为左上角点的坐标和矩形的宽和高。常用的成员函数有:

  • Size() 返回值为 Size
  • area() 返回矩形的面积;
  • contains(Point) 判断点是否在矩形内;
  • inside(Rect) 函数判断矩形是否在该矩形内;
  • tl() 返回左上角点坐标;
  • br() 返回右下角点坐标。

值得注意的是,如果想求两个矩形的交集和并集, 可以用如下格式:

Rect rect = recti & rect 2;
Rect rect = recti | rect 2;

如果想让矩形进行平移操作和缩放操作, 甚至可以这样写:

Rect rectShift = rect + point;
Rect rectScale = rect + size;

Rect 模板类可用于定义图像的感兴趣区域( Region of Interest ,简称 ROI ),如下所示:

 Mat img = imread("demo.jpg");Rect r(0, 0, 100, 100);Mat img_roi = img(r);

6. 颜色空间转换 cvtColor 函数

cvtColor() 函数是 OpenCV 里的颜色空间转换函数, 可以实现 RGB 颜色向HSVHSI 等颜色空间的转换,也可以转换为灰度图像。原型如下:

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)

第一个参数为输入图像,第二个参数为输出图像,第三个参数为颜色空间转换的标识符,第四个参数为目标图像的通道数,若该参数是 0,表示目标图像取源图像的通道数。下面是一个调用示例:

/ /此句代码的 OpenCV2 版为:
cvtColor(srclmage, dstImage, CV_GRAY2BGR) ; // 转换原始图为灰度图
/ /此句代码的 OpenCV3 版为:
cvtColor(srclmage, dstlmage, C0L0R_GRAY2BGR) ; // 转换原始图为灰度图

即对于颜色空间转换, OpenCV2CV_ 前缀的宏命名规范,被 OpenCV3COLOR_ 式的宏命名前缀所取代。另外,在这里需要再次提醒大家的是, OpenCV 默认的图片通道存储顺序是 BGR , 即蓝绿红,而不是 RGB

7. 其它常用知识点

  • Matx 是个轻量级的 Mat ,必须在使用前规定好大小,比如一个 2*3 的 float 型的 Matx , 可以声明为 Matx23f
  • VecMatx 的一个派生类,是一个一维的 Matx ,跟 vector 很相似。在 OpenCV 源码中有如下定义。
template<typename_Tp, int n> class Vec : public Matx<_Tp, n, 1> { ... };
typedef Vec<uchar, 2> Vec2b;
  • Range 类其实就是为了使 OpenCV 的使用更像 MATLAB 而产生的。比如 Range::all() 其实就是 MATLAB 里的符号。而 Range(a,b) 其实就是 MATLAB 中的 a:b ,注意这里的 a 和 b 都应为整型。
  • OpenCV 中防止内存溢出的函数有 alignPtralignSizeallocatedeallocatefastMallocfastFree 等。
  • <math.h> 里的一些函数使用起来很方便:
  1. 有计算向量角度的函数 fastAtan2
  2. 计算立方根的函数 cubeRoot
  3. 向上取整函数 cvCeil
  4. 向下取整函数 cvFloor
  5. 四舍五入函数 cvRound 等。

还有一些类似 MATLAB 里面的函数,比如 cvlslnf 判断自变量是否无穷大, cvIsNaN 判断自变量是否不是一个数。

  • 显示文字相关的函数有 getTextSizecvInitFontputText
  • 作图相关的函数有 circleclipLineellipseellipse2Polylinerectanglepolylines 、类 Linelterator
  • 填充相关的函数有 fillConvexPolyfillPoly
  • OpenCVRNG() 函数的作用为初始化随机数状态的生成器。

OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)相关推荐

  1. Opencv笔记(十八)——轮廓的更多函数及其层次结构

    凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2 ...

  2. Java笔记09——常用类

    常用类 单例模式:是java中的一种设计模式,是优秀的程序员总结的一套比较成熟的健壮的一套规范.有23种,到架构师的时候才可以用到. 特点: 1.私有的构造器 2.静态的成员对象 3.公有的静态方法 ...

  3. OpenCV笔记02:用cv2.imread函数读取图片

    1.读取图片 import cv2 img = cv2.imread('image.jpg') print(img) 2. 查看输出 [[[ 33 26 103][ 34 21 100][ 34 15 ...

  4. opencv 简单、常用的图像处理函数(2)

    1.vc++配置opencv 2.简单常用的图片处理函数 3.图像修复函数 opencv的项目以来配置和环境变量的配置都很简单,对于我这个没有c++基础的来说,复杂的是opencv的api和一些大部分 ...

  5. Linux自学笔记 | 10 常用命令 - 压缩解压类

    Linux自学笔记 | 10 常用命令 - 压缩解压类 Linux自学笔记 | 01 文件系统和目录结构 Linux自学笔记 | 02 VIM编辑器的安装与使用 Linux自学笔记 | 03 Linu ...

  6. 【OpenCV】OpenCV实战从入门到精通之 -- 常用数据结构和函数(Point、Scalar、Size、Rect、cvtColor)

    目录 1.点的表示:Point类 2.颜色的表示:Scalar类 3.尺寸的表示:Size类 4.矩形的表示:Rect类 5.颜色空间转换:cvtColor()函数 1.点的表示:Point类 Poi ...

  7. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  8. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  9. jquery学习笔记及常用函数封装

    二.JQuery 学习笔记及常用函数封装 https://download.csdn.net/download/weixin_42530002/13087988 1.JQuery入门 (1).css选 ...

最新文章

  1. 服务器SSL/TLS快速检测工具TLLSSLed
  2. Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道
  3. 网络优化常见专业术语详解
  4. 计算机指定共享用户,局域网内共享文件夹给指定计算机
  5. 【Qt】modbus之串口模式读操作
  6. macbook配置java环境变量_配置mac上Java环境变量
  7. Spring模板对象
  8. Java并发(理论知识)—— 线程安全性
  9. php smarty2 框架,PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合
  10. python怎么读音发音英语-python style是什么意思
  11. 多种方式判断PC端,IOS端,移动端
  12. LwM2M(轻量级M2M)协议
  13. 电脑能正常上网上网,某些软件不能上网
  14. Linux中安装苹果系统
  15. opencv PIL读取图像得到的图像格式
  16. 手把手教你iPhone 3G手机软件开发
  17. 计算机网络技术期末论文,计算机网络技术专业论文题目 计算机网络技术论文题目怎么定...
  18. picturebox绑定datagridview
  19. Neurosynth package安装及使用
  20. 1. 数据库的四个基本概念

热门文章

  1. 基于Golang的CLI 命令行程序开发
  2. Java 多线程的基本方式
  3. 2022-2028年中国汽车橡胶件行业市场调查研究及前瞻分析报告
  4. 直方图_20210420
  5. Keras框架下的保存模型和加载模型
  6. MyBatis 一对多、多对一的处理~
  7. 使用Runtime执行推理(C++)
  8. 基于TensorRT优化的Machine Translation
  9. Cookie和Session的区别与联系
  10. 内存缓存LruCache的简单使用