c++使用OpenCV绘制与填充多边形

多边形绘制

OpenCV中支持常见的点、线、圆、椭圆与矩形的绘制与填充都是通过设置thickness这个参数来实现绘制与填充,当thickness是正数的时就会绘制;当thickness为非正数时就会填充。但是对多边形来说,polylines函数把thickness设置为非正数就会直接报错,无法通过修改thickness完成填充,该函数只能实现绘制。

void cv::polylines(
         InputOutputArray  img,
         InputArrayOfArrays       pts,
         bool        isClosed,
         const Scalar &        color,
         int   thickness = 1,
         int   lineType = LINE_8,
         int   shift = 0
)

参数解释

  • img表示绘制画布,图像

  • pts表示多边形的点

  • isClosed表示是否闭合,默认闭合

  • color表示颜色

  • thickness表示线宽,必须是正数

  • lineType表示线渲染类型

  • shift表示相对位移

绘制一个多边形的代码演示如下:

 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<Point> 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);
16polylines(canvas, pts, true, Scalar(0, 255, 0), 1, 8, 0);

随机拾取5个点的坐标,然后完成绘制运行结果如下:

图片

 

填充多边形

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<Point> 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<Point> 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<std::vector<Point>> 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);

运行结果如下:

图片

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用OpenCV在C中绘制三角形,可以按照以下步骤进行: 1. 首先,包含头文件“<opencv2/highgui/highgui_c.h>”和“<opencv2/imgproc/imgproc_c.h>”。 2. 创建一个空白的图像,可以使用cvCreateImage”函数来创建。 3. 定义三角形的三个顶点坐标,并使用CvPoint”类型的结构体来存储它们。 4. 使用cvLine”函数分别绘制三角形的三条边。这需要调用三次“cvLine”函数,并将三个顶点坐标作为参数传递给它们。 5. 可选:使用cvShowImage”函数显示绘制好的图像。 下面是使用OpenCV在C中绘制三角形的示例代码: ```c #include <opencv2/highgui/highgui_c.h> #include <opencv2/imgproc/imgproc_c.h> int main() { // 创建一个空白的图像 IplImage* image = cvCreateImage(cvSize(400, 400), IPL_DEPTH_8U, 3); // 定义三角形的三个顶点坐标 CvPoint pt1 = cvPoint(100, 100); CvPoint pt2 = cvPoint(200, 100); CvPoint pt3 = cvPoint(150, 200); // 绘制三角形的三条边 cvLine(image, pt1, pt2, CV_RGB(255, 0, 0), 2, CV_AA, 0); cvLine(image, pt2, pt3, CV_RGB(255, 0, 0), 2, CV_AA, 0); cvLine(image, pt3, pt1, CV_RGB(255, 0, 0), 2, CV_AA, 0); // 显示绘制好的图像 cvShowImage("Triangle", image); cvWaitKey(0); // 释放图像内存 cvReleaseImage(&image); return 0; } ``` 在这个示例代码中,我们创建了一个大小为400x400的空白图像,并在其中绘制了一个三角形,最后显示了绘制好的图像。请注意,我们使用cvLine”函数绘制三角形的三条边,其中“CV_AA”参数表示使用反锯齿绘制,以获得更加平滑的边缘。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值