一、绘图
OpenCV提供了一大批可供画直线、矩形、圆等图形的函数。OpenCV的绘图函数可以在任意深度的图像上工作,但在大多数情况下,它们只对图像的前三个通道有影响,如果是单通道图像,则默认只影响第一个通道。大多数绘图函数都支持操作对象的颜色、宽度、线型(与直线平滑度有关)和亚像素对齐等参数。
(相关资料图)
想指定颜色的时候,通常的做法是使用cv::Scalar对象,即使大多数时候只用到最前面的三个值。(有些时候使用cv::Scalar里面的第四个值来表示透明通道是很方便的,但是绘图函数目前还不支持透明混合处理)按照惯例,OpenCV在对多通道图像进行色彩渲染是使用BGR的顺序。
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& 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开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里: