打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
仿射变换
如何在网页中插入音乐播放器
图像处理笔记
OpenCV isContinuous()函数简析
OpenCV图像拼接改进算法之完美拼接
一种xml和json数据格式的简化方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服