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 //基线长度
);