Opencv -- 16多边形填充与绘制

与许多 API 函数不同的是多边形填充与绘制并不能一步(使用一个函数)就搞定,需要两步(使用两个函数)。

按照点的顺序依次进行。

#include "16_opencv_mat.h"

void QuickDemo::polyline_drawing_demo()
{
    // 先布置一块画布,512 x 512 个像素点,每个像素点数据大小为CV_8UC3(三通道)
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);

    Point p1(100,100);
    Point p2(50, 200);
    Point p3(150, 200);
    Point p4(200, 100);

    std::vector<Point>pts;
    pts.push_back(p1);
    pts.push_back(p2);
    pts.push_back(p3);
    pts.push_back(p4);

    polylines(canvas,pts,true,Scalar(0,0,255),2,8,0);
    
	/*
     *  void polylines(InputOutputArray img, InputArrayOfArrays pts,
                            bool isClosed, const Scalar& color,
                            int thickness = 1, int lineType = LINE_8, int shift = 0 );

        参数:
        img       -- 画布
        pts       -- 多边形曲线的数组。
        isClosed  -- isClosed标志,指示绘制的折线是否关闭。
                    如果它们是闭合的,函数从每条曲线的最后
                    一个顶点到它的第一个顶点画一条直线。
        color     -- 多边形线段的颜色。
        thickness -- 多边形线段的粗细。不能填写负数。
        lineType  -- 多边形线段的类型。LINE_4、LINE_8、LINE_AA(抗锯齿)
        shift     -- 顶点坐标中的小数位数
     *
     */

    imshow("多边形绘制", canvas);
}

代码运行结果如下:
Opencv -- 16多边形填充与绘制_第1张图片
polylines 这个函数不能用来设置多边形的填充颜色。如果想要设置多边形的填充颜色,就需要使用另外一个函数 fillPoly。

#include "16_opencv_mat.h"

void QuickDemo::polyline_drawing_demo()
{
    // 先布置一块画布,512 x 512 个像素点,每个像素点数据大小为CV_8UC3(三通道)
    Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);

    Point p1(100, 100);
    Point p2(50, 200);
    Point p3(150, 200);
    Point p4(200, 100);

    std::vector<Point>pts;
    pts.push_back(p1);
    pts.push_back(p2);
    pts.push_back(p3);
    pts.push_back(p4);

    polylines(canvas, pts, true, Scalar(0, 0, 255), 4, LINE_AA, 0);
    fillPoly(canvas, pts, Scalar(0, 255, 0), LINE_AA, 0);
   // fillPoly(canvas,pts,Scalar(0, 255, 0), LINE_4,0,p2);
    /*
     *  void fillPoly(InputOutputArray img, 
                      InputArrayOfArrays pts,
                      const Scalar& color, 
                      int lineType = LINE_8, 
                      int shift = 0,
                      Point offset = Point() );

       参数:
       img       -- 画布
       pts       -- 多边形曲线的数组。
       color     -- 给多边形填充的颜色。
       lineType  -- 多边形边界的线型类型。
       shift     -- 顶点坐标中的小数位数
       offset    -- 可选偏移的所有点的轮廓。
    *
    */
    imshow("多边形绘制", canvas);
}

输出结果如下:
Opencv -- 16多边形填充与绘制_第2张图片
经过实验,暂时没有发现先调用填充函数还是先调用绘制函数时,输出的结果有什么区别。(视频中先调用的是填充函数,后调用的是绘制函数。)

说明一下偏移这个参数 offset ,

polylines(canvas, pts, true, Scalar(0, 0, 255), 4, LINE_AA, 0);
fillPoly(canvas, pts, Scalar(0, 255, 0), LINE_AA, 0);
    
fillPoly(canvas,pts,Scalar(0, 255, 0), LINE_4,0,p1);

对比下输出结果如下,
Opencv -- 16多边形填充与绘制_第3张图片
实际上,按照上述的写法有一些啰嗦,完全可以使用一个API函数就可以完成,那就是使用函数 drawContours 。

#include "16_opencv_mat.h"

void QuickDemo::polyline_drawing_demo()
{
    // 先布置一块画布,512 x 512 个像素点,每个像素点数据大小为CV_8UC3(三通道)
    Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);

    Point p1(100, 100);
    Point p2(50, 200);
    Point p3(150, 200);
    Point p4(200, 100);

    std::vector<Point>pts;
    pts.push_back(p1);
    pts.push_back(p2);
    pts.push_back(p3);
    pts.push_back(p4);
	std::vector<std::vector<Point>>contours;
    contours.push_back(pts);
   /* 
   * 
   void drawContours(InputOutputArray image, InputArrayOfArrays contours, 
                     int contourIdx, const Scalar& color, int thickness=1, 
                     int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, 
                     Point offset=Point() )

    功能:用于绘制轮廓或填充轮廓。
    这里暂且介绍用到的几个参数。
    image      -- 画布
    contours   -- 所有的输入轮廓。每个轮廓被存储为点向量。(可以支持多个多边形)
    contourIdx -- 指明绘制哪一个轮廓。如果它是负的,所有的轮廓都将被画出来。第一个轮廓的下标从0开始。
    color      -- 轮廓的颜色。
    thickness  -- 如果它是负的(例如,thickness=CV_FILLED),则绘制轮廓内部。
    lineType   -- 多边形边界的线型类型。
   */
    drawContours(canvas, contours,0, Scalar(0, 255, 0),-1, LINE_AA);

    imshow("多边形绘制", canvas);
}

当参数 thickness 的值为正数的时候,就表示线宽。
当参数 thickness 的值为负数的时候,就表示填充。
Opencv -- 16多边形填充与绘制_第4张图片

你可能感兴趣的:(visual,studio,opencv)