百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

OpenCV--绘图

bigegpt 2024-08-28 12:08 4 浏览

一、绘图

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

点击这里:「链接」

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...