OpenCV绘图和注释

OpenCV的绘图函数可以在任意深度的图像上工作,但在大多数情况下,它们只对图像的前三个通道有影响BGR,如果是单通道图像,则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型和亚像素对齐等参数。

艺术线条

画直线或者其他图形的函数通常可以接受宽度(thickness)和线型(lineType)的参数。这两个参数都是整型的,lineType参数只能是4、8或cv::LINE_AA,分别代表4邻域连接、8邻域连接和平滑处理。

 

同一条直线分别使用4邻域连接(A)8邻域连接(B)和平滑处理(C)的线型

 填充多边形

cv::circle()  绘制圆形

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

参数:

参数 img center radius color thickness lineType shift
含义 绘制的圆 圆心 半径 颜色 线宽 线型 小数位数

cv::clipLine()  判断pt1-pt2的直线是否在矩形范围内,只有完全在矩阵范围外时才返回false

bool cv::clipLine(Size imgSize, Point& pt1, Point& pt2)

bool cv::clipLine(Size2I imgSize, Point& pt1, Point& pt2)

bool cv::clipLine(Rect imgRect, Point& pt1, Point& pt2)

参数:

参数 imgSize或imgRect pt1 pt2
含义 指定矩阵 第一个点的坐标 第二个点的坐标

注:前两种形式只指定矩形的大小,默认从(0,0)点开始。

cv::ellipse()  绘制椭圆

void cv::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)

void cv::ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color, int thickness=1, int lineType=LINE_8)

参数:

参数 img center axes angle startAngle endAngle color thickness lineType shift
含义 绘制的椭圆 中心 椭圆尺寸 主轴角度 圆弧起点 圆弧终点 颜色 线宽 线型 小数位数

第二种形式其实是根据外接矩形绘制椭圆。

cv::ellipse2Poly()  用折线近似弧度

void cv::ellipse2Poly(Point center, Size axes, int angle, int arcStart, int arcEnd, int delta, std::vector<Point>& pts) 

void cv::ellipse2Poly(Point2d center, Size2d axes, int angle, int arcStart, int arcEnd, int delta, std::vector<Point>& pts)

参数:

参数 center axes angle startAngle endAngle delta pts
含义 圆心 中心 主轴角度 圆弧起点 圆弧终点 折线顶点间的角度,定精度 结果

cv::fillConvexPoly()  绘制一个填充的多边形

void cv::fillConvexPoly(Mat& img, const Point* pts, int npts, const Scalar& color, int lineType=LINE_8, int shift=0)

void cv::fillConvexPoly(InputOutputArray img, InputArray pts, int npts, const Scalar& color, int lineType=LINE_8, int shift=0)

参数:

参数 img pts npts color thickness lineType shift
含义 绘制的多边形 顶点集 pts中的点数 颜色 线宽 线型 小数位数

cv::fillPoly()  绘制任意数量的填充的多边形

void cv::fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=LINE_8, int shift=0, Point offset=Point())

void cv::fillPoly(InputOutputArray img, InputArrayOfArrays pts, const Scalar& color, int lineType=LINE_8, int shift=0, Point offset=Point())

参数:

参数 img pts npts ncontours color thickness lineType shift offset
含义 绘制的多边形 顶点集 pts中的点数 多边形数目 颜色 线宽 线型 小数位数 顶点偏移量

第二种形式,pts中有多少个元素就有多少个多边形。

cv::line()  绘制直线

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

参数:

参数 img pt1 pt2 color thickness lineType shift
含义 绘制的直线 第一个点 第二个点 颜色 线宽(4或8) 线型 小数位数

cv::polyLines()  绘制任意数量的未填充的多边形

void cv::polyLines(Mat& 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)

void cv::polyLines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness=1, int lineType=LINE_8,int shift=0)

参数:

参数 img pts npts ncontours isClosed color thickness lineType shift offset
含义 绘制的多边形 顶点集 pts中的点数 多边形数目 是否封闭 颜色 线宽(4或8) 线型 小数位数 顶点偏移量

第二种形式,pts中有多少个元素就有多少个多边形。isClosed为false则不封闭。

cv::rectangle()  绘制矩形

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

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

参数:

参数 img pt1 pt2 rec color thickness lineType shift
含义 绘制的矩形 第一个点 第二个点 矩形的坐标和大小 颜色 线宽 线型 小数位数

cv::LineIterator  得到一个用来顺序得到网格线每一个像素的迭代器

cv::LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2, int connectivity=8, bool leftToRight=false)

参数:

参数 img pt1 pt2 connectivity leftToRight
含义 图像矩阵 第一个点 第二个点 线型(4或8) 是否从左到右

分析:初始化后,直线像素的数量就保存在一个整型成员变量cv::LineIterator::count中,重载的取值算子cv::LineIterator::operator*()返回一个指向当前像素的指针。从直线的一端开始,通过重载增量算子cv::LineIterator::operator++()移动当前像素。

字体和文字

cv::putText()  在图像中绘制文字

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

参数:

参数 img text org fontFace fontScale color thickness lineType bottomLeftOrigin
含义 原始图片 文本内容 左上角的位置 字体 字体大小 颜色 线宽 线型(4,或8) 是否左下角为原点
可用字体
标识符 描述
cv::FONT_HERSHEY_SIMPLEX 普通大小无衬线字体
cv::FONT_HERSHEY_PLAN 小号无衬线字体
cv::FONT_HERSHEY_DUPLEX 普通大小无衬线字体,但比cv::FONT_HERSHEY_SIMPLEX更复杂
cv::FONT_HERSHEY_COMPLEX 普通大小无衬线字体,但比cv::FONT_HERSHEY_DUPLEX更复杂
cv::FONT_HERSHEY_TRIPLEX 普通大小无衬线字体,但比cv::FONT_HERSHEY_COMPLEX更复杂
cv::FONT_HERSHEY_COMPLEX_SMALL 小号版本的cv::FONT_HERSHEY_COMPLEX
cv::FONT_HERSHEY_SCRIPT_SIMPLEX 手写体
cv::FONT_HERSHEY_SCRIPT_COMPLEX 比cv::FONT_HERSHEY_SCRIPT_SIMPLEX更复杂的变体
cv::FONT_HERSHEY_ITALIC 斜体,可以和以上每一种组合使用
上述字体对应字样

cv::getTextSize()  获取一个文本的宽度和高度

Size cv::getTextSize(const String& text, int fontFace, double fontScale, int thickness, int* baseLine)

参数:

参数 text fontFace fontScale thickness baseLine
含义 文本 字体 字体大小 线宽 文字最低点文字基线的y坐标值