opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]

opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]常用宏定义:#defineCV_RGB(r,g,b)cvScalar((b),(g),(r),0)#defineCV_FILLED-1#defineCV_AA16#definecvDrawRectcvRectangle#definecvDrawLinecvLine#definecvDrawCirclecvCircle#definec

大家好,又见面了,我是你们的朋友全栈君。

常用宏定义:

#define CV_RGB( r, g, b )  cvScalar( (b), (g), (r), 0 )
#define CV_FILLED -1

#define CV_AA 16

#define cvDrawRect cvRectangle
#define cvDrawLine cvLine
#define cvDrawCircle cvCircle
#define cvDrawEllipse cvEllipse
#define cvDrawPolyLine cvPolyLine

########################################################3

直线 cvLine()

/* Draws 4-connected, 8-connected or antialiased line segment connecting two points */
CVAPI(void)  cvLine( CvArr* img, CvPoint pt1, CvPoint pt2,
                     CvScalar color, int thickness CV_DEFAULT(1),
                     int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) );

array:输入图像

pt1、pt2:直线的两点  CvPoint()结构

typedef struct CvPoint
{
    int x;
    int y;
}
CvPoint;

color:边的颜色 CvScalar结构

typedef struct CvScalar
{
    double val[4];
}
CvScalar;

这种结构是四个双精度浮点型变量的集合,前三个分别代表红、绿、蓝通道

常用的便捷宏指令CV_RGB(r, g, b)

###############################################################

矩形 cvRectagle()

/* Draws a rectangle given two opposite corners of the rectangle (pt1 & pt2),
   if thickness<0 (e.g. thickness == CV_FILLED), the filled box is drawn */
CVAPI(void)  cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2,
                          CvScalar color, int thickness CV_DEFAULT(1),
                          int line_type CV_DEFAULT(8),
                          int shift CV_DEFAULT(0));

pt1和pt2为对顶角

thickness参数可设置为CV_FILL,其值是-1,表示使用color填充内部 在圆形和矩阵等很多封闭图形函数都可用

################################################################

圆形 cvCircle()

/* Draws a circle with specified center and radius.
   Thickness works in the same way as with cvRectangle */
CVAPI(void)  cvCircle( CvArr* img, CvPoint center, int radius,
                       CvScalar color, int thickness CV_DEFAULT(1),
                       int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0));

center:圆中心 CvPoint()结构

radius:圆半径

##############################################################

椭圆 cvEllipse() cvEllipseBox

/* Draws ellipse outline, filled ellipse, elliptic arc or filled elliptic sector,
   depending on <thickness>, <start_angle> and <end_angle> parameters. The resultant figure
   is rotated by <angle>. All the angles are in degrees */
CVAPI(void)  cvEllipse( CvArr* img, CvPoint center, CvSize axes,
                        double angle, double start_angle, double end_angle,
                        CvScalar color, int thickness CV_DEFAULT(1),
                        int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0));

axes:CvSize()结构,height和width参数分别表示椭圆的长短半轴长

typedef struct CvSize
{
    int width;
    int height;
}
CvSize;


angle:指偏离主轴的角度,从X轴算起,逆时针为正

start_angle和end_angle表示弧线可是和结束位置的角度。因此,一个完整的椭圆必须分别将这两个值分别设为0度和360度

CV_INLINE  void  cvEllipseBox( CvArr* img, CvBox2D box, CvScalar color,
                               int thickness CV_DEFAULT(1),
                               int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) )
{
    CvSize axes;
    axes.width = cvRound(box.size.width*0.5);
    axes.height = cvRound(box.size.height*0.5);

    cvEllipse( img, cvPointFrom32f( box.center ), axes, box.angle,
               0, 360, color, thickness, line_type, shift );
}

box:CvBox2D结构 

typedef struct CvBox2D
{
    CvPoint2D32f center;  /* Center of the box.                          */
    CvSize2D32f  size;    /* Box width and length.                       */
    float angle;          /* Angle between the horizontal axis           */
                          /* and the first side (i.e. length) in degrees */
}
CvBox2D;

####################################################################

void paint(void)
{
	IplImage *src=cvLoadImage("lena.jpg");
	if (src == NULL)
	{
		exit(0);
	}

	cvLine(src, cvPoint(3, 3), cvPoint(3, 300), CV_RGB(255, 255, 255), 1, 8);
	cvRectangle(src, cvPoint(10, 10), cvPoint(100, 100), CV_RGB(255, 255, 255), 1);
	cvCircle(src, cvPoint(350, 350), 50, CV_RGB(255, 255, 255), 1);
	cvEllipse(src, cvPoint(200, 200), cvSize(100, 50), 90, 0, 360, CV_RGB(255, 255, 255), 1, 8);
	
	CvSize2D32f size=cvSize2D32f(100, 50);
	CvBox2D box;
	box.center.x = 100;
	box.center.y = 300;
	box.size = size;
	box.angle = 90;
	cvEllipseBox(src, box, CV_RGB(255, 255, 255), 1, 8, 0);

	cvNamedWindow("src");
	cvShowImage("src", src);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvDestroyWindow("src");
}


opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]

######################################################################################

/* Fills convex or monotonous polygon. */
CVAPI(void)  cvFillConvexPoly( CvArr* img, const CvPoint* pts, int npts, CvScalar color,
                               int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0));

cvFillConvexPoly()一次只能画一个多边形,而且只能画凸多边形 

pts:存储点的数组

npts:存储点的数目

void convexPoly(void)
{
	IplImage *Image1;

	CvPoint PointArray1[6];
	int PolyVertexNumber;
	int Shift;

	 CvSize ImageSize1 = cvSize(1000,700);
     Image1 = cvCreateImage(ImageSize1, IPL_DEPTH_8U, 3);

     PointArray1[0]=cvPoint(200,200);
     PointArray1[1]=cvPoint(400,100);
     PointArray1[2]=cvPoint(650,230);
     PointArray1[3]=cvPoint(800,300);
     PointArray1[4]=cvPoint(900,550);
     PointArray1[5]=cvPoint(100,400);

     CvScalar Color=CV_RGB(255,255,255);
     PolyVertexNumber=6;
     Shift=0;

     cvFillConvexPoly(Image1,PointArray1,PolyVertexNumber,Color,CV_AA,Shift);

     cvNamedWindow("FillConvexPoly",0);
     cvShowImage("FillConvexPoly",Image1);
     cvWaitKey(0);
     cvSaveImage("poly.jpg",Image1);
     cvReleaseImage(&Image1);
}


opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]

#######################################################

/* Fills an area bounded by one or more arbitrary polygons */
CVAPI(void)  cvFillPoly( CvArr* img, CvPoint** pts, const int* npts,
                         int contours, CvScalar color,
                         int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) );

/* Draws one or more polygonal curves */
CVAPI(void)  cvPolyLine( CvArr* img, CvPoint** pts, const int* npts, int contours,
                         int is_closed, CvScalar color, int thickness CV_DEFAULT(1),
                         int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0) );

npts:由记数点构成的数组,与多边形对应

is_closed为true:则起点和终点连线;否则,不连线

void fillPoly(void)
{
	IplImage *src=cvLoadImage("lena.jpg");
	if (src == NULL)
		exit(0);

	CvPoint** pt=new CvPoint*[1];
	pt[0]=new CvPoint[6];

	pt[0][0]=cvPoint(100, 100);
	pt[0][1]=cvPoint(400, 50);
	pt[0][2]=cvPoint(500, 400);
	pt[0][3]=cvPoint(300, 500);
	pt[0][4]=cvPoint(200, 300);
	pt[0][5]=cvPoint(50, 400);

	int *npt=new int[1];
	npt[0]=6;

	int contours=1;

	cvFillPoly(src, pt, npt, contours, CV_RGB(255, 255, 255), 8);
	//cvPolyLine(src, pt, npt, contours, 1, CV_RGB(255, 255, 255));//is_closed为true则将起点和终点连线
	//cvPolyLine(src, pt, npt, contours, 0, CV_RGB(255, 255, 255));//is_closed为false则不将起点和终点连线

	cvNamedWindow("src");
	cvShowImage("src", src);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvDestroyWindow("src");
}


opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]

opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]

opencv 绘图 cvLine cvRectangle cvCircle cvEllipse cvEllipseBox cvFillPoly cvConvexPoly cvPolyLine[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161540.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tomcat日志乱码怎么解决_linux日志中文乱码

    tomcat日志乱码怎么解决_linux日志中文乱码中文乱码大家在Windows启动Tomcat应该都会遇到中文乱码,其实也不影响使用,但是笔者看着这个乱码难受,于是提供一种较简单的解决方案。解决方案将Tomcat安装目录下/conf/logging.properties中的控制台日志编码由默认的UTF-8改为GBK即可。扩展乱码原因:Windows的控制台默认使用GB2312字符集,而Tomcat控制台日志输出默认使用UTF-8字符集,于是产生中文乱码,可使用chcp命令暂时修改控制台字符集

    2022年9月26日
    2
  • rabbitmqkafka对比_全场景

    rabbitmqkafka对比_全场景这是陈东景于2021年8月29日下午16点原创作品,转载请标明出处!!!!在进行软件设计的过程中,如果软件设计业务上存在需要短时间内处理大批量的信息,又需要能保证软件能正常运行(保证软件的高可靠和高可用)。因为大批量(几十万,几百万级别的数据或者消息需要同一个时间处理),软件的IO过高,会导致软件运行阻塞或者消耗内存过高而崩溃,甚至是宕机。消息队列的概念被提了出来,通过缓存消息的模式,进行生产和消费。通过异步处理的方式,解耦这种短时间内出现大批量需要处理消息的场景。目前我们使用到的比…

    2022年10月14日
    3
  • 局域网与广域网详解区别_广域网有哪些

    局域网与广域网详解区别_广域网有哪些1.局域网  局域网,英文名字LocalAreaNetwork,缩写为LAN。是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。生活中我们的每一个学校、公司都是一个局域网局域网可以理解为我们自己使用路由器、交换机组成的内部网络这个网络实现的是内部机器的通信,比如咱们访问学校的…

    2022年10月19日
    2
  • Linux 设置oracle1521端口[通俗易懂]

    Linux 设置oracle1521端口[通俗易懂]centos5安装oracle实现其他机器连接,oracleserver与其他机器可以ping通,但由于linux防火墙默认是不开启1521端口的,应此需设置iptables;开始用命令设置:iptables-AINPUT-ptcp–dport1521-jACCEPTiptables-AOUTPUT-ptcp–sport1521-jACCEPT

    2022年5月29日
    46
  • TCP-Traceroute核心代码[通俗易懂]

    TCP-Traceroute核心代码[通俗易懂]//tracer.c//Copyright(c)1999-2004//S8S8.netNetworkTech.Forum//writtenby13thFloor//Allrightsreserved.#include#include#include#includeusingnamespacestd;#include”pcap.h”#include”hea

    2022年6月20日
    29
  • 一文看懂风控模型所有

    一文看懂风控模型所有【与数据同行】已开通综合、数据仓库、数据分析、产品经理、数据治理及机器学习六大专业群,加微信号frank61822702为好友后入群。新开招聘交流群,请关注【与数据同行】公众号,后台回…

    2022年6月6日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号