函数原型
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; }
测试效果
图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把最后连接处的那个缺口给补了起来,所以在使用这两个函数时注意自身需求,再判断使用哪一个函数。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!