1 点的表示: Point 类
Point 类数据结构表示了 二维坐标系下的点,即由其图像坐标 x 和 y 指定的 2D点。用法如下 :
Point point;
point.x = 10;
point.y = 8 ;
//或者
Point point= Poin 七 (10 , 8) ;
另外 , 在 OpenCV 中有如下定义:
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
所以, Point <int> 、 Point2i 、 Point 互相等价 , Point <float> 、 Point2f 互相等价 。
2 颜色的表示 : Scalar 类
Scalar()表示具有 4 个元素的数组,在 OpenCV 中被大品用于传递像素值,如 RGB颜色值。 而 RGB 颜色值为三个参数,其实对于 Scalar 函数来说,如果用不到第四个参数 , 则不需要写 出来 ; 若只写三个参数, OpenCV 会认为我们就想表示三个参数。
来看个例子 。 如果给出以下颜色参数表达式:
Scalar(a, b, c )
那么定义的 RGB 颜色值:红色分量为 C , 绿色分批为 b, 蓝色分量为 a 。
Scalar 类的源头为 Scalar_类 ,而 Scalar_类是 Vec4x 的一个变种,我们常用的Sca lar 其实就是 Scalar_<double> 。 这就解释了为什么很多函数的参数输入可以是Mat, 也可以是 Scalar。
3 尺寸的表示 : Size 类
typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> Size2d;
typedef Size2i Size;
Size 类相关的源代码 :
template<typename _Tp> class Size_
{
public:
typedef _Tp value_type;
//! various constructors
Size_();
Size_(_Tp _width, _Tp _height);
Size_(const Size_& sz);
Size_(const Point_<_Tp>& pt);
Size_& operator = (const Size_& sz);
//! the area (width*height)
_Tp area() const;
//! true if empty
bool empty() const;
//! conversion of another data type.
template<typename _Tp2> operator Size_<_Tp2>() const;
_Tp width, height; // the width and the height
};
可以看到 Size_模板类的内 部又是重载 了一些构造函 数 , 其中 , 我们使用频率
最高的是下面这个构造函数 :
Size_(_Tp _width, _Tp _height);
另外,代码末尾定义了模板类型的宽度和高度 :
_ Tp width , height ; //宽度和高度
于是我们可以用 XXX.widtb 和 XXX.beigbt 来分别表示其宽度和高度。
下面给出 一个示例, 方便大家理解。
Size(S, 5); //构造出的 Size 宽度和高度都为 5, 即 XXX.width 和 XXX . height 都为 5
4 矩形的表示: Rect 类
Rect 类 的成员变昼有 x 、 y 、 width 、 height, 分 别 为左上角点 的 坐标和矩形的 宽和 高。
常用的成员函数有 :
- Size()返回值为 Size; area()返回矩形 的面积;
- contains(Point)判断点是否在矩形内 ;
- inside(Rect) 函数判 断矩形是否在该矩形 内 ;
- ti()返回左上角点坐标 :
- br()返回右下角点坐标。
值得注意的是 , 如果想求两个矩
形 的交集和并集 , 可以用如下格式 :
Rect rect = rectl & rect2;
Rect rect = rect1 | rect2;
如果想让矩形进行平移操作和缩放操作 , 甚至可以这样写 :
Rect rectShift = rect + point;
Rect rectScale = rect + size ;
5 颜色空间转换 : cvtColor()函数
cvtColor() 函数是 OpenCV 里的颜色空间转换函数 ,可以实现RGB 颜色向HSV 、 HSI 等颜色空间的转换 ,也可以转换为灰度图像 。
void cvtColor( InputArray src,
OutputArray dst,
int code,
int dstCn = 0 );
- 第一个参数为输入图像
- 第二个参数为输出图像
- 第三个参数为颜色空间转换的标识符
- 第四个参数为目标图像的通道数 ,若该参数是0,表示目标图像取源图像 的通道数
下面是一个调用示例:
cvtColor(srcimage , dstimage , COLOR_GRAY2BGR ); //转换原始图为灰度图
随着 OpenCV 版本 的升级, cvtColor()函数对千颜色空间种类的支待也是越来越多 。
另 外, 在这里需要再次提醒大家 的 是, OpenCV默认的 图片通道存储顺序是 BGR , 即蓝绿红,而不是 RGB 。
实例代码:
/***头文件包含部分***/
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
/***命名空间声明部分***/
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
//[1] 载入图片
Mat srcimage=imread("D:\\QT\\project\\opencv_qtcreaor\\4_2\\4_2\\image.jpg", 1) , dstimage;
//[2] 转换颜色空间
cvtColor(srcimage, dstimage , COLOR_BGR2Lab);
//[3] 显示效果图
namedWindow("aa");
imshow("aa", dstimage);
//[4] 保持窗口显示
waitKey () ;
return 0;
}
6 其他常用的知识点
Matx 是个轻扯级的 Mat, 必须在使用前规定好大小 , 比如一个 2*3 的 float 型的 Matx , 可 以声 明 为 Matx23f。
Vec 是 Matx 的一个派生类 , 是一个一维的 Matx, 跟 vector很相似 。在 OpenCY源码中有如下定义 。
template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
Range 类其实就是为了使 OpenCV 的使用更像 MATLAB 而产生的。 比如Range::all()其实就是 MATLAB 里的符号。而 Range(a, b)其实就是 MATLAB中的 a: b, 注意这里的 a 和 b 都应为整型 。
OpenCV 中防止 内存溢出的函数有 alignPtr、 ali gnS ize、 allocate、 deallocate 、fastMalloc 、 fastFree 等。
<matb . h>里的一些函数使用起来很方便 , 有计算向批角度的函数 fastAtan2 、计算立方根的函数 cubeRoot、向上取整函数 cvCe止 向下取整函数 cvFloor、四舍五入函数 cvRound 等 。还有一些类似 MATLAB 里面的函数,比如 cvlslnf 判断自变品是否无穷大, cvlsNaN 判断自变量是否不是一个数 。
显示文字相关的函数有 getTextSize 、 cvlnitFont 、 putText 。
作图相关的函数有 circle 、 clipLine 、 ellipse 、 ellipse2Poly 、 line 、 rectangle、polylines、类 Line Iterator 。
填充相关的函数有 fillConvexPoly 、 fillPoly 。
OpenCV 中 RNG()函数的作用为初始化随机数状态的生成器 。