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

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型

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把最后连接处的那个缺口给补了起来,所以在使用这两个函数时注意自身需求,再判断使用哪一个函数。

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

© 版权声明
THE END
喜欢就支持一下吧
点赞957 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容