OpenCV--绘图
2023-06-20 09:54:04 QT教程

一、绘图

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开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】

点击这里:

相关新闻: