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 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博客