28_OpenCV绘制一个填充的多边形cv::fillConvexPoly()、cv::fillPoly()

OpenCV提供函数绘制一个多边形:cv::fillConvexPoly和cv::fillPoly。

cv::fillConvecPoly()函数声明:

void fillConvexPoly(
	cv::Mat& image,  // image to be drawn on
	const cv::Point* pts,  // C- style array of points
	int nps,  // Number of points in 'pts'
	const cv::Scalar& color, // Color BGR form
	int lineType = 8,  // connectedness,4 or 8
	int shift = 0  // bits of radius to treate as fraction
);

函数cv::fillConvexPoly绘制一个填充的多边形,这个函数比cv::fillPoly速度快,因为该函数使用了更简单的算法。需要注意的是cv::fillConvexPoly()使用的算法在多边形有自交点时不能正确工作。pts中的点将被按顺序用直线段连接起来,第一个点和最后一个点之间也会连接起来(也就是说多边形被认为是封闭的。

cv::fillConvexPoly()使用的算法实际上比这里讲述的更加通用。它将正确绘制外轮廓与每条水平线最多相交两次的任意多边形(并且允许多边形的顶部或底部相对于水平线平行)。这样的多边形被认为是相对于水平线单调的。

例如,要画一个填充的矩形,可以使用如下代码:

void DrwaFillPolyRect(cv::Mat &img,const cv::Rect &rect){
	std::vector<cv::Point> vecPts;
	vecPts.push_back(rect.tl());
	vecPts.push_back(cv::Point(rect.x + rect.width, rect.y));
	vecPts.push_back(rect.br());
	vecPts.push_back(cv::Point(rect.x, rect.y + rect.height));
	cv::fillConvexPoly(img, vecPts, CV_RGB(255, 255, 255));
}

cv::fillPoly()函数声明:

void fillPoly(
	cv::Mat& img,  // image to be drawn on
	const cv::Point* pts,  // C-style array of arrays of points
	int npts,  // number of points in pts[i]
	int ncontours,  // number of arrays in 'pts'
	const cv::Scalar& color,  // color,BGR form
	int lineType = 8,  // connectedness, 4 or 8
	int shift = 0,  // bits of radius to treat as fraction
	cv::Point offset = cv::Point()  // uniform offset applied to all points
);

cv::fillPoly可以绘制任意数量的填充的多边形。与cv::fillConvexPoly()函数不同的是,这个函数可以处理自交点的情况。

ncontours参数表示一共有多少个不同的多边形轮廓;
npts参数是一个C风格的数组,表示在每一个多边形轮廓里有多少个点(也就是说,npts[i]表示在多边形i中有多少个点)。
pts参数是一个C风格的数组的数组,包含了所有多边形中的所有点(即,pts[i][j]表示第i个多边形中的第j个点)。

cv::fillPoly()还有一个额外的参数offset,这是在绘制多边形时加在所有顶点坐标上的像素偏移。多边形被认为是封闭的(即pts[i][]的最后一个点会和第一个点连起来)。当一个多边形的轮廓和任意水平线至多相交两次时,这个算法就可以正确画出这个多边形(包含多边形的上下两边是水平线的情况)。这种多边形被称为水平单调多边形。

参考:OpenCV-绘制多边形(fillConvexPoly和fillPoly的区别)_翟天保Steven的博客-CSDN博客


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值