一、绘图
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开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里:
关键词:
-
OpenCV--绘图_当前简讯
一、绘图OpenCV提供了一大批可供画直线、矩形、圆等图形的函数。OpenCV
-
虹软科技:6月19日融资净买入1636.35万元,连续3日累计净买入2815.71万元
6月19日,虹软科技(688088)融资买入7581 91万元,融资偿还5945 57万
-
谭仔送蔡天凤前往火葬场:捧着蔡天凤遗照流泪,与亡妻最后告别|世界短讯
6月19日,谭仔送别蔡天凤的遗体前往火化现场,整个火化结束之后蔡天凤
-
@各位街坊,下月起,广州严查电动自行车非法改装行为
超速、遮挡视线、自燃……非法改装电动自行车事故频发,严重威胁正常的
-
局域网是什么意思啊_局域网是什么东西
1、举一般的例子吧,三台电脑,——电脑宽带——猫——路由器——电脑
-
蝙蝠总是在白天睡而且在夜里醒来的英文(醒来的英文)
1、getupwaken都是动词getupwakeu。本文到此分享完毕,希望对大家有所帮助。
-
天天资讯:经济师报名条件及流程_经济师报名条件
1、取得高中以上学历,从事专业工作满一年。2、有关报名条件中要求的学
-
太平镇后十里河村:推进青少年禁毒宣传 共筑防毒拒毒牢固防线
津滨海讯(记者李婷婷通讯员刘寅摄影报道)近日,太平镇后十里河村组织
-
rf法兰连接(rf法兰)-全球报道
导读1、一、密封面不同RF法兰:RF法兰密封面是凸面。2、2、RJ法兰:RJ
-
全球观热点:湖北16家餐厅入选奥古斯大华区优选品质餐厅
极目新闻记者陈倩通讯员邹志平6月19日,第十七届荣耀奥古斯精英汇授勋
-
【天天新要闻】他先推了我一下,然后我推了他一下,他手机在兜里放的给掉出来了
他先推了我一下,然后我推了他一下,他手机在兜里放的给掉出来了
-
“千万工程”调研行丨有“颜值”,更有“产值”——杭州临平美丽乡村走访见闻
新华社杭州6月17日电题:有“颜值”,更有“产值”——杭州临平美丽乡
-
世界即时看!西安经开区:践行“枫桥经验” 保障劳动权益
西安经开区:践行“枫桥经验”保障劳动权益
-
环球精选!南通崇川幸福街道:网格党群微阵地,服务群众零距离
近日,南通市崇川区幸福街道转水社区以“打造网格党群服务站,激活为民
-
今日关注:漾濞县太平乡:记录乡愁“老”有作为
村道清幽,鸟声错落。沿着一条鹅卵石铺就的蜿蜒小路往前走,穿过村寨,
-
华新手袋国际控股(02683)发布年度业绩 拥有人应占纯利减少约78.5%至约850万港元 拟派特息每股1港仙
智通财经讯,华新手袋国际控股(02683)公布截至2023年3月31日止年度业绩
-
环球数码创意6月19日回购34.2万股 微资讯
来源:新浪港股环球数码创意(08271)发布公告,于2023年6月19日斥资2
-
世界看点:交通运输部:端午节假期切实加强旅客运输服务保障,切实强化交通物流保通保畅
交通运输部发布《关于做好2023年端午节假期期间交通运输服务保障和安全
-
天天热讯:浙江省职工沙滩气排球比赛在象收官
来自象山县总工会代表队的石薇薇告诉记者,此次比赛进一步推动了浙江省
-
泰恩康(301263.SZ):公司认为爱廷玖销售收入会处于一个稳定增长的阶段
格隆汇6月19日丨泰恩康(301263 SZ)6月16日接受特定对象调研时表示,公