精通人脸识别09:Opencv基本数据结构

精通人脸识别09:Opencv基本数据结构


一、简介

Opencv的数据结构:Point、Size、Rect、Scalar、Ar
大多数据结构都在cxtypes.h这个头文件里定义

1、Point系列,点的表示:

   Point:表示图像中的点   (x,y)都是整型变量,即图像中点的 坐标,图像的原点一般在图像的左上角

   Point2D32f:二维空间中的点   (x,y)是float型

   Point3D32f:三维空间中的点   

   构造函数:PointXXXX( )。注意,这是c风格的代码,构造函数是内联函数,并不是c++中的类的构造函数一样。

 

2、Size系列,尺寸的表示:

   Size:图像的尺寸(整型)

   Size2D32f:如果想用浮点型。

 

3、矩形的表示,Rect:用来表示图像的部分区域,4个参数,矩形的左上角的坐标(x,y),矩形的长、宽

 

4、颜色表示,Scalar包含4个浮点成员,可以用来表示表示B,G,R,alpha; 有三个构造函数:Scalar,RealScalar,ScalarAll

     Scalar对四个变量都赋值

  RealScalar只对四个变量的第0个赋值,其他都为0

  ScalarAll对四个变量都赋相同的值

5、Arr: Arr->Mat->lmage   三个继承关系


二、详细介绍

1. Vec类

1.1 基本概念
         Vec是一个模板类,主要用于存储数值向量。
1.2 用法

(1)可用它来定义任意类型的向量
Vec myVector; // 定义一个存放8个double型变量的向量
(2)使用[]访问Vec向量成员         
myVector[0]=0;
 (3)可使用以下预定义的类型
typedef Vec Vec2b;
typedef Vec Vec3b;
typedef Vec Vec4b;
typedef Vec Vec2s;
typedef Vec Vec3s;
typedef Vec Vec4s;
typedef Vec Vec2i;
typedef Vec Vec3i;
typedef Vec Vec4i;
typedef Vec Vec2f;
typedef Vec Vec3f;
typedef Vec Vec4f;
typedef Vec Vec6f;
typedef Vec Vec2d;
typedef Vec Vec3d;
typedef Vec Vec4d;
typedef Vec Vec6d;


(4)Vec支持的运算如下:
    v1 = v2 + v3
    v1 = v2 - v3
    v1 = v2 * scale
    v1 = scale * v2
    v1 = -v2
    v1 += v2
    v1 == v2, v1 != v2
    norm(v1) (euclidean norm)

1.3 示例代码

(1)向量定义与元素的访问
// Vec
     cv::Vec  myVector;
     for(int i=0; i           myVector[i] = i;
     cout<<"myVector= "<      cout<<"myVector[0]= "<      cout<<"myVector[3]= "< 运行结果:


(2)基本运算
    cv::Vec v1,v2,v3;
            for(int i=0; i                        v2[i] = i;
                       v3[i] = i+1;
                }
        
         v1 = v2 + v3;
         cout<<"v2       = "<          cout<<"v3       = "<          cout<<"v1=v2+v3= "<          cout<<"v1=v2*2  = "<          cout<<"v1=-v2   = "<<-v2<          cout<<"v1==v2   = "<<(v1==v2)<          cout<<"v1!=v2   = "<<(v1!=v2)<          cout<<"norm(v2)= "< 运行结果:

2. Scalar类

2.1 基本概念

Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值。

2.2 用法

可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。

cv:: Scalar( B, G, R )

2.3 示例代码

(1)cv::Scalar结构
    cv::Scalar myScalar;
    myScalar = cv::Scalar(0,255,0);
    cout<<"myScalar = "<     system("pause");
 运行结果:


(2)读取彩色图像像素值
彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。

OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
因此,访问彩色像素中元素的方法如下:


cv::Mat pImg = cv::imread("Lena.jpg",1);
    if(!pImg.data)
        return 0;
    int x = 100, y = 100;
    cv::Scalar pixel=pImg.at(x,y);
    cout<<"B chanel of pixel is = "<     cout<<"G chanel of pixel is = "<     cout<<"R chanel of pixel is = "<     system("pause");
 运行结果:

Color()可以实现RGB向HSV、HSI等颜色空间的转换,也可以转换为灰度图像。

精通人脸识别09:Opencv基本数据结构_第1张图片

3. Point类

3.1 基本概念
常用于表示2维坐标(x,y)。

3.2 用法
(1)图像坐标
对图像而言,我们可以这样定义:

cv::Point pt;
pt.x = 10;
pt.y = 8;
或者
cv::Point pt =  Point(10, 8);
或者

cv::Point pt(10,8);

(2)或使用如下预定义:
typedef Point_ Point2i;
typedef Point2i Point;
typedef Point_ Point2f;
typedef Point_ Point2d;
(3)基本运算
pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 += pt2;
pt1 -= pt2;
pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2;
pt1 != pt2;

3.3 示例代码

(1)设置坐标点
// Point
    cv::Point pt;
    pt.x = 278;
    pt.y = 269;
    //或者
    //cv::Point  pt (278,269);
    cv::Scalar pix = pImg.at(pt);
    cout<<"pix("<  运行结果:

(2)各类运算
cv::Point pt1(10,20);
    cv::Point pt2(2,3);
    cout<<"pt1     = "<     cout<<"pt2     = "<     cout<<"pt1+pt2 = "<     cout<<"pt1+=pt2= "<<(pt1+=pt2)<     cout<<"pt1-pt2 = "<     cout<<"pt2*2   = "<  运行结果:

4. Size类

4.1 基本概念
模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height还有一个有用的面积函数area()。

4.2 用法
cv::Size size(int w, int h);
//或者
cv::Size size;
size.width = w;
size.height = h;

4.3 示例代码
// Size
    cv::Size size1(6,3);
    cv::Size size2;
    size2.width = 4;
    size2.height = 2;
    cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));
    cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));
    cout<<"mat1 = "<     cout<     system("pause");
 运行结果:

5. Rect类

5.1 基本概念
Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:

矩形左上角坐标: (x,y)
矩形的宽和高: width, height
Rect可以用来定义图像的ROI区域。

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;
 

5.2 用法
cv::Rect rect(x, y, width, height);
 

你可能感兴趣的:(精通人脸识别)