一、绘图
OpenCV提供了一大批可供画直线、矩形、圆等图形的函数。OpenCV的绘图函数可以在任意深度的图像上工作,但在大多数情况下,它们只对图像的前三个通道有影响,如果是单通道图像,则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型(与直线平滑度有关)和亚像素对齐等参数。
想指定颜色的时候,通常的做法是使用?cv::Scalar???对象,即使大多数时候只用到最前面的三个值。(有些时候使用??cv::Scalar??里面的第四个值来表示透明通道是很方便的,但是绘图函数目前还不支持透明混合处理)按照惯例,OpenCV在对多通道图像进行色彩渲染是使用BGR的顺序。
Qt学习基地(免费报名学习):C/C++项目实战/Qt5/C语言/c++/数据库/OpenCV/MFC/QT项目-学习视频教程-腾讯课堂
1.1、绘制线条
画直线或者其他图形(虚线、圆、矩形等)的函数通常可以接受宽度(??thickness???)和线型(??lineType??)的参数。这两个参数都是整型的,但是第二个参数的值只能是4、8或者cv::LINE_AA。
??thickness???参数是指线宽的像素数。对于圆、矩形和其他封闭图形,??thickness???参数可以被设置为??cv::FILLED??(相当于-1)。这样的话,整个图形就会被用边界一样的颜色填充满。
??lineType??参数表示直线是“4邻域连接”或者“8邻域连接”或者是平滑处理。
有些算法使用shift参数来进行亚像素对齐,当shift参数有效时,这个值将被用来指定整数参数的小数位。例如,你要画一个圆,设置圆心为(5, 5),但又把shift参数设为1,这样会得到一个圆心在(2.5, 2.5)的圆(简单理解就是值会被除以2的shift次方)。这个对齐效果通常会很细微,取决于使用的线型。在平滑处理的直线中这个效果会比较明显。
绘图函数列表
函数 | 描述 |
cv::circle() | 画一个简单圆 |
cv::clipLine() | 判断一条直线是否在给定的矩形内 |
cv::ellipse() | 画一个椭圆(可以倾斜,或者只有部分圆弧) |
cv::ellipse2Poly() | 计算一个近似椭圆的多边形 |
cv::fillConvexPoly() | 画一个填充的简单多边形 |
cv::fillPoly() | 画一个填充的任意多边形 |
cv::line() | 画一条简单直线 |
cv::rectangle() | 画一个简单矩形 |
cv::polyLines() | 画多重折线 |
绘图函数详解
??cv::circle()??:画一个简单圆
void circle(
cv::Mat& img, //绘图图像
cv::Point center, //圆的中心坐标
int radius, //圆的半径
const cv::Scalar& color, //圆的颜色
int thickness = 1, //线宽
int lineType = 8, //线类型
int shift = 0 //亚像素对齐
);
??cv::clipLine()??:判断一条直线是否在给定的矩形内
bool clipLine(
cv::Rect imgRect, //图像矩形
cv::Point& pt1, //直线的第一个点
cv::Point& pt2 //直线的第二个点
);
bool clipLine(
cv::Size imgSize, //图像的大小
cv::Point& pt1, //直线的第一个点
cv::Point& pt2 //直线的第二个点
);
第一种函数的形式使用cv::Rect,直线就是和这个矩形进行比较,只有当直线完全在指定的矩形范围之外时,函数才会返回False;
第二种函数的形式只有cv::Size参数和第一种形式不同,调用第二种形式相当于调用第一种形式时矩阵范围是从(0, 0)开始的;
??cv::ellipse()??:画一个椭圆(可以倾斜,或者只有部分圆弧)
bool ellipse(
cv::Mat& img, //绘图图像
cv::Point center, //椭圆的中点坐标
cv::Size axes, //椭圆长轴和短轴的长度
double angle, //长轴的倾斜角度
double startAngle, //弧绘制的起始角度
double endAngle, //弧绘制的结束角度
const cv::Scalar& color, //颜色
int thickness = 1, //线宽
int lineType = 8, //线型
int shift = 0 //亚像素对齐
);
bool ellipse(
cv::Mat& img, //绘图图像
const cv::RotateRect& rect, //椭圆的矩形边界
const cv::Scalar& color, //颜色
int thickness = 1, //线宽
int lineType = 8, //线型
int shift = 0 //亚像素对齐
);
第一个函数通过指定长短轴和倾斜角的椭圆弧,当起始角度和结束角度设置为0、360时才是封闭的椭圆,否则是一个弧;
第二个函数通过cv::RotatedRect指定需要绘制的椭圆的外边框,在矩形内绘制一个内接椭圆;
??cv::ellipse2Poly()??:计算一个近似椭圆的多边形
void ellipse2Poly(
cv::Point center, //椭圆的中心坐标
cv::Size axes, //长轴和短轴的长度
double angle, //长轴的角度
double startAngle, //绘制弧的起始角度
double endAngle, //绘制弧的结束角度
int delta, //采样点的角度
vector<cv::Point>& pts //结果
);
cv::ellipse2Poly()函数是在cv::ellipse()函数内部使用的,用来计算椭圆弧,但是也可以单独调用。给定一个椭圆弧参数(和cv::ellipse()定义中相同的center,axes,angle,startAngle和endAngle)和用来指定下一个采样点角度delta参数之后,cv::ellipse2Poly()函数就可以计算出一系列的点,用这些点作为顶点的多边形来近似指定的椭圆弧。计算出的点使用vector<> pts返回。
??cv::fillConvexPoly()??:画一个填充的简单多边形
void fillConvexPoly(
cv::Mat& img, //绘图图像
const cv::Point* pts, //C风格的点数组
int npys, //pts数组的点数
const cv::Scalar& color, //颜色
int lineType = 8, //线型
int shift = 0 //亚像素对齐
);
这个函数用于绘制一个填充的多边形,这个函数比cv::fillPoly()速度快很多,因为它使用了更简单的算法。需要注意的是cv::fillConvexPoly()使用的算法在多边形有自交点时不能正确工作。pts中的点将按顺序用直线段连接起来,第一个点和最后一个点之间也会连接起来(也就是说多边形被认为是封闭的)。
??cv::fillPoly()??:画一个填充的任意多边形
void fillPoly(
cv::Mat& img, //绘图图像
const cv::Point* pts, //C风格的点数组(二维)
int npts, //pts中的点的个数
int ncontours, //pts中数组个数(不同的多边形个数)
const cv::Scalar& color, //颜色
int lineType = 8, //线型
int shift = 0, //亚像素对齐
cv::Point offset = Point() //加在所有点的偏移
);
这个函数可以绘制任意数量的填充的多边形。与cv::fillConvexPoly()函数不同的是,这个函数可以处理自交点的情况。
??cv::line()??:画一条简单直线
void line(
cv::Mat& img, //绘图图像
cv::Point pt1, //第一个点坐标
cv::Point pt2, //第二个点坐标
const cv::Scalar& color, //颜色
int lineType = 8, //线型
int shift = 0 //亚像素对齐
);
cv::line()函数在图像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::Scalar& color, //颜色
int lineType = 8, //线型
int shift = 0 //亚像素对齐
);
??cv::polyLines()??:画多重折线
void polyLines(
cv::Mat& img, //绘图图像
const cv::Point* pts, //C风格点数组
int npts, //pts中的点数
int ncontours, //pts中的折线数
bool isClosed, //如果为真,连接第一条折线和最后一条折线
const cv::Scalar& color, //颜色
int lineType = 8, //线型
int shift = 0 //亚像素对齐
);
迭代器:cv::LineIterator
LineIterator::LineIterator(
cv::Mat& img, //绘图图像
cv::Point pt1, //直线的第一个点
cv::Point pt2, //直线的第二个点
int lineType = 8, //线型
bool leftToRight = false //(方向)如果为真,一直从左到右
);
cv::LineIterator对象是一个用来顺序得到网格线每一个像素的迭代器。
一旦初始化之后,直线的像素数量就保存在一个整型成员变量cv::LineIterator::count中
1.2、绘制文字
函数 | 描述 |
cv::putText() | 在图像中绘制指定文字 |
cv::getTextSize() | 获取一个文字的宽度和高度 |
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 bottomLeftOrign = false //如果为真,文字盒子的左下角坐标(绘制)
);
字体列举
标识符 | 描述 |
cv::FONT_HERSHEY_SIMPLEX | 普通大小无衬线字体 |
cv::FONT_HERSHEY_PLAIN | 小号无衬线字体 |
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_SIMPLEX |
cv::FONT_HERSHEY_SCRIPT_SIMPLEX | 手写体 |
cv::FONT_HERSHEY_SCRIPT_COMPLEX | 比cv::FONT_HERSHEY_SCRIPT_SIMPLEX 更复杂的变体 |
上表中的任何一种字体都可以和??cv::FONT_HERSHEY_ITALIC??组合使用来得到斜体。
??cv::getTextSize()??:获取一个文字的宽度和高度
cv::Size cv::getTextSize(
const string& text, //待绘制的文字
cv::Point origin, //文字盒子左上角坐标
int fontFace, //字体
double fontScale, //字号
int thickness, //线宽
int* beseLine //基线
);
【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】
点击这里:「链接」