一、点的表示: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(5,5);//构造出的 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 模块中其他常用的知识点,如下。
- Matx 是个轻量级的Mat,必须在使用前规定好大小,比如一个 2*3 的float型的Matx,可以声明为 Matx23f。
- Vec 是 Matx 的一个派生类,是一个一维的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 中防止内存溢出的函数有alignPtr、 alignSize、 allocate、deallocate、fastMalloc、fastFree 等。
- <math.h> 里的一些函数使用起来很方便,有
计算向量角度的函数fastAtan2
计算立方根的函数cubeRoot
向上取整函数cvCeil
向下取整函数cvFloor
四舍五入函数cvRound等。
还有一些类似 MATLAB 里面的函数,比如
cvIsInf判断自变量是否无穷大,cvIsNaN判断自变量是否不是一个数。 - 显示文字相关的函数有 getTextSize、cvInitFont、 putText。
- 作图相关的函数有circle、 clipLine、ellipse、ellipse2Poly、line、rectangle、polylines、类Linelterator。
- 填充相关的函数有 fillConvexPoly、fillPoly。
- OpenCV 中 RNG() 函数的作用为初始化随机数状态的生成器。
其他数据结构相关的知识由于使用较少在此不再过多说明,在需要用到的时候读者可以配合OpenCV文档,并查阅OpenCV的源码进行学习。