OpenCV-绘制多边形(fillConvexPoly和fillPoly的区别)
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() );
参数说明
- InputOutputArray类型的img,输入图像也是输出图像,如Mat类型。
- InputArrayOfArrays类型的pts,存放多个多边形的顶点集合;InputArray类型的points,存放单个凸多边形的顶点集合。
- Scalar类型的color,文字颜色。
- int类型的line_type,绘制线的类型,-1就是FILLED(填满),4是LINE_4(4连通域),8是LINE_8(8连通域),LINE_AA(抗锯齿线)。
- int类型的shift,顶点坐标中的小数位数。
- 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;
}
测试效果
注意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。
而fillConvexPoly的绘制效果,如图5所示。
不难看出,fillConvexPoly把最后连接处的那个缺口给补了起来,所以在使用这两个函数时注意自身需求,再判断使用哪一个函数。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
以上是关于OpenCV-绘制多边形(fillConvexPoly和fillPoly的区别)的主要内容,如果未能解决你的问题,请参考以下文章
调整在Python中使用Numpy和OpenCV绘制的多边形的大小