Lập trình OpenCV C++ Bài 8 : Vẽ hình học trong OpenCV – P2

Hi, chúng ta sẽ tiếp tục phần số 2 trong bài 8 chủ đề:

Lập trình OpenCV C++

Trong bài trước, các bạn đã biết cách vẽ được hình tròn và đường thẳng trong opencv.

Hôm nay chúng ta sẽ học cách vẽ các hình học cơ bản khác.

1. Vẽ elipse

Vẽ elipse thực ra giống như vẽ hình tròn, chỉ là các bạn sử dụng một bounding không phải hình vuông.

Các bạn viết một hàm như sau:

Và hãy nhớ gọi hàm bên hàm sự kiện của lớp mainframe.

void OpenCVGUIDoc::DrawElipse()
{
    cv::Mat img = m_Mat;
    int thickness = 2;
    int lineType = 8;
    cv::Point pt(200, 200);
    cv::Scalar blue_color = cv::Scalar(255, 0, 0);
    cv::ellipse(img,
        pt,
        cv::Size(400 / 4, 400 / 16),
        0,
        0,
        360,
        blue_color,
        thickness,
        lineType);

    ImpShow(img);
}

Các bạn sẽ thấy biến size sẽ quyết định hình dạng của bounding, và nó sẽ ra một hình elipse

2. Vẽ hình chữ nhật:

Tương tự như vậy, để vẽ được hình chữ nhật, các bạn cũng viết một hàm như sau bên lớp document

và gọi nó bên hàm xử lý sự kiện tại lớp mainframe

void OpenCVGUIDoc::DrawRect()
{
    int thickness = 2;
    cv::Mat img = m_Mat;
    cv::Scalar color = cv::Scalar(0, 255, 255);
    cv::rectangle(img,
        cv::Point(150, 150),
        cv::Point(400, 300),
        color,
        thickness,
        cv::LINE_8);
    ImpShow(img);
}

Các bạn sẽ có hình chữ nhật như sau:

3. Vẽ hình polygon

Polygon là một hình đa giác, được tô màu, khác với polyline.

Các bạn có thể vẽ một hình polygon như sau:

Có hai các các bạn có thể sử dụng

a. Dùng con trỏ để lưu trữ các mảng điểm

void OpenCVGUIDoc::DrawPolygon()
{
    cv::Mat img = m_Mat;
    int lineType = cv::LINE_8;

    cv::Point** arr_points = new cv::Point*[1];
    arr_points[0] = new cv::Point[5];
    arr_points[0][0] = cv::Point(100, 100);
    arr_points[0][1] = cv::Point(100, 200);
    arr_points[0][2] = cv::Point(200, 200);
    arr_points[0][3] = cv::Point(300, 150);
    arr_points[0][4] = cv::Point(200, 100);
    int* npt = new int();
    *npt = 5;

    cv::Scalar color = cv::Scalar(255, 255, 255);


    cv::fillPoly(img,
        (const cv::Point**)arr_points,
        npt,
        1,
        color,
        lineType);

    ImpShow(img);

    delete [] arr_points;
    delete npt;
}

b. Dùng mảng hai chiều

void OpenCVGUIDoc::DrawPolygon()
{
    cv::Mat img = m_Mat;
    int lineType = cv::LINE_8;

    cv::Point arr_points[1][5];
    arr_points[0][0] = cv::Point(100, 100);
    arr_points[0][1] = cv::Point(100, 200);
    arr_points[0][2] = cv::Point(200, 200);
    arr_points[0][3] = cv::Point(300, 150);
    arr_points[0][4] = cv::Point(200, 100);
    const cv::Point* ppt[1] = { arr_points[0] };
    int npt[] = { 5 };

    cv::Scalar color = cv::Scalar(255, 255, 255);


    cv::fillPoly(img,
        ppt,
        npt,
        1,
        color,
        lineType);

    ImpShow(img);
}

 

Cả hai đều cho ra một kết quả như nhau

OK, đó là cách vẽ các hình học cơ bản trong OpenCV.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.