【OpenCV学习笔记04】- 绘图功能

news2025/1/12 4:52:39

这是对于 OpenCV 官方文档的 GUI 功能的学习笔记。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点进行结合应用。
如果有喜欢我笔记的请麻烦帮我关注、点赞、评论。谢谢诸位。

学习笔记:
学习笔记目录里面会收录我关于OpenCV系列学习笔记博文,大家如果有什么不懂的可以通过阅读我的学习笔记进行学习。
【OpenCV学习笔记】- 学习笔记目录

内容

  • 用 OpenCV 画不同的几何图形
  • 学习这些函数:cv.line(), cv.circle() , cv.rectangle(), cv.ellipse(), cv.putText() 等。

函数常用传参

在上述所有功能中,您将看到一些常见的参数,如下所示:

  • img:您要绘制形状的图像对象;
  • color:形状的颜色,如 BGR,它是一个元组,例如:蓝色(255,0,0)。对于灰度图,只需传一个标量值。
  • thickness:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认thickness= 1。
    lineType:线条类型,如 8 连接,抗锯齿线等。默认情况下,它是 8 连接。cv.LINE_AA 画出抗锯齿线,非常好看的曲线。

画线

去画一条线,你需要传递线条的开始和结束的坐标。我们将创建一个黑色图像,并在左上角到右下角画一条蓝色的线。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)
# 画一条 5px 宽的蓝色对角线
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)

cv.imshow("线条", img)
cv.waitKey(0)
cv.destroyWindow("线条")
# cv.destroyAllWindows()

效果图:
在这里插入图片描述

画矩形

画一个矩形,你需要矩形的左上角和右下角。这次我们将会在图像的右上角画一个绿色的矩形。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)
# 画矩形
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
cv.imshow("矩形", img)
cv.waitKey(0)
cv.destroyWindow("矩形")
# cv.destroyAllWindows()

效果图:
在这里插入图片描述

画实心圆

画一个圆,你需要它的圆心和半径。我们将在上面绘制的矩形上画一个内圆。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)
# 画矩形
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)

# 画圆
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
cv.imshow("画圆", img)
cv.waitKey(0)
cv.destroyWindow("画圆")
# cv.destroyAllWindows()

效果图:
在这里插入图片描述

画圆的边

画一个圆,你需要它的圆心和半径。我们将在上面绘制的矩形上画一个圆的边。主要是改变cv.circle的thickness参数。上面用的实心圆用的是-1,这里我们改成3。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)

# 画圆
cv.circle(img, (447, 63), 63, (0, 0, 255), 3)
cv.imshow("画圆", img)
cv.waitKey(0)
cv.destroyWindow("画圆")
# cv.destroyAllWindows()

效果图:
在这里插入图片描述

画椭圆

画一个椭圆,你需要传好几个参数。一个参数是圆心位置 (x,y)。下个参数是轴的长度 (长轴长度,短轴长度)。角度是椭圆在你逆时针方向的旋转角度。startAngle 和 endAngle 表示从长轴顺时针方向测量的椭圆弧的起点和终点。如整圆就传 0 和 360。更多细节请看 cv.ellipse() 的文档。下面是在这个图像中间画的一个半椭圆例子。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)

# 画椭圆
# 只能画出椭圆一半,也就是圆转椭圆只计算了一半的角度
# 效果见,图1
# cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
# 画出椭圆需要计算360角度
# 效果见,图2
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 360, 255, -1)

cv.imshow("画椭圆", img)
cv.waitKey(0)
cv.destroyWindow("画椭圆")
# cv.destroyAllWindows()

效果图:
图1:
在这里插入图片描述
图2:
在这里插入图片描述

画多边形

画多边形,首先你需要顶点的做坐标。将这些点组成一个形状为 ROWSx1x2 的数组,ROWS 是顶点数,它应该是 int32 类型。这里我们绘制一个顶点是黄色的小多边形。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)

# 画多边形
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (0, 255, 255))

cv.imshow("画多边形", img)
cv.waitKey(0)
cv.destroyWindow("画多边形")
# cv.destroyAllWindows()

效果图:
在这里插入图片描述
注意:

  • 如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状。
  • cv.polylines() 能画很多线条。只需创建你想绘制所有线条的列表,然后将其传给这个函数。所有线条都将单独绘制。绘制一组线条比多次调用 cv.line() 效率更高。

给图像加文字

在图像上加文字,你需要指定以下内容。

  • 你想写的文字数据。
  • 你想写的位置坐标 (如 左下角开始)。
  • 字体类型 (支持的字体,查看 cv.putText() 文档)
  • 常规的如颜色,粗细,线型等。为了更好看,线型使用 lintType =cv.LINE_AA

我们将在图像上写一个白色的 OpenCV 。
示例代码:

import numpy as np
import cv2 as cv

# 创建一个黑色的图像
img = np.zeros((512, 512, 3), np.uint8)

# 给图像加文字
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 400), font, 4, (255, 255, 255), 2, cv.LINE_AA)

cv.imshow("给图像加文字", img)
cv.waitKey(0)
cv.destroyWindow("给图像加文字")
# cv.destroyAllWindows()

效果图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1374775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用宝塔面板部署Inis博客并实现无公网ip环境远程访问

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

正则表达式、文件访问(Python实现)

一、主要目的: 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…

.NET开源、强大的Web报表统计系统

前言 今天分享一个.NET开源、强大的Web报表统计系统:CellReport。 项目官方介绍 CellReport 诞生的初衷是为了解决日常快速制作统计报表的需要。 CellReport 是一个为复杂统计报表为核心目标的制作、运行工具。你可以使用数据库、excel文件、api服务、已有报表等为…

【C++期末】酒店住宿信息管理系统(含easyX)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等),如有需要请私信我,或者加我的企鹅号:1404293476 本文资源:https://download.csdn.net/download/weixin_47040861/88725363 目录 1.题目要求 2.实现效…

linux中出现不在 sudoers 文件中。此事将被报告的解决方法

出现如下提示gaokaoli 出现不在 sudoers 文件中。此事将被报告 一般是该用户 权限不够 既然知道权限不够可以添加到root用户组,获取权限即可 通过命令行添加到权限,发现还是不行 sudo usermod -g root gaokaoli 那就直接在配置文件中修改 通过执行vi…

需求跟踪矩阵的作用

需求跟踪矩阵对于嵌入式系统的整个生命周期至关重要。这种矩阵能够帮助确保产品的安全性并满足预设的质量标准。对于医疗、技术和工程等领域来说,需求追溯矩阵尤其关键。实际上,任何设定了目标和标准、并希望维护这些目标和标准的企业都能从这个经过实践…

ChatGPT提示词的高级技巧——解锁AI交互新境界

大家好我是在看,记录普通人学习探索AI之路。 这一讲我来介绍几种提示词的高级使用技巧。 1.拆解问题 对于一个一次性很难完整回答的大问题,我们可以将其拆解成若干子问题,再将这些问题逐步输入。 我们来看下面的例子: 2.迭代改…

Rough.js:创建手绘、草图外观的图形

Rough.js 是一个小型的(<9kB gzipped)图形库&#xff0c;它可以让你以草图、手绘风格进行绘制。 该库定义了绘制直线、曲线、圆弧、多边形、圆和椭圆的基元。它还支持绘制 SVG 路径。 Rough.js 可以同时处理 Canvas 和 SVG。 安装 从npm安装&#xff1a; npm install --s…

如何正确使用高速探头前端--probe head

目前市面上的高速有源探头种类丰富&#xff0c;使用灵活&#xff0c;如下图所示&#xff0c;结构多为放大器焊接前端的组合&#xff0c;以E2677B探头前端为例&#xff0c;其焊接前端电阻有三种选择&#xff0c;91ohm时可实现全带宽使用&#xff08;12GHz&#xff09;&#xff0…

nginx+keepalived双主模式双主热备

目录 一、双主模式原理 1. nginxkeepalived主备模式缺点 2. 主备模式和双主模式的区别 二、配置文件 1. nginx01的keepalived.conf 2. nginx02的keepalived.conf 3. 检测nginx存活脚本文件nginx_check.sh 三、测试准备 1. 启动nginx01、nginx02 2. 启动keepalived 3. 查看网卡信…

【【深入浅出了解静态时钟分析和时钟约束】】

深入浅出了解静态时钟分析和时钟约束 时序分析是什么&#xff1f; 我们提出一些特定的时序要求&#xff08;或者说是添加特定的时序约束&#xff09;&#xff0c;使用特定的时序模型&#xff0c;针对特定的电路进行分析。分析的最终结果是要求系统时序满足我们提出的要求。 这…

大文件分片上传,断点续传,秒传 示例(待更新...)

1.html代码 <template><div class="card content-box"><el-upload ref="upload" class="upload-demo" action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":limit="1" :on-change=&quo…

【C++】手撕 list类(包含迭代器)

目录 1&#xff0c;list的介绍及使用 2&#xff0c;list_node 3&#xff0c;list_node() 3&#xff0c;list 4&#xff0c;list() 5&#xff0c;push_back(const T& x) 6&#xff0c;print() 7&#xff0c;_list_iterator 8&#xff0c;operator*() 9&#xff0c…

Qt QComboBox组合框控件

文章目录 1 属性和方法1.1 文本1.2 图标1.3 插入和删除1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的组合框是集按钮和下拉列表体的控件&#xff0c;&#xff0c;它占用的屏幕空间很小&#xff0c;对应的类是QComboBox 1 属性和方法 QComboBox有很多属性&#xff0c;完整的…

【福利】百度内容审核平台实战

文章目录 前言功能概述产品价格快速入门&#xff08;账号登录及资源领取、在线验证、编写示例程序&#xff09;实战演示1、首先创建一个应用2、引入百度的SDK3、测试用例百度内容审核-文本 200QPS百度内容审核-图像 50QPS 写在最后 前言 百度内容审核平台主要针对图像、文本、…

RT-Thread 中断管理

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。 生活中&#xff0c;我们经常会遇到这…

开源C语言库Melon:数据恢复算法

本文讲述开源C语言库Melon中的里德所罗门纠错码的使用。 关于 Melon 库&#xff0c;这是一个开源的 C 语言库&#xff0c;它具有&#xff1a;开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。 Github repo 简介 里德所罗门编码是一种纠错码技术&#xff0c;…

C++ λ表达式

λ表达式提供了函数对象的另一种编程机制。 在 C 11 和更高版本中&#xff0c;Lambda 表达式&#xff08;通常称为 Lambda&#xff09;是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象&#xff08;闭包&#xff09;的简便方法。 Lambda 通常用于封装传递给算法…

项目与工程的关系,是一个项目包含若干个工程还是一个工程包含若干个项目?

在项目管理和工程管理的领域里&#xff0c;项目&#xff08;Project&#xff09;和工程&#xff08;Engineering&#xff09;通常有不同的定义和关系&#xff0c;这取决于具体的行业和应用背景。但一般来说&#xff0c;项目和工程之间的关系可以这样理解&#xff1a; 项目包含工…

CMake入门教程【高级篇】管理MSVC编译器警告

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.什么是MSVC?2.常用的屏蔽警告3.MSVC所有警告4.target_compile_options用法5.如何在CMake中消除MSVC的警告?6.屏蔽警告编写技巧