(OpenCV — 4)常用数据结构和函数

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()函数的作用为初始化随机数状态的生成器 。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值