OpenCV的绘图函数可以在任意深度的图像上工作,但在大多数情况下,它们只对图像的前三个通道有影响BGR,如果是单通道图像,则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型和亚像素对齐等参数。
艺术线条
画直线或者其他图形的函数通常可以接受宽度(thickness)和线型(lineType)的参数。这两个参数都是整型的,lineType参数只能是4、8或cv::LINE_AA,分别代表4邻域连接、8邻域连接和平滑处理。
填充多边形
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坐标值 |