OpenCV学习心得——基础篇——绘图与注释

OpenCV学习心得——基础篇——绘图与注释
FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER

简介:

这一系列的学习心得第一轮将参考《学习OpenCV3》一书

操作系统版本:Ubuntu16.04(在这里博主在Linux下进行运行的)
http://www.ubuntu.org.cn/download/desktop 桌面版ubuntu16.04 下载

电子版书籍下载地址
暂无资源

参考:https://blog.csdn.net/qq_41508747/article/details/88393433

更新:

2019.8.2 补全一些注释

内容:

前言:
在我们学习的Opencv最终是要做出一个完整是的图像识别程序,然而在最基本的识别中如何判定是否识别到那呢,这就需要opencv中的提供画直线、矩形、圆等图形的函数。
opencv的绘画函数可以在任意深度的图像上工作,但是大多数情况下,它们只对图像的前三个通道有影响,如果是单通道图像,则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型和亚像素对齐等参数。

注意:使用CV_RGB(r ,g , b)会生成一个cv::Scalar对象s,它的值s.val[ ] = { b,g,r,0 },由于opencv的函数一般只能通过参数的顺序来判断哪个是红色,绿色或者蓝色,而对于数据,其顺序则为BGR。

一般来说直线与其他图形(圆,矩形之类的)的函数可以接受宽度(thickness)和线型(lineType)的整型参数。但是第二参数的值只能是4,8或者cv::LINE_AA。

绘图函数表

函数 描述
cv::circle( ) 画一个简单圆
cv::clipLine( ) 判断一条直线是否在给定的矩形内
cv::ellipse() 画一个椭圆(可以倾斜)
cv::ellipse2Poly( ) 计算一个近似椭圆的多边行
cv::fillConvexPoly( ) 画一个填充的简单多边形
cv::fillPoly( ) 画一个填充的任意多边形
cv::line( ) 画一个简单直线
cv;:rectangle( ) 画一个简单的矩形
cv::polyLines( ) 画多重折线

详解:
cv::crcle( )

void circle (
	cv::Mat&   img,              // 绘制的图像img
	cv::Point   center,          // 圆心坐标(二维坐标)
	int              radius,     // 半径范围(圆形)
	const cv::Scakar& color,     // 颜色,RGB
	int			  thckness = 1,  // 线的宽度(非整数为填充)
	int			  lineType = 8,  // 线型, 4 or 8
	Int			  shift  =  0    // 圆心坐标点与半径值的小数点位数
	);

cv::clipLine( )

//第一种方式:直线直接与矩形比较,当直线完全在指定矩形范围之外则返回False。
bool clipLine(
	cv::Rect   imgRect,   //指定的矩形
	cv::Point& pt1,       //第一个端点(坐标)
	cv::Point& pt2        //第二个端点(坐标)
	);
	
//调用矩形范围从(0,0)开始进行比较
bool clipLine(
	cv;:size   imgSize,    //图像大小,矩形范围为(0,0)开始
	cv::Point&  pt1,       //第一个端点(坐标)
	cv::Point&  pt2 	   //第二个端点(坐标)
	);

cv::ellipse( )

bool ellipse(
	cv::Mat&	img,         //绘制的图像
	cv::Point  center,       //椭圆圆心坐标
	cv::Size	axes,	     //椭圆长轴和短轴的长度
	double		angle,       //主轴的角度(计算方式从水平方向开始逆时针旋转)
	double  	startAngle,  //圆弧起始角度(绘画完整的椭圆则设置为0,360)
	double   	endAngle,    //圆弧终止角度
	const cv::Scalar&	color,  //颜色
	int	thickness = 1,    //线宽
	int 	lineType = 8,  //线型
	int	shift = 0            //圆心坐标心和数轴的精度
	);

bool ellipse(
	cv::Mat&	img,  //
	const cv::RotatedRect&  rect,
	const cv::Scalar&	color,
	Int	thickness = 1,
	Int	lineType = 8,
	Int 	shift = 0
	);

cv::ellopse2Poly( )

void ellipse2Poly(
	cv::Point		center,  // 椭圆中心位置
	cv::Size		axes,	 // 长轴和短轴的长度
	double			angle,	 // 长轴倾斜角
	double		angle,       //主轴的角度(计算方式从水平方向开始逆时针旋转)
	double  	startAngle,  //起弧角度(绘画完整的椭圆则设置为0,360)
	int			delta,       //指定下一个采样点的角度delta参数
	vector&	pts	 //计算出的点使用vector<> pts返回

注意:cv::ellopse2Poly( )函数是在cv::ellipse( )函数中内部使用的,用于计算椭圆弧,但是也可以单独进行调用。这函数就可以计算出一系列的点,用以这些点作为顶点的多边形来近似指定的椭圆弧。

cv;:fillConvexPoly( )

void fillConvexPoly(
	cv::Mat&		        Img,  //图像初始化
	const cv::Point*		pts,  //多边形的定点坐标集合。
	int		npts,  //多边形的定点个数
	const cv::Scalar&	    color,   //颜色
	int	lineType = 8,  //线型
	int	shift = 0   //顶点坐标的小数点位数
	);

这个函数用于绘制图形虽然比cv::fillPoly( )速度快的多,但是在多边形有自交点时不能正确工作。(其中多边形被认定为封闭的)

cv;:fillPoly( )

void fillPoly(
	cv::Mat&	img, //图像初始化
	const cv::Point* pts,  //多边形的顶点坐标集合
	int npts,        //顶点个数
	int contours,   //组成填充区域的线段的数量
	const cv::Scalar& color,
	int lineType = 8,
	int shift = 0,
	cv::Point offset = Point( ) //加入顶点坐标上的像素偏移
	);

可以绘制任意数量的填充的多边形,并且可以处理自交点的情况。

cv::line( )

cv::Mat&		img,
cv::Point		pt1,
cv::Point		pt2
const cv::Scalar& color,
int 			lineType = 8,
int 			shift = 0

在图像img上绘制一条从pt1到pt2的直线,受图像边缘所影响。

cv::rectangle( )

void rectangle(
	cv::Mat&	img, //图像
	cv::Point	pt1,  //矩形的一个顶点
	cv::Point	pt2  //矩形对角线上的另一个顶点
	const cv::Scalar& color,  //颜色
	int lineType = 8,
	int shift = 0  //坐标点小数位
	);

void rectangle(
	cv::Mat&	img,
	cv::Rect 	r,
	const cv::Scaar& color,
	int	lineType = 8,
	int	shift = 0
	);

在图像上绘制一个从角点pt1与pt2的矩形。使用一个cv::Rect类型的参数r指定矩形的坐标的大小。

cv::polyLines( )

void polyLines(
	cv::Mat&	img,
	const cv::Point*	pts,    //顶点集
	Int	npts,	                //表示每一个多边形轮廓里面有多少个点
	Int 	ncontours,          //表示一共有多少个不同的多边形轮廓
	bool	isClosed,
	const cv::Scalar& color,
	Int	lineType = 8,
	Int	shift = 0
	);

可以绘制任意数量的未填充的多边形。

cv::Linelterator

Linelterator::Linelterator(
	cv::Mat&	img,
	cv::Point	pt1, //第一个点结束的线
	cv::Point	pt2 //第二个点结束的线
	int	lineType = 8,
	bool	leftToRight = false
	left
	);

用来顺序得到网格线每一个像素的直线迭代器。,也是Opencv中第一个仿函数的例子。
其目的是对直线的每一个像素进行某些特殊处理。如果要创建一些特殊效果,例如将一个像素的颜色从黑色变成白色或者从白色变成黑色

当在访问一个独立的“像素”时,需要记住这个像素可能有一个或者多个通道,并且它可能是任意深度类型的图像。例如:如果处理的是一个三通道的32位浮点数的图像,迭代器设名为iter,然后再通过(Vec3f*)*iter这样来转换返回的(指针)值。

文字绘制函数

函数 描述
cv::putText( ) 在图像中绘制指定文字
cv::getTextSize( ) 获取一个文字的宽度与高度

cv::putText( )

void cv::putText(
	cv::Mat&			img,       //输入图像
	const string&		text,      //显示字符串
	cv::Point			origin,    //第一个字符左下角的坐标
	int					fontFace,  //字体结构初始化
	double				fontScale,  
	cv::Scalar 			color,     //文本的字体颜色
	int	thickness = 1,
	int	lineType = 8,
	bool	bottomLeftOrigin = false
	);

将指定的文字将在以左上角为原点的文字框中以color指定的颜色绘制出来,除非bottomLeftOrigin标志被设为真。

下列为可以提供了使用的字体

函数 描述
cv::FONT_HERSHEY_SIMPLEX 普通大小无衬线字体
cv::FONT_HERSHEY_PLAIN( ) 小号无衬线字体
cv::FONT_HERSHEY_DUPLEX 普通大小无衬线字体(复杂)
cv::FONT_HERSHEY_SCRIPT_SIMPLEX 手写体

cv;:getTextSize( )

cv::Size cv::getTextSize(
const string& text,   //输入的字符
cv::Point 	origin,
int	fontFace,
double	fontScale, //字符初始化
int  thickness, 
int* baseLine  //基线长度
);

你可能感兴趣的:(OpenCV3教程,OpenCV3学习)