OpenCV的数据结构

目录

1.各种类模板

(1)二维点Point_类模板

(2)三维点Point3_类模板

(3)尺寸Size_类模板

(4)矩形Rect_类模板

(5)旋转矩形RotatedRect类模板

(6)小矩阵Matx类模板

(7)短向量Vec类模板

(8)四维向量Scalar_类模板

(9)Range类模板

(10)cv::Mat类模板


Windows下的CodeBlocks配置Opencv环境

OpenCV中设计和定义了大量的基本数据结构,使用这些数据结构,可以很方便的实现相应地算法。其中这些数据结构主要使用类模板来实现,并提供了基本的数据属性和基本的操作。

提示:读者必须具备一定的C/C++基础,并且建议读者在学习下面的知识点的时候,不要以一次性掌握其内容为主,而是对其进行了解;只有当在写程序的时候,需要时再去查找相关细节知识点,多用就熟悉了。

1.各种类模板

(1)二维点Point_类模板

提示:Point_类模板中定义了公有数据成员x和y,并且重载了+,-,=,==,+=四个基本的操作。

例如:

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>

using namespace cv;
using namespace std;

typedef Point_<int>Point2i;
typedef Point_<float>Point2f;
typedef Point_<double>Point2d;

int main()
{
    //创建两个对象,并且调用构造函数进行初始化
    Point2f a(0.3,0.2),b(0.1,0.5);
    //将a和b进行运算的结果赋值给c
    Point2f p = (a + b) * 10;
    cout<<"point.x = "<<p.x<<" point.y = "<<p.y<<endl;
    return 0;
}

(2)三维点Point3_类模板

typedef Point3_<int>Point3i;
typedef Point3_<float>Point3f;
typedef Point3_<double>Point3d;

(3)尺寸Size_类模板

typedef Size_<int>Size2i;
typedef Size_<int>Size2f;

(4)矩形Rect_类模板

Rect_类模板的示例为矩形区域(x,y,width,height),其中(x,y)表示左上角坐标,范围为[x,x + width),[y, y + height)。

常见的一些操作:

  • 矩形偏移:rect = rect +(-) point
  • 改变大小:
    • rect = rect +(-) size
    • rect += point
    • rect -= point
    • rect += size
    • rect -= size;
  • 矩形交集:rect = rect1 & rect2
  • 包含最小的矩形:
    • rect = rect1 | rect2
    • rect &= rect1
    • rect |= rect1
    • rect == rect1
    • rect != rect1

比如下面的矩形进行偏移(其他操作类似): 

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>

using namespace cv;
using namespace std;

typedef Point_<int>Point2i;
typedef Point_<float>Point2f;
typedef Point_<double>Point2d;

typedef Point3_<int>Point3i;
typedef Point3_<float>Point3f;
typedef Point3_<double>Point3d;

typedef Size_<int>Size2i;
typedef Size_<int>Size2f;

typedef Rect_<int>Rect2i;
typedef Rect_<float>Rect2f;


int main()
{
    //创建两个对象,并且调用构造函数进行初始化
    Rect2i rect1(1,2,3,4),rect2(3,4,5,6);//表示矩形a的左上角坐标为(1,2),宽高为(3,4),同理b
    //将a和b进行运算的结果赋值给c
    Point2i p1(1,2),p2(2,3);
    cout<<"矩形rect1偏移之前的坐标: ("<<rect1.x<<","<<rect1.y<<")"<<endl;
    cout<<"矩形rect2偏移之前的坐标: ("<<rect2.x<<","<<rect2.y<<")"<<endl;
    cout<<"------------------------------------------------------"<<endl;
    //对矩形进行偏移
    rect1 = rect1 + p1;
    rect2 = rect2 + p2;
    cout<<"矩形rect1偏移之后的坐标: ("<<rect1.x<<","<<rect1.y<<")"<<endl;
    cout<<"矩形rect2偏移之后的坐标: ("<<rect2.x<<","<<rect2.y<<")"<<endl;
    return 0;
}

  

(5)旋转矩形RotatedRect类模板

        旋转矩形RotatedRect有中心,边长,旋转角度3个成员组成,用户可以访问这三个成员也可以使用points函数返回它的四个顶点,使用boundingRect求出它的外接矩形(非旋转)。比如:

RotatedRect rRect = RotatedRect(Point2f(100,100),Size2f(100,50),30);

(6)小矩阵Matx类模板

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>

using namespace cv;
using namespace std;

typedef Matx<float,1,2>Matx12f;//构造一个矩阵大小为1行,2列
typedef Matx<double,1,2>Matx12d;//构造一个矩阵大小为1行,2列
typedef Matx<float,1,6>Matx16f;//构造一个矩阵大小为1行,6列
typedef Matx<double,1,6>Matx16d;//构造一个矩阵大小为1行,6列
typedef Matx<float,2,1>Matx21f;//构造一个矩阵大小为2行,1列
typedef Matx<double,2,1>Matx21d;//构造一个矩阵大小为2行,1列
typedef Matx<int,2,2>Matx22i;//构造一个矩阵大小为2行,2列
typedef Matx<float,2,2>Matx22f;//构造一个矩阵大小为2行,2列
typedef Matx<double,2,2>Matx22d;//构造一个矩阵大小为2行,2列


int main()
{
    //创建两个对象,并且调用构造函数进行初始化
    Matx12f mat1(1,2);//初始化mat1[0][0] = 1,mat1[0][1] = 2
    int m = mat1.rows;
    int n = mat1.cols;
    cout<<"矩阵大小为1 x 2"<<endl;
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            cout<<mat1(i,j)<<" ";
        }
        cout<<endl;
    }
    cout<<"------------------------------------------------------"<<endl;
    Matx22d mat2(1,2,3,4);//mat2[0][0] = 1,mat2[0][1] = 2,mat2[1][0] = 3,mat2[1][1] = 4
    m = mat2.rows;
    n = mat2.cols;
    cout<<"矩阵大小为2 x 2"<<endl;
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            cout<<mat2(i,j)<<" ";
        }
        cout<<endl;
    }
    return 0;
}

(7)短向量Vec类模板

        短向量Vec支持加减,数乘,相等和不等运算。

#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>

using namespace cv;
using namespace std;

typedef Vec<uchar,2>Vec2b;
typedef Vec<int,2>Vec2i;
typedef Vec<int,3>Vec3i;
typedef Vec<float,3>Vec3f;
typedef Vec<double,3>Vec3d;


int main(){
    Vec2i vec1(0),vec2(1);
    Vec3f vec3(1,2,3),vec4(1);

    cout<<"向量1输出: "<<endl;
    int size = vec1.rows;
    for(int i = 0; i < size; i++)cout<<vec1[i]<<" ";
    cout<<endl;
    cout<<"------------------------------------"<<endl;

    cout<<"向量2输出: "<<endl;
    size = vec2.rows;
    for(int i = 0; i < size; i++)cout<<vec2[i]<<" ";
    cout<<endl;
    cout<<"------------------------------------"<<endl;

    cout<<"向量3输出: "<<endl;
    size = vec3.rows;
    for(int i = 0; i < size; i++)cout<<vec3[i]<<" ";
    cout<<endl;
    cout<<"------------------------------------"<<endl;

    cout<<"向量4输出: "<<endl;
    size = vec4.rows;
    for(int i = 0; i < size; i++)cout<<vec4[i]<<" ";
    cout<<endl;
    cout<<"------------------------------------"<<endl;
    return 0;
}

 

(8)四维向量Scalar_类模板

        Scalar_类模板是Vec<tp,4>派生得到的,是一个4元组,通常用来传递像素,比如:

typedef Scalar_<double>Scalal;

(9)Range类模板

        Range类模板用来指定连续的子序列,比如矩阵的一部分。

(10)cv::Mat类模板

这部分单独写一章来讲,内容比较多。

参考书籍:

《数字图像处理基础》

猜你喜欢

转载自blog.csdn.net/Keep_Trying_Go/article/details/130404036