2022-5-3:OpenCV入门(三)数据结构与基本绘图

1.Mat结构

可以创建只引用部分数据的信息头,如下:

Mat D(A,Rect(10,10,100,100));
Mat E=A(Range:all(),Range(1,3));

2.显示创建Mat对象的七种方法

(1)使用Mat()构造函数

Mat M(2,2,CV_8UC3,Scalar(0,0,255));
cout << "M=" << endl << " " << M << endl << endl;

2022-5-3:OpenCV入门(三)数据结构与基本绘图
(2)在C\C++中通过构造函数进行初始化
int sz[3]={2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));

(3)为已存在的IplImage指针创建信息头

IplImage* img=cvLoadImage("1.gpg",1);
Mat mtx(img);

(4)利用Create()函数

M.create(4,4,CV_8UC(2));
cout << "M=" << endl << " " << M << endl << endl;

(5)采用MATLAB式的初始化方式

Mat E=Mat::eye(4,4,CV_64F);
Mat E=Mat::ones(2,2,CV_32F);
Mat E=Mat::zeros(3,3,CV_8UC1);

(6)对小矩阵使用逗号分隔式初始化

Mat C =(Mat_<double>(3,3) <<0,-1,0,-1,5,-1,0,-1,0);

(7)为已存在的对象创建新信息头

Mat RowClone = C.row(1).clone();

3.输出其他常用数据结构

二维点 :Point2f p(6,2);
三维点 :Point3f p3f(8,2,0);
基于Mat的std::vector:
vector<float> v;
v.push_back(3);
v.push_back(5);
v.push_back(7);
cout << "vector=" << endl << " " << Mat(v) << endl << endl;
std::vector点:
vector<Point2f> points(20);
for (size_t i=0;i<points.size();++i)
points[i]=Point2f((float)(i*5),(float)(i%7));
cout<<"points=" <<points<<";";

2022-5-3:OpenCV入门(三)数据结构与基本绘图
2022-5-3:OpenCV入门(三)数据结构与基本绘图

2.常用数据结构和函数

1.点的表示:Point类

Point point;
point.x = 10;
point.y= 8;

2.颜色表示:Scalar类

Scalar(a,b,c)

3.尺寸的表示:Size类

Size(3,4);

4.矩形的表示:Rect类

Rect类成员变量为x,y,width,heigh;

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.颜色空间转换:cvtColor

void cvtColor(InputArray src,OutputArray dst,int code, int dstCn=0);

cvtColor(srcImage,dstImage,COLOR_GRAY2BGR)

应用示例

#include
#include
using namespace cv;

int main()
{
    Mat srcImage = imread("1.bmp", 1), dstImage;
    cvtColor(srcImage, dstImage, COLOR_BGR2Lab);
    imshow("效果图",dstImage);
    waitKey();
    return 0;
}

2022-5-3:OpenCV入门(三)数据结构与基本绘图

3.基本图形的绘制

  1. 直线:line
  2. 椭圆:ellipse
  3. 矩形:rectangle
  4. 圆:circle
  5. 多边形:fillPoly
void DrawEllipse(Mat img, double angle)
{
    int thickness = 2;
    int lineType = 8;

    ellipse(img,
        Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2),
        Size(WINDOW_WIDTH / 4, WINDOW_WIDTH / 16),
        angle,
        0,
        360,
        Scalar(255, 129, 0),
        thickness,
        lineType);
}
void DrawFilledCircle(Mat img, Point center)
{
    int thickness = -1;
    int lineType = 8;

    circle(img,
        center,
        WINDOW_WIDTH / 32,
        Scalar(0, 0, 255),
        thickness,
        lineType);
}
void DrawPolygon(Mat img)
{
    int lineType = 8;

    Point rookPoints[1][20];
    rookPoints[0][0] = Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
    rookPoints[0][1] = Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8);
    rookPoints[0][2] = Point(3 * WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);
    rookPoints[0][3] = Point(11 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
    rookPoints[0][4] = Point(19 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][5] = Point(3 * WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][6] = Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
    rookPoints[0][7] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][8] = Point(26 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][9] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][10] = Point(22 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][11] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][12] = Point(18 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][13] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 4);
    rookPoints[0][14] = Point(14 * WINDOW_WIDTH / 40, WINDOW_WIDTH / 8);
    rookPoints[0][15] = Point(WINDOW_WIDTH / 4, WINDOW_WIDTH / 8);
    rookPoints[0][16] = Point(WINDOW_WIDTH / 4, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][17] = Point(13 * WINDOW_WIDTH / 32, 3 * WINDOW_WIDTH / 8);
    rookPoints[0][18] = Point(5 * WINDOW_WIDTH / 16, 13 * WINDOW_WIDTH / 16);
    rookPoints[0][19] = Point(WINDOW_WIDTH / 4, 13 * WINDOW_WIDTH / 16);

    const Point* ppt[1] = { rookPoints[0] };
    int npt[] = { 20 };

    fillPoly(img,
        ppt,
        npt,
        1,
        Scalar(255, 255, 255),
        lineType);
}
void DrawLine(Mat img, Point start, Point end)
{
    int thickness = 2;
    int lineType = 8;
    line(img,
        start,
        end,
        Scalar(0, 0, 0),
        thickness,
        lineType);
}

应用示例

#include
#include
#include
using namespace cv;

#define WINDOW_NAME1 "【绘制图1】"
#define WINDOW_NAME2 "【绘制图2】"
#define WINDOW_WIDTH 600

int main(void)
{

    Mat atomImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
    Mat rookImage = Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);

    DrawEllipse(atomImage, 90);
    DrawEllipse(atomImage, 0);
    DrawEllipse(atomImage, 45);
    DrawEllipse(atomImage, -45);

    DrawFilledCircle(atomImage, Point(WINDOW_WIDTH / 2, WINDOW_WIDTH / 2));

    DrawPolygon(rookImage);

    rectangle(rookImage,
        Point(0, 7 * WINDOW_WIDTH / 8),
        Point(WINDOW_WIDTH, WINDOW_WIDTH),
        Scalar(0, 255, 255),
        -1,
        8);

    DrawLine(rookImage, Point(0, 15 * WINDOW_WIDTH / 16), Point(WINDOW_WIDTH, 15 * WINDOW_WIDTH / 16));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 4, WINDOW_WIDTH));
    DrawLine(rookImage, Point(WINDOW_WIDTH / 2, 7 * WINDOW_WIDTH / 8), Point(WINDOW_WIDTH / 2, WINDOW_WIDTH));
    DrawLine(rookImage, Point(3 * WINDOW_WIDTH / 4, 7 * WINDOW_WIDTH / 8), Point(3 * WINDOW_WIDTH / 4, WINDOW_WIDTH));

    imshow(WINDOW_NAME1, atomImage);
    moveWindow(WINDOW_NAME1, 0, 200);
    imshow(WINDOW_NAME2, rookImage);
    moveWindow(WINDOW_NAME2, WINDOW_WIDTH, 200);

    waitKey(0);
    return(0);
}

2022-5-3:OpenCV入门(三)数据结构与基本绘图
2022-5-3:OpenCV入门(三)数据结构与基本绘图

Original: https://blog.csdn.net/weixin_44465329/article/details/124483372
Author: 永远怀揣着一颗学徒的心
Title: 2022-5-3:OpenCV入门(三)数据结构与基本绘图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/704947/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球