OpenCV中可以完成多边形填充的函数有两个,第一个填充多边形的函数为:
1void cv::fillPoly( 2 InputOutputArray img,3 InputArrayOfArrays pts,4 const Scalar & color,5 int lineType = LINE_8,6 int shift = 0,7 Point offset = Point()8)
该函数参数跟polylines很相似,唯一没有的就是thickness跟isClose参数,该函数会完成一个多边形的填充操作。代码演示如下:
1Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);2int w = canvas.cols;3int h = canvas.rows;4Point p1(100, 100);5Point p2(300, 150);6Point p3(300, 350);7Point p4(250, 450);8Point p5(50, 450);9std::vector pts;10pts.push_back(p1);11pts.push_back(p2);12pts.push_back(p3);13pts.push_back(p3);14pts.push_back(p4);15pts.push_back(p5);16fillPoly(canvas, pts, Scalar(255, 0, 255), 8, 0);17polylines(canvas, pts, true, Scalar(0, 255, 255), 2, 8, 0);
第二个一次可以填充/绘制任意数目的多边形函数,该函数来自轮廓分析的轮廓绘制,因此很多人不会注意到它其实是一个很强悍的多边形填充与绘制函数,函数说明如下:
1void cv::drawContours ( 2 InputOutputArray image,3 InputArrayOfArrays contours,4 int contourIdx,5 const Scalar & color,6 int thickness = 1,7 int lineType = LINE_8,8 InputArray hierarchy = noArray(),9 int maxLevel = INT_MAX,10 Point offset = Point()11)
该函数功能比较强大,一次可以完成多个多边形的填充与绘制,它本质上把每个多边形的顶点集作为轮廓看待,可以很方便的完成轮廓的绘制与填充,跟点、线、圆、椭圆与矩形的绘制与填充一样,都是通过设置thickness这个参数来实现绘制与填充。只是在输入的时候需要适当改一下。参数controus表示的多个多边形点集合,contourIdx大于零表示绘制指定索引的轮廓,-1表示绘制全部,thickness正数表示绘制,非正数表示填充。就这样一个函数就可以轻松搞定多边形的填充与绘制。代码实现如下:
1Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);2int w = canvas.cols;3int h = canvas.rows;4Point p1(100, 100);5Point p2(300, 150);6Point p3(300, 350);7Point p4(250, 450);8Point p5(50, 450);9std::vector pts;10pts.push_back(p1);11pts.push_back(p2);12pts.push_back(p3);13pts.push_back(p3);14pts.push_back(p4);15pts.push_back(p5);16std::vector<:vector>> contours;17contours.push_back(pts);18drawContours(canvas, contours, 0, Scalar(0, 0, 255), -1, 8);19drawContours(canvas, contours, 0, Scalar(255, 0, 255), 2, 8);
运行结果如下:
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~