OpenCV-绘制多边形(fillConvexPoly和fillPoly的区别)

简介: OpenCV-绘制多边形(fillConvexPoly和fillPoly的区别)

函数原型

void fillConvexPoly(InputOutputArray img, InputArray points,
                    const Scalar& color, int lineType = LINE_8,
                    int shift = 0);
void fillPoly(InputOutputArray img, InputArrayOfArrays pts,
              const Scalar& color, int lineType = LINE_8, int shift = 0,
              Point offset = Point() );

参数说明

  1. InputOutputArray类型的img,输入图像也是输出图像,如Mat类型。
  2. InputArrayOfArrays类型的pts,存放多个多边形的顶点集合;InputArray类型的points,存放单个凸多边形的顶点集合。
  3. Scalar类型的color,文字颜色。
  4. int类型的line_type,绘制线的类型,-1就是FILLED(填满),4是LINE_4(4连通域),8是LINE_8(8连通域),LINE_AA(抗锯齿线)。
  5. int类型的shift,顶点坐标中的小数位数。
  6. Point类型的offset,轮廓的所有点的可选偏移量。


测试代码

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
  cv::Mat src = imread("test.jpg");
  cv::Mat result = src.clone();
  cv::Mat result2 = src.clone();
  // 多边形顶点坐标
  vector<Point> points1,points2;
  points1.push_back(Point(src.cols / 4, src.rows / 4));
  points1.push_back(Point(src.cols / 4, src.rows / 8));
  points1.push_back(Point(src.cols / 2, src.rows / 6));
  points1.push_back(Point(src.cols / 3, src.rows / 2));
  points1.push_back(Point(src.cols / 2, src.rows / 8));
  points2.push_back(Point(src.cols / 3, src.rows / 3));
  points2.push_back(Point(src.cols / 2, src.rows / 2));
  points2.push_back(Point(3 * src.cols / 4, src.rows / 2));
  points2.push_back(Point(5 * src.cols / 8, 3 * src.rows / 4));
  points2.push_back(Point(src.cols / 2, src.rows / 3));
  // 每个vector<Point>就是一个多边形
  vector<vector<Point>> pic;
  pic.push_back(points1);
  pic.push_back(points2);
  // 绘制多边形集合
  fillPoly(result, pic, Scalar(0, 0, 255), 16, 0);
  // 绘制单个凸多边形
  fillConvexPoly(result2, points2, Scalar(0, 0, 255), 16, 0);
  imshow("original", src);
  imshow("result", result);
  imshow("result2", result2);
  waitKey(0);
  system("pause");
  return 0;
}


测试效果

图1 原图

图2 fillPoly效果图

图3 fillConvexPoly效果图

      注意fillPoly在绘制多个多边形时,如果某两个多边形有交叉,则该交叉区域便取消填充,并保持原样,可以想象成将一个flag从false设为true,又设为false。      


      除此之外,两个多边形绘制函数的原理有所差异。区别除了一个是绘制单个多边形,另一个可以绘制多个多边形;还有个更关键的差异,fillConvexPoly绘制的是凸多边形,而fillPoly可以绘制任意多边形,我将点集换成如下:

points2.push_back(Point(src.cols / 3, 7*src.rows / 8));
points2.push_back(Point(src.cols / 2, src.rows / 2)); 
points2.push_back(Point(3 * src.cols / 4, src.rows / 2));
points2.push_back(Point(5 * src.cols / 8, 3 * src.rows / 4)); 
points2.push_back(Point(src.cols / 2, 2*src.rows / 3));

  正常得到的图形应该是如fillPoly显示的这样,如图4。

图4 fillPoly绘制任意形状的多边形

      而fillConvexPoly的绘制效果,如图5所示。

图5 fillConvexPoly绘制凸多边形

      不难看出,fillConvexPoly把最后连接处的那个缺口给补了起来,所以在使用这两个函数时注意自身需求,再判断使用哪一个函数。


      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
6月前
|
计算机视觉 Python
OpenCV中线段、矩形、圆形、多边形的讲解与绘制实战(附Python源码)
OpenCV中线段、矩形、圆形、多边形的讲解与绘制实战(附Python源码)
139 0
|
5月前
|
存储 Cloud Native Linux
OpenCV多边形填充与绘制
OpenCV多边形填充与绘制
|
6月前
|
算法 Serverless 计算机视觉
【OpenCV】- 多边形将轮廓包围
【OpenCV】- 多边形将轮廓包围
|
6月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
467 0
|
6月前
|
计算机视觉
OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字
OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字
84 0
|
计算机视觉
OpenCV绘制多边形的代码
OpenCV绘制多边形的代码
125 0
|
C++ 计算机视觉
C++使用opencv判断一个点是否在多边形之内
C++使用opencv判断一个点是否在多边形之内
200 0
|
缓存 算法 计算机视觉
项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)
项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)
项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)
|
算法 API 图形学
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
1889 0
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合