cv2 画多边形不填充_opencv 画图
发布日期:2021-06-24 13:54:46 浏览次数:2 分类:技术文章

本文共 4011 字,大约阅读时间需要 13 分钟。

learning opencv 第6章第1题解决方案

前言

opencv提供了丰富的函数用以图形绘制,包括矩形,线条,椭圆和多边形等,本篇文章对opencv的基本绘图函数做了一些介绍和说明。

椭圆绘制

绘制椭圆的函数说明和参数说明如下:

void ellipse(InputOutputArray img, Point center, Size axes,

double angle, double startAngle, double endAngle,

const Scalar& color, int thickness = 1,

int lineType = LINE_8, int shift = 0);

@param InputOutputArray img 防止椭圆的图像

@param Point center 椭圆的中心

@param Szie axes 椭圆长短轴的尺寸

@param double angle 椭圆的角度(一个完整的椭圆应该有360度)

@param double startAngle 椭圆的的起始角度(第一象限按照逆时针开始计算)

@param double endAngle 椭圆的结束角度

@param const Scalar& color 椭圆的颜色(BGR表示)

@param int thickness 椭圆边框的粗细程度

@param int lineType 椭圆边框的连接类型,默认为8领域连接

@param int shift 中心坐标和轴的小数位数,一般是0

绘制一个椭圆的代码如下所示:

ellipse(img, Point(455,120),

Size(126, 80), 360.0, 0.0, 360.0, Scalar(0, 0, 255), 1, 8, 0);

绘制单个多边形

opencv绘制多边形的函数说明如下,其基本参数与绘制椭圆的参数相似,需要注意的是,表述多边形顶点的参数,是一个Point 类型的数组

void fillConvexPoly(InputOutputArray img, const Point* pts, int npts,

const Scalar& color, int lineType = LINE_8,

int shift = 0);

绘制多个多边形

opencv 也提供了绘制多个多边形的函数,其说明如下,其基本参数与其他绘图函数的参数基本相同,不过,在表述多边形顶点的参数用到了二维数组和一维数组,如下:

void fillPoly(InputOutputArray img, const Point** pts,

const int* npts, int ncontours,

const Scalar& color, int lineType = LINE_8, int shift = 0,

Point offset = Point() );

@param const Point ** pts, 表示多个多边形顶点坐标的二维数组,如m个多边形,每个多边形有n个顶点

@param const int* npts, 多边形顶点数组成的一维数组

@param int ncontours,绘制多边形的个数

@param offset=Point(), 轮廓所有点可选偏移,一般保持默认即可

绘制两个六边形的一个实例如下代码所示:

Point pt[2][6] = { {Point(100,100),Point(80,150),Point(100,200),

Point(150,200),Point(170,150),Point(150,100)},

{Point(300,300),Point(250,350),Point(300,400),Point(400,400),

Point(450,350),Point(400,300)} };

int n[] = { 6,6 };

const Point* pp[] = { pt[0],pt[1] };

fillPoly(img, pp,n,2,Scalar(150, 186, 205), 8, 0);

以上代码绘制的多边形是填充后的多边形,opencv也提供了不带填充的多边形绘制函数,如下所示:

void polylines(InputOutputArray img, const Point* const* pts, const int* npts,

int ncontours, bool isClosed, const Scalar& color,

int thickness = 1, int lineType = LINE_8, int shift = 0 );

绘制线段

opencv提供了绘制线段的函数,其实现比较简单,由两个起点坐标和终点坐标两个参数决定:

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,

int thickness = 1, int lineType = LINE_8, int shift = 0);

总结

综上,回顾了opencv中几个基本的绘图函数,由以上几个示例,完成的一个opencv绘图的基本示例如下代码所示:

首先,未绘制任何图像的图像如下图所示:

总体实现代码如下:

#include

#include

/* (1) Load or create and display a color image

* (2) Draw one example of every shape and line that opencv can draw

*

*/

using namespace cv;

int main()

{

Mat img = imread("daminggong.PNG");

int s = 0;

int width = img.rows;

int height = img.cols;

std::cout << "\r\t在图像上绘制图形" << std::endl;

std::cout << "\r\t输入0,绘制椭圆" << std::endl;

std::cout << "\r\t输入1,绘制多边形" << std::endl;

std::cout << "\r\t输入2,绘制多个填充多边形" << std::endl;

std::cout << "\r\t输入3,绘制线段" << std::endl;

std::cout << "\r\t输入4,绘制无填充多边形" << std::endl;

std::cout << "\r\t输入99,结束绘制" << std::endl;

while (std::cin >> s)

{

// 画个椭圆

if (s == 0)

{

ellipse(img, Point(455,120),

Size(126, 80), 360.0, 0.0, 360.0, Scalar(0, 0, 255), 1, 8, 0);

}

//绘制多边形

else if (s == 1)

{

//多个顶点的坐标

Point PointArray[4] = {Point(50,50),Point(50,100),Point(100,100),Point(100,50) };

fillConvexPoly(img,PointArray,4,Scalar(34,180,238),8,0);

}//绘制两个多边形

else if (s == 2)

{

Point pt[2][6] = { {Point(100,100),Point(80,150),Point(100,200),

Point(150,200),Point(170,150),Point(150,100)},

{Point(300,300),Point(250,350),Point(300,400),Point(400,400),

Point(450,350),Point(400,300)} };

int n[] = { 6,6 };

const Point* pp[] = { pt[0],pt[1] };

fillPoly(img, pp,n,2,Scalar(150, 186, 205), 8, 0);

}

//绘制线

else if (s == 3)

{

line(img, Point(720,100), Point(720, 400), Scalar(255, 255, 0),2, 8, 0);

}

else if (s == 4)

{

Point pt_line[1][5] = { {Point(650,250),Point(600,300),Point(630,350),

Point(680,350),Point(700,300)} };

int count[] = {5};

const Point *p_line[] = {pt_line[0]};

polylines(img, p_line,count,1,1,Scalar(0, 255, 160), 2, 8, 0);

}

else if(s==99)

{

break;

}

else

{

std::cerr << "输入错误,请输入0-4之间的整数" << std::endl;

continue;

}

}

imshow("img_ed", img);

imwrite("img_ed.PNG", img);

waitKey(0);

return 0;

}

实现所有代码后,其效果如下:

转载地址:https://blog.csdn.net/weixin_33283907/article/details/112032850 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:人员梯度培养_人才梯队培养计划方案
下一篇:介词for和with 和of的用法_【英语中的for,to,at,of,in,on,with的用法】作业帮

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月01日 06时49分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

想学IT的必看!我的Android美团求职之路,面试总结 2019-04-29
扫地阿姨看完都学会了!大厂offer手到擒来,经典好文 2019-04-29
推荐程序员面试秘籍!2021年Android面试心得,含泪整理面经 2019-04-29
正式加入阿里巴巴!Android自定义View详解,大厂直通车! 2019-04-29
泪目!2021年Android面经分享,一线互联网公司面经总结 2019-04-29
安卓ndk开发,Android-Binder机制及AIDL使用,实战篇 2019-04-29
安卓rxjava面试,Android开发了解这些自然无惧面试,终局之战 2019-04-29
安卓内存使用情况监控,有了这些中高端面试专题-大厂还会远吗?使用指南 2019-04-29
安卓卡顿优化方法,来自阿里巴巴佛系安卓程序员的指南,通用流行框架大全 2019-04-29
安卓工程师面试题,Android开发者跳槽指南一线互联网公司面经总结 2019-04-29
安卓工程师面试题,意外收获字节跳动内部资料,附带学习经验 2019-04-29
安卓开发基础面试题,30岁以后搞Android已经没有前途?复习指南 2019-04-29
安卓开发面试题及答案,记录下我磕磕碰碰的三个月找工作经历,大牛最佳总结 2019-04-29
安卓开发面试题,揭秘ARouter路由机制,offer拿到手软 2019-04-29
安卓插件化开发!Android性能优化最佳实践,一线互联网公司面经总结 2019-04-29
【绝对干货】字节跳动上千道精选面试题还不刷起来!源码+原理+手写框架 2019-04-29
【金三银四】5G音视频时代还不学NDK开发吗?原理+实战+视频+源码 2019-04-29
【面试总结】史上最全的Android面试题集锦,深夜思考 2019-04-29
【面试总结】手持4个大厂offer的我,赶快收藏备战金九银十! 2019-04-29
事件分发机制怎么回答,Android开发你需要了解的那些事,深度好文 2019-04-29