常用数据结构和函数

一、点的表示:Point类

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

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

或者

Point point = Point(10, 8);

另外,在OpenCV中有如下定义:

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

所以, Point_< int>、 Point2i、 Point 互相等价,Point < float>、 Point2f 互相等价。

二、颜色的表示:Scalar 类

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

来看个例子。 如果给出以下颜色参数表达式:
Scalar(a, b, c)
那么定义的RGB颜色值:红色分量为c,绿色分量为b,蓝色分量为a。

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

三、尺寸的表示: Size类

通过在代码中对Size 类进行“转到定义” 操作,我们可以…e…sources modules coreincludelopencv2lcorelcore.hpp路径下,找到Size类相关的源代码:
(41137465皆5一R拿0月∞手
⑨➊ rR^底

通过在代码中对 Size类 进行 “转到定义” 操作,我们可以在 …\opencv\sources\modules\core\include\opencv2\core\core.hpp 路径下,找到Size类相关的源代码:

typedef Size_<int> Size2i;
typedef Size2i Size;

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

然后我们追根溯源,找到Size模板类的定义:
在这里插入图片描述
在这里插入图片描述

可以看到Size模板类的内部又是重载了些构造函数,其中,我们使用频率最高的是下面这个构造函数:

Size_( _TP _width, _Tp _height);

另外,代码末尾定义了模板类型的宽度和高度:

_Tp width, height; //宽度和高度

于是我们可以用 XXX.width 和 XXX.height 来分别表示其宽度和高度。

下面给出一个示例,方便大家理解。

size(55);//构造出的 size宽度和高度都为5,即XXX.width和XXX.height都为5

四、矩形的表示: Rect类

Rect类的成员变量有 x、y、width、 height,分别为左上角点的坐标和矩形的宽和高。
常用的成员的数有:
Size() 返回值为 Size;
area() 返回矩形的面积;
contains(Point)判断点是否在矩形内;
inside(Rect)函数判断矩形是否在该矩形内;
tl()返回左上角点坐标;
br()返回右下角点坐标。

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

Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;

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

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

五、颜色空间转换: cvtColor()函数

cvtColor() 函数是OpenCV里的颜色空间转换函数,可以RGB颜色向HSV、HSI等颜色空间的转换,也可以转换为灰度图像

原型如下:

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

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

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

而随着OpenCV版本的升级,cvtColor()函数对于颜色空间种类的支持也是越来越多。
其标识符列举如下表所示。
在这里插入图片描述
在这里插入图片描述
即对于颜色空间转换,OpenCV2 的CV_前缀的宏命名规范,被OpenCV3中COLOR_式的宏命名前缀所取代。另外,在这里需要再次提醒大家的是,OpenCV默认的图片通道存储顺序是BGR,即蓝绿红,而不是RGB。

最后,附上进行颜色空间转换的最简代码,大家可以选择上表中列举的宏替换掉 cvtColor 函数中名为 COLOR_BGR2Lab 的宏,进行 cvtColor 函数的测试。

#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

void main()
{
	// 读入一张图片(poyanghu缩小图)    
	Mat srcImage = imread("1.jpg", 1), dstImage;
		
	// 转换颜色空间    
	cvtColor(srcImage, dstImage, COLOR_BGR2Lab);
	
	// 显示效果图   
	imshow("效果图", dstImage);
	
	// 保持窗口显示    
	waitKey();
}

六、其他常用的知识点

本小节我们列举下 OpenCV 的 Core 模块中其他常用的知识点,如下。

  1. Matx 是个轻量级的Mat,必须在使用前规定好大小,比如一个 2*3 的float型的Matx,可以声明为 Matx23f。
  2. Vec 是 Matx 的一个派生类,是一个一维的Matx,跟 vector 很相似。在OpenCV源码中有如下定义。
    template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {…};
    typedef Vec<uchar, 2> Vec2b;
  3. Range类其实就是为了使 OpenCV 的使用更像 MATLAB 而产生的。比如 Range::all()其实就是MATLAB里的符号。而Range(a, b)其实就是MATLAB中的 a:b ,注意这里的a和b都应为整型。
  4. OpenCV 中防止内存溢出的函数有alignPtr、 alignSize、 allocate、deallocate、fastMalloc、fastFree 等。
  5. <math.h> 里的一些函数使用起来很方便,有
    计算向量角度的函数fastAtan2
    计算立方根的函数cubeRoot
    向上取整函数cvCeil
    向下取整函数cvFloor
    四舍五入函数cvRound等。
    还有一些类似 MATLAB 里面的函数,比如
    cvIsInf判断自变量是否无穷大,cvIsNaN判断自变量是否不是一个数。
  6. 显示文字相关的函数有 getTextSize、cvInitFont、 putText。
  7. 作图相关的函数有circle、 clipLine、ellipse、ellipse2Poly、line、rectangle、polylines、类Linelterator。
  8. 填充相关的函数有 fillConvexPoly、fillPoly。
  9. OpenCV 中 RNG() 函数的作用为初始化随机数状态的生成器。

其他数据结构相关的知识由于使用较少在此不再过多说明,在需要用到的时候读者可以配合OpenCV文档,并查阅OpenCV的源码进行学习。

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/87385481