绘制几何图形

  • 直线
  • 矩形
  • 多边形
  • 圆形
  • 椭圆
  • 文字

API

直线

CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);

矩形

CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

上方函数通过两点确定矩形的位置和大小,下方函数则是通过矩形对象 Rect 来确定。

CV_EXPORTS_W void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

多边形

CV_EXPORTS 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 );
CV_EXPORTS_W void polylines(InputOutputArray img, InputArrayOfArrays pts,bool isClosed, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0 );

圆形

CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

椭圆

CV_EXPORTS_W void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,int thickness = 1, int lineType = LINE_8);
CV_EXPORTS_W 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);

文字

CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org,int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );

示例

官方示例一

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#define w 400
using namespace cv;
void MyEllipse( Mat img, double angle );
void MyFilledCircle( Mat img, Point center );
void MyPolygon( Mat img );
void MyLine( Mat img, Point start, Point end );
int main( void ){char atom_window[] = "Drawing 1: Atom";char rook_window[] = "Drawing 2: Rook";Mat atom_image = Mat::zeros( w, w, CV_8UC3 );Mat rook_image = Mat::zeros( w, w, CV_8UC3 );MyEllipse( atom_image, 90 );MyEllipse( atom_image, 0 );MyEllipse( atom_image, 45 );MyEllipse( atom_image, -45 );MyFilledCircle( atom_image, Point( w/2, w/2) );MyPolygon( rook_image );rectangle( rook_image,Point( 0, 7*w/8 ),Point( w, w),Scalar( 0, 255, 255 ),FILLED,LINE_8 );MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) );MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) );MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) );MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) );imshow( atom_window, atom_image );moveWindow( atom_window, 0, 200 );imshow( rook_window, rook_image );moveWindow( rook_window, w, 200 );waitKey( 0 );return(0);
}
void MyEllipse( Mat img, double angle )
{int thickness = 2;int lineType = 8;ellipse( img,Point( w/2, w/2 ),Size( w/4, w/16 ),angle,0,360,Scalar( 255, 0, 0 ),thickness,lineType );
}
void MyFilledCircle( Mat img, Point center )
{circle( img,center,w/32,Scalar( 0, 0, 255 ),FILLED,LINE_8 );
}
void MyPolygon( Mat img )
{int lineType = LINE_8;Point rook_points[1][20];rook_points[0][0]  = Point(    w/4,   7*w/8 );rook_points[0][1]  = Point(  3*w/4,   7*w/8 );rook_points[0][2]  = Point(  3*w/4,  13*w/16 );rook_points[0][3]  = Point( 11*w/16, 13*w/16 );rook_points[0][4]  = Point( 19*w/32,  3*w/8 );rook_points[0][5]  = Point(  3*w/4,   3*w/8 );rook_points[0][6]  = Point(  3*w/4,     w/8 );rook_points[0][7]  = Point( 26*w/40,    w/8 );rook_points[0][8]  = Point( 26*w/40,    w/4 );rook_points[0][9]  = Point( 22*w/40,    w/4 );rook_points[0][10] = Point( 22*w/40,    w/8 );rook_points[0][11] = Point( 18*w/40,    w/8 );rook_points[0][12] = Point( 18*w/40,    w/4 );rook_points[0][13] = Point( 14*w/40,    w/4 );rook_points[0][14] = Point( 14*w/40,    w/8 );rook_points[0][15] = Point(    w/4,     w/8 );rook_points[0][16] = Point(    w/4,   3*w/8 );rook_points[0][17] = Point( 13*w/32,  3*w/8 );rook_points[0][18] = Point(  5*w/16, 13*w/16 );rook_points[0][19] = Point(    w/4,  13*w/16 );const Point* ppt[1] = { rook_points[0] };int npt[] = { 20 };fillPoly( img,ppt,npt,1,Scalar( 255, 255, 255 ),lineType );
}
void MyLine( Mat img, Point start, Point end )
{int thickness = 2;int lineType = LINE_8;line( img,start,end,Scalar( 0, 0, 0 ),thickness,lineType );
}

官方示例二

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
const int NUMBER = 100;
const int DELAY = 5;
const int window_width = 900;
const int window_height = 600;
int x_1 = -window_width/2;
int x_2 = window_width*3/2;
int y_1 = -window_width/2;
int y_2 = window_width*3/2;
static Scalar randomColor( RNG& rng );
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng );
int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng );
int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng );
int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng );
int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng );
int Drawing_Random_Circles( Mat image, char* window_name, RNG rng );
int Displaying_Random_Text( Mat image, char* window_name, RNG rng );
int Displaying_Big_End( Mat image, char* window_name, RNG rng );
int main( void )
{int c;char window_name[] = "Drawing_2 Tutorial";RNG rng( 0xFFFFFFFF );Mat image = Mat::zeros( window_height, window_width, CV_8UC3 );imshow( window_name, image );waitKey( DELAY );c = Drawing_Random_Lines(image, window_name, rng);if( c != 0 ) return 0;c = Drawing_Random_Rectangles(image, window_name, rng);if( c != 0 ) return 0;c = Drawing_Random_Ellipses( image, window_name, rng );if( c != 0 ) return 0;c = Drawing_Random_Polylines( image, window_name, rng );if( c != 0 ) return 0;c = Drawing_Random_Filled_Polygons( image, window_name, rng );if( c != 0 ) return 0;c = Drawing_Random_Circles( image, window_name, rng );if( c != 0 ) return 0;c = Displaying_Random_Text( image, window_name, rng );if( c != 0 ) return 0;c = Displaying_Big_End( image, window_name, rng );if( c != 0 ) return 0;waitKey(0);return 0;
}
static Scalar randomColor( RNG& rng )
{int icolor = (unsigned) rng;return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )
{Point pt1, pt2;for( int i = 0; i < NUMBER; i++ ){pt1.x = rng.uniform( x_1, x_2 );pt1.y = rng.uniform( y_1, y_2 );pt2.x = rng.uniform( x_1, x_2 );pt2.y = rng.uniform( y_1, y_2 );line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );imshow( window_name, image );if( waitKey( DELAY ) >= 0 ){ return -1; }}return 0;
}
int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng )
{Point pt1, pt2;int lineType = 8;int thickness = rng.uniform( -3, 10 );for( int i = 0; i < NUMBER; i++ ){pt1.x = rng.uniform( x_1, x_2 );pt1.y = rng.uniform( y_1, y_2 );pt2.x = rng.uniform( x_1, x_2 );pt2.y = rng.uniform( y_1, y_2 );rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType );imshow( window_name, image );if( waitKey( DELAY ) >= 0 ){ return -1; }}return 0;
}
int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng )
{int lineType = 8;for ( int i = 0; i < NUMBER; i++ ){Point center;center.x = rng.uniform(x_1, x_2);center.y = rng.uniform(y_1, y_2);Size axes;axes.width = rng.uniform(0, 200);axes.height = rng.uniform(0, 200);double angle = rng.uniform(0, 180);ellipse( image, center, axes, angle, angle - 100, angle + 200,randomColor(rng), rng.uniform(-1,9), lineType );imshow( window_name, image );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}
int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng )
{int lineType = 8;for( int i = 0; i< NUMBER; i++ ){Point pt[2][3];pt[0][0].x = rng.uniform(x_1, x_2);pt[0][0].y = rng.uniform(y_1, y_2);pt[0][1].x = rng.uniform(x_1, x_2);pt[0][1].y = rng.uniform(y_1, y_2);pt[0][2].x = rng.uniform(x_1, x_2);pt[0][2].y = rng.uniform(y_1, y_2);pt[1][0].x = rng.uniform(x_1, x_2);pt[1][0].y = rng.uniform(y_1, y_2);pt[1][1].x = rng.uniform(x_1, x_2);pt[1][1].y = rng.uniform(y_1, y_2);pt[1][2].x = rng.uniform(x_1, x_2);pt[1][2].y = rng.uniform(y_1, y_2);const Point* ppt[2] = {pt[0], pt[1]};int npt[] = {3, 3};polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType);imshow( window_name, image );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}
int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng )
{int lineType = 8;for ( int i = 0; i < NUMBER; i++ ){Point pt[2][3];pt[0][0].x = rng.uniform(x_1, x_2);pt[0][0].y = rng.uniform(y_1, y_2);pt[0][1].x = rng.uniform(x_1, x_2);pt[0][1].y = rng.uniform(y_1, y_2);pt[0][2].x = rng.uniform(x_1, x_2);pt[0][2].y = rng.uniform(y_1, y_2);pt[1][0].x = rng.uniform(x_1, x_2);pt[1][0].y = rng.uniform(y_1, y_2);pt[1][1].x = rng.uniform(x_1, x_2);pt[1][1].y = rng.uniform(y_1, y_2);pt[1][2].x = rng.uniform(x_1, x_2);pt[1][2].y = rng.uniform(y_1, y_2);const Point* ppt[2] = {pt[0], pt[1]};int npt[] = {3, 3};fillPoly( image, ppt, npt, 2, randomColor(rng), lineType );imshow( window_name, image );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}
int Drawing_Random_Circles( Mat image, char* window_name, RNG rng )
{int lineType = 8;for (int i = 0; i < NUMBER; i++){Point center;center.x = rng.uniform(x_1, x_2);center.y = rng.uniform(y_1, y_2);circle( image, center, rng.uniform(0, 300), randomColor(rng),rng.uniform(-1, 9), lineType );imshow( window_name, image );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}
int Displaying_Random_Text( Mat image, char* window_name, RNG rng )
{int lineType = 8;for ( int i = 1; i < NUMBER; i++ ){Point org;org.x = rng.uniform(x_1, x_2);org.y = rng.uniform(y_1, y_2);putText( image, "Testing text rendering", org, rng.uniform(0,8),rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);imshow( window_name, image );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}
int Displaying_Big_End( Mat image, char* window_name, RNG )
{Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);int lineType = 8;Mat image2;for( int i = 0; i < 255; i += 2 ){image2 = image - Scalar::all(i);putText( image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,Scalar(i, i, 255), 5, lineType );imshow( window_name, image2 );if( waitKey(DELAY) >= 0 ){ return -1; }}return 0;
}

C++ OpenCV(四):绘制几何图形相关推荐

  1. 10、OpenCV绘制几何图形

    OpenCV绘制几何图形 一.学习目标 二.OpenCV中点和颜色标量的表示 三.绘制不同的几何形状 四.完整代码示例 一.学习目标 了解点和颜色标量的数据结构对象 学会使用OpenCV画直线段 学会 ...

  2. 【OpenCV 4开发详解】图像上绘制几何图形

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. openCV(三)绘制几何图形

    openCV内置了几何图形绘制函数,通过简单的操作就可以绘制几何图形.例如,可以绘制直线.矩形.圆形.椭圆.多边形.文字等,分别对应函数cv2.line().cv2.rectangle().cv2.c ...

  4. Win10系列:VC++绘制几何图形2

    新建了Direct2D中的资源后,接下来初始化用于绘制图形的应用窗口.在解决方案资源管理器窗口中右键点击项目图标,在弹出的菜单栏中选中"添加", 并在"添加"的 ...

  5. OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题

    http://oulehui.blog.163.com/blog/static/79614698201191832753312/ 先回顾一下我们都学习了些什么: 第一课,编写第一个OpenGL程序 第 ...

  6. 【Android开发】图形图像处理技术-绘制几何图形

    常见的几何图形包括点.线.弧.矩形等.在Android中,Canvas类提供了丰富的绘制几何图形的方法,通过这些方法,可以绘制出各种几何图形.常用的几何图形的绘制方法如下所示: 1. 画一个圆使用的是 ...

  7. 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍

    计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours(),用于轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, co ...

  8. OpenCV 基本绘制Basic Drawing

    OpenCV 基本绘制Basic Drawing 基本绘制Basic Drawing 目标 OpenCV理论 Point点 Scalar标量 代码 解释 MyLine MyEllipse MyFill ...

  9. html5 绘制图形,HTML5绘制几何图形

    绘制几何图形 var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext(" ...

最新文章

  1. mysql 平均日营业额_一条SQL语句中算日销售额和月销售额
  2. 云服务器怎么查看文件目录结构,查看云服务器目录结构图
  3. 总的秒数等于几小时几分钟几秒(Python)
  4. OpenSSL再曝CCS注入漏洞-心伤未愈又成筛子
  5. String... 参数定义中有三个点的意思
  6. c语言读取nc文件格式,nc文件资料地读取与处理.doc
  7. 基于matlab的绘图设计,matlab课程设计---利用MATLAB仿真软件进行绘图
  8. HDU2020 绝对值排序【入门】
  9. python 环形图_Python通过matplotlib画双层饼图及环形图简单示例
  10. java运行库下载_Java运行库下载-jdk1.7 64位下载1.8.0.20 官方最新版-东坡下载
  11. Simply Fortran 保姆级教程
  12. 朗兰兹纲领:关于数学大一统的伟大构想
  13. JVM -- JVM内存结构:程序计数器、虚拟机栈、本地方法栈、堆、方法区(二)
  14. python万年历节气_python3实现万年历(包括公历、农历、节气、节日)
  15. WordPress | QQ互联授权登录
  16. c语言青蛙游戏,c语言:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?...
  17. 关于java中的setOut()方法
  18. 微信公众号回复服务器参数错误,为什么微信文章网址在浏览器访问提示参数错误...
  19. 工作记录 01-02-2018 至 03-16-2018
  20. 基于肌肉骨骼模型的预测仿真

热门文章

  1. 流程图设计(html+css+js)
  2. java split保留分隔_String split如何保留分隔符
  3. 软工实践第二次作业之个人项目
  4. 基于ERP的WMS系统解决方案
  5. css定位-css新增选择器(内减,属性,伪类,2d变换,过渡)
  6. 如何通过Gitalk评论插件,5分钟为你的博客快速集成评论功能
  7. 期刊影响因子的中外算法差别很大
  8. 计算机音乐文爱图片,CG/贺敬轩《文爱》[FLAC/MP3-320K]
  9. 天融信数通小百科:无线AP的Soul mate—POE交换机
  10. 用于地址解析的协议是服务器,用于解析域名的协议是什么?