QT opencv 学习day02 基本数据结构 point Scalar Size Rect Mat 等等

本文详细介绍了OpenCV中常用的基础数据类型,包括二维和三维的点(Point2i,Point3i等),颜色Scalar,大小Size,矩形Rect,旋转矩形RotatedRect,固定大小的矩阵Matx,范围Range以及智能指针Ptr和图像容器Mat。这些类型在计算机视觉处理中扮演着重要角色。
摘要由CSDN通过智能技术生成

1.point   (画点)

1. 函数原型: 

//二维的点
typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;


//三维的点
typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;

二维的结构体模板 :Point_

template<typename _Tp> class Point_
{
public:
    typedef _Tp value_type;

    //! default constructor
    Point_();
    Point_(_Tp _x, _Tp _y);
    Point_(const Point_& pt);
    Point_(const Size_<_Tp>& sz);
    Point_(const Vec<_Tp, 2>& v);

    Point_& operator = (const Point_& pt);
    //! conversion to another data type
    template<typename _Tp2> operator Point_<_Tp2>() const;

    //! conversion to the old-style C structures
    operator Vec<_Tp, 2>() const;

    //! dot product
    _Tp dot(const Point_& pt) const;
    //! dot product computed in double-precision arithmetics
    double ddot(const Point_& pt) const;
    //! cross-product
    double cross(const Point_& pt) const;
    //! checks whether the point is inside the specified rectangle
    bool inside(const Rect_<_Tp>& r) const;
    _Tp x; //!< x coordinate of the point
    _Tp y; //!< y coordinate of the point
};

三维的结构体模板 :Point3_

template<typename _Tp> class Point3_
{
public:
    typedef _Tp value_type;

    //! default constructor
    Point3_();
    Point3_(_Tp _x, _Tp _y, _Tp _z);
    Point3_(const Point3_& pt);
    explicit Point3_(const Point_<_Tp>& pt);
    Point3_(const Vec<_Tp, 3>& v);

    Point3_& operator = (const Point3_& pt);
    //! conversion to another data type
    template<typename _Tp2> operator Point3_<_Tp2>() const;
    //! conversion to cv::Vec<>
#if OPENCV_ABI_COMPATIBILITY > 300
    template<typename _Tp2> operator Vec<_Tp2, 3>() const;
#else
    operator Vec<_Tp, 3>() const;
#endif

    //! dot product
    _Tp dot(const Point3_& pt) const;
    //! dot product computed in double-precision arithmetics
    double ddot(const Point3_& pt) const;
    //! cross product of the 2 3D points
    Point3_ cross(const Point3_& pt) const;
    _Tp x; //!< x coordinate of the 3D point
    _Tp y; //!< y coordinate of the 3D point
    _Tp z; //!< z coordinate of the 3D point
};

 

2.参数: 

Point2i(int x,int y)参数1: int  参数2: int
Point2l(int64 x,int64 y )参数1:  int64  参数2: int64
Point2f(float x, float y )参数1: float  参数2: float
Point2d(double x, doubley)参数1: double 参数2: double
Point3i(int x,int y ,int z)参数1: int  参数2: int
Point3f(float x, float y, float z)参数1 float  参数2: float  参数3: float
Point3d(double x, double y ,double z)参数1:double  参数2:double 参数3 : double

 3. 使用方法

 cv::Point2i a1(1,1);//二维 int 类型的点

 cv::Point2l a2(16,16);//二维 int64 类型的点

 cv::Point2f a3(1.1,1.1);//二维 float 类型的点

 cv::Point2d a4(1.1,1.1);//二维 double 类型的点

 cv::Point3i a5(1,1,1);//三维 int 类型的点

 cv::Point3f a6(1.1,1.2,1.3);//三维 float 类型的点

 cv::Point3d a7(1.1,1.2,1.3);//三维  double  类型的点


2. Scalar  颜色 (RGB)

1. 函数原型:

typedef Scalar_<double> Scalar;

class Scalar_ 结构体:

template<typename _Tp> class Scalar_ : public Vec<_Tp, 4>
{
public:
    //! default constructor
    Scalar_();  //构造
    Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);//两位的构造
    Scalar_(_Tp v0);//一位的构造

    template<typename _Tp2, int cn>
    Scalar_(const Vec<_Tp2, cn>& v);

    //! returns a scalar with all elements set to v0
    static Scalar_<_Tp> all(_Tp v0);

    //! conversion to another data type
    template<typename T2> operator Scalar_<T2>() const;

    //! per-element product
    Scalar_<_Tp> mul(const Scalar_<_Tp>& a, double scale=1 ) const;

    //! returns (v0, -v1, -v2, -v3)
    Scalar_<_Tp> conj() const;

    //! returns true iff v1 == v2 == v3 == 0
    bool isReal() const;
};

2. 使用方法

    cv::Scalar s1;//空构造
    cv::Scalar s2(s1);//拷贝构造
    cv::Scalar s3(255);//赋值构造1
    cv::Scalar s4(255,255,255,0);//赋值构造2
    cv::Scalar s5(255,255,255,0);//定义点s5
    cv::Scalar s6(10,10,10,0);//定义点s6
    cv::Scalar s7;//定义点s7
    s7=s5.mul(s6);//s7=s5*s6

    //scalar(g,b,r)可以用于表示色彩。

    //scalar(255)表示全白。

3.Size  (大小)

1.函数原型:

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;

    //! default constructor
    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; //!< the width
    _Tp height; //!< the height
};

2. 使用方法:

Size2i s1(1,1);
Size2l s2(100,200);
Size2f s3(1.1,1.2);
Size2d s4(1.3,1.4);


 4. Rect   (矩形)

1.函数模型:

typedef Rect_<int> Rect2i;
typedef Rect_<float> Rect2f;
typedef Rect_<double> Rect2d;
typedef Rect2i Rect; //Rect  默认是 Rect2i

Rect_ 结构体模板:

template<typename _Tp> class Rect_
{
public:
    typedef _Tp value_type;

    //! default constructor
    Rect_();
    Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
    Rect_(const Rect_& r);
    Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
    Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);

    Rect_& operator = ( const Rect_& r );
    //! the top-left corner
    Point_<_Tp> tl() const;
    //! the bottom-right corner
    Point_<_Tp> br() const;

    //! size (width, height) of the rectangle
    Size_<_Tp> size() const;
    //! area (width*height) of the rectangle
    _Tp area() const;
    //! true if empty
    bool empty() const;

    //! conversion to another data type
    template<typename _Tp2> operator Rect_<_Tp2>() const;

    //! checks whether the rectangle contains the point
    bool contains(const Point_<_Tp>& pt) const;

    _Tp x; //!< x coordinate of the top-left corner
    _Tp y; //!< y coordinate of the top-left corner
    _Tp width; //!< width of the rectangle
    _Tp height; //!< height of the rectangle
};

2. 使用方法

方法一: 先创两个点, 再创建一个矩形

//定义起点和终点
    cv::Point p1(1,1);
    cv::Point p2(2,2);
    cv::Rect r5(p1,p2);

方法二: 先创建一个点  再创建一个 尺寸

//定义起点和尺寸
    cv::Point p1(1,1);
    cv::Size s1(1,1);
    cv::Rect r4(p1,s1);

方法三: 填写每个参数

//定义起点、宽度、高度
    int x = 10;
    int y = 10;
    int w = 100;
    int h = 100;
    cv::Rect r3(x,y,w,h);

方法四 : 拷贝构造

3.相关的函数

    //定义一个矩形
    int p = r3.x;
    int q = r3.y;
    int m = r3.width;
    int n = r3.height;
 
    //矩形的面积
    int area = r3.area();
 
    //矩形的尺寸
    cv::Size size = r3.size();
 
    //矩形的左上点
    cv::Point a = r3.tl();
 
    //矩形的右下点
    cv::Point b = r3.br();
 
    //是否包含点a
    bool i = r3.contains(a);


5.RotatedRect   (旋转矩形)

1.函数原型: 

1. RotatedRect();
2. RotatedRect(const Point2f& center, const Size2f& size, float angle);
3. RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

解读: 
1. RotatedRect()  空构造

2. RotatedRect(const Point2f& center, const Size2f& size, float angle);

参数:

center : 矩形的中心点

size :   矩形的宽度和高度  

angle :  顺时针旋转的角度


3. RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

参数: 矩形,顺时针的三个点。

2.使用方法:

    //定义3个点
    cv::Point p1(0,0);
    cv::Point p2(100,0);
    cv::Point p3(0,100);
    //定义一个旋转矩形
    cv::RotatedRect rr3(p1,p2,p3);
 
    //定义一个中心点
    cv::Point p0(500,500);
    //定义一个大小
    cv::Size sz(100,100);
    //定义一个旋转矩形
    cv::RotatedRect rr4(p0,sz,45);

3.相关函数

    //定义一个矩形
    cv::RotatedRect rr5;
    //获取矩形的中心点坐标
    cv::Point center5 = rr5.center;
    //获取矩形的大小
    cv::Size sz5 = rr5.size;
    //获取矩形的旋转角度
    float angle = rr5.angle;
    //获取矩形的4个端点
    cv::Point2f pts[4];
    rr5.points(pts);



6. Matx (矩阵)

1. 函数原型:

typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;
typedef Matx<float, 1, 3> Matx13f;
typedef Matx<double, 1, 3> Matx13d;
typedef Matx<float, 1, 4> Matx14f;
typedef Matx<double, 1, 4> Matx14d;
typedef Matx<float, 1, 6> Matx16f;
typedef Matx<double, 1, 6> Matx16d;

typedef Matx<float, 2, 1> Matx21f;
typedef Matx<double, 2, 1> Matx21d;
typedef Matx<float, 3, 1> Matx31f;
typedef Matx<double, 3, 1> Matx31d;
typedef Matx<float, 4, 1> Matx41f;
typedef Matx<double, 4, 1> Matx41d;
typedef Matx<float, 6, 1> Matx61f;
typedef Matx<double, 6, 1> Matx61d;

typedef Matx<float, 2, 2> Matx22f;
typedef Matx<double, 2, 2> Matx22d;
typedef Matx<float, 2, 3> Matx23f;
typedef Matx<double, 2, 3> Matx23d;
typedef Matx<float, 3, 2> Matx32f;
typedef Matx<double, 3, 2> Matx32d;

typedef Matx<float, 3, 3> Matx33f;
typedef Matx<double, 3, 3> Matx33d;

typedef Matx<float, 3, 4> Matx34f;
typedef Matx<double, 3, 4> Matx34d;
typedef Matx<float, 4, 3> Matx43f;
typedef Matx<double, 4, 3> Matx43d;

typedef Matx<float, 4, 4> Matx44f;
typedef Matx<double, 4, 4> Matx44d;
typedef Matx<float, 6, 6> Matx66f;
typedef Matx<double, 6, 6> Matx66d;

2.使用方法

    //空构造
    cv::Matx33f m1;
 
    //拷贝构造
    cv::Matx33f m2(m1);
 
    //赋值构造
    cv::Matx33f m3(1,2,3,
                   4,5,6,
                   7,8,9);

     //取值
    float c = m3(1,1);//取第二行、第二列的数据
    
    

 3.相关函数

    //矩阵计算
    cv::Matx33f m1;
    cv::Matx33f m2;
    cv::Matx33f m3;
 
    m1=m2.t();//转置
    m3=m1.mul(m2);//点乘



7.Range  (定义一个范围)

1.函数原型 

class CV_EXPORTS Range
{
public:
    Range();
    Range(int _start, int _end);
    int size() const;
    bool empty() const;
    static Range all();

    int start, end;
};

2. 使用方法

    cv::Range ran(0,10);//定义一个范围
 
    int a = ran.start;//取范围的起点
    int b = ran.end;//取范围的终点
 
    qDebug()<<a;//打印a
    qDebug()<<b;//打印b




8.Ptr     (指针)

opencv中的Ptr指其使用的智能指针,指的是Template class for smart reference-counting pointers(智能指针模板类)

ptr是在访问图片中像素时的操作,如image.ptr<uchar>(5),指的是访问image图片的第6行像素值。

1.使用方法:

    //构造形式1
    cv::Ptr<Matx33d>p1(new cv::Matx33d);
 
 
    //构造形式2
    cv::Ptr<Matx33d>p2=makePtr<Matx33d>;

2.相关函数

    //判断是否为空
    bool b1 = p1.empty();
    
 
    //主动释放
    p2.release();



9.Mat  (图片)

1.函数原型:

1. Mat();  //空构造
2. Mat(int rows, int cols, int type);//
3. Mat(Size size, int type);
4. Mat(int rows, int cols, int type, const Scalar& s);
5. Mat(Size size, int type, const Scalar& s);
6. Mat(int ndims, const int* sizes, int type);
7. Mat(const std::vector<int>& sizes, int type);
8. .........

2.使用方法

    //空构造
    cv::Mat mat1;
 
    //赋值构造(大概有29种重载,只示例了其中一种)
    cv::Mat mat2(cv::Size sz,int type);
 
    //读取一张图片,将数据存储到mat3,然后进行处理
    cv::Mat mat3 = imread("C:/opencv/123.jpg");
 
    //特殊构造
    Mat mat4 = Mat::zeros(10,10,CV_32F);//全黑(全部为0)
    Mat mat5 = Mat::ones(10,10,CV_32F);//全白(全部为1)
    Mat mat6 = Mat::ones(10,10,CV_32F);//对角为白,其余为黑(对角为1,其余为0)

 




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值