【CV 向】OpenCV 图形绘制指南

news2024/12/22 20:20:16

文章目录

    • 引言
    • 1. 创建画布
    • 2. 绘制线段
    • 3. 绘制矩形
    • 4. 绘制圆
    • 5. 绘制椭圆
    • 6. 绘制多边形
    • 7. 绘制字体
    • 结论

引言

Python OpenCV 是一个功能强大的计算机视觉库,除了图像处理和计算机视觉任务外,它还提供了丰富的功能来绘制各种图形。无论是在计算机视觉应用中标记感兴趣区域,还是在图像上绘制几何形状或文本,OpenCV 都为我们提供了简单易用的方法。本文将介绍如何利用 Python OpenCV 进行图形绘制。

1. 创建画布

在开始图形绘制之前,我们首先需要创建一个空白的画布。在 OpenCV 中,我们可以使用 cv2.imread() 函数加载图像,或使用 np.zeros() 创建一个空白的图像作为画布。

示例代码:

import cv2
import numpy as np

# 创建一张空白的画布
canvas = np.zeros((500, 500, 3), dtype=np.uint8)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 np.zeros() 函数创建了一个形状为 (500, 500, 3) 的零数组,表示画布的宽度、高度和通道数。然后,我们使用 cv2.imshow() 函数显示画布。

在这里插入图片描述

2. 绘制线段

绘制线段是图形绘制中的基本操作之一。在 OpenCV 中,我们可以使用 cv2.line() 函数绘制线段。

示例代码:

import cv2

# 在画布上绘制一条线段
start_point = (100, 100)
end_point = (400, 400)
color = (0, 0, 255)  # 红色线段
thickness = 3

cv2.line(canvas, start_point, end_point, color, thickness)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 cv2.line() 函数在画布上绘制了一条从 (100, 100) 到 (400, 400) 的红色线段。我们还可以通过调整 thickness 参数来设置线段的粗细。

在这里插入图片描述

3. 绘制矩形

绘制矩形是常见的图形绘制操作之一。在 OpenCV 中,我们可以使用 cv2.rectangle() 函数绘制矩形。

示例代码:

import cv2

# 在画布上绘制一个矩形
top_left = (200, 200)
bottom_right = (400, 400)
color = (0, 255, 0)  # 绿色矩形
thickness = 2

cv2.rectangle(canvas, top_left, bottom_right, color, thickness)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 cv2.rectangle() 函数在画布上绘制了一个从 (200, 200) 到 (400, 400) 的绿色矩形。我们可以通过调整 thickness 参数来设置矩形的边框粗细。

在这里插入图片描述

4. 绘制圆

绘制圆形也是常见的图形绘制操作之一。在 OpenCV 中,我们可以使用 cv2.circle() 函数绘制圆形。

示例代码:

import cv2

# 在画布上绘制一个圆形
center = (300, 300)
radius = 100
color = (255, 0, 0)  # 蓝色圆形
thickness = -1  # 填充圆形

cv2.circle(canvas, center, radius, color, thickness)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 cv2.circle() 函数在画布上绘制了一个以 (300, 300) 为圆心、半径为 100 的蓝色填充圆形。我们可以通过调整 thickness 参数来设置圆形的边框粗细,负值表示填充圆形。

在这里插入图片描述

5. 绘制椭圆

绘制椭圆也是常见的图形绘制操作之一。在 OpenCV 中,我们可以使用 cv2.ellipse() 函数绘制椭圆。

示例代码:

import cv2

# 在画布上绘制一个椭圆
center = (250, 250)
axes = (150, 100)
angle = 0
start_angle = 0
end_angle = 360
color = (0, 255, 255)  # 黄色椭圆
thickness = 2

cv2.ellipse(canvas, center, axes, angle, start_angle, end_angle, color, thickness)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 cv2.ellipse() 函数在画布上绘制了一个以 (250, 250) 为中心、长轴为 150、短轴为 100 的黄色椭圆。我们可以通过调整 thickness 参数来设置椭圆的边框粗细。

在这里插入图片描述

6. 绘制多边形

绘制多边形是绘制复杂形状的常见操作。在 OpenCV 中,我们可以使用 cv2.polylines() 函数绘制多边形。

示例代码:

import cv2

# 在画布上绘制一个多边形
points = np.array([[100, 100], [200, 50], [300, 150], [250, 200]], np.int32)
points = points.reshape((-1, 1, 2))
color = (255, 255, 0)  # 青色多边形
thickness = 2

cv2.polylines(canvas, [points], True, color, thickness)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 cv2.polylines() 函数在画布上

绘制了一个由多个顶点构成的青色多边形。points 是一个包含多个顶点坐标的数组,我们可以根据需要添加更多的顶点。我们可以通过调整 thickness 参数来设置多边形的边框粗细。

在这里插入图片描述

7. 绘制字体

在图形绘制中,有时需要在图像上添加文本标签。在 OpenCV 中,我们可以使用 cv2.putText() 函数在图像上绘制文本。

示例代码:

import cv2

# 在画布上绘制文本
text = 'OpenCV'
position = (200, 250)
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
color = (255, 255, 255)  # 白色文本
thickness = 2

cv2.putText(canvas, text, position, font, font_scale, color, thickness)

cv2.imshow('Canvas', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们使用 cv2.putText() 函数在画布上绘制了一个白色文本 “OpenCV”,位于 (200, 250) 的位置。我们可以通过调整 font_scale 参数来设置文本的大小,通过调整 thickness 参数来设置文本的粗细。

在这里插入图片描述

结论

通过本文的介绍,我们了解了如何使用 Python OpenCV 进行图形绘制。我们可以创建一个画布,并利用 cv2.line()cv2.rectangle()cv2.circle()cv2.ellipse()cv2.polylines()cv2.putText() 函数绘制线段、矩形、圆形、椭圆、多边形和文本。这些图形绘制操作在计算机视觉任务和图像处理中非常有用。希望本文能够帮助您掌握 Python OpenCV 的图形绘制功能,并在实际项目中应用它们。

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

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

相关文章

基于ChatGPT的端到端语音聊天机器人项目实战(三)

企业级ChatGPT开发入门实战 第1课 基于ChatGPT的端到端语音聊天机器人项目实战 Gavin老师:NLP_Matrix_Space 1.4 使用FastAPI构建语音聊天机器人后端实战 在后端代码(backend)中调用了OpenAI API及其他的服务,如图1-10所示。 图1- 10 后端代码调用OpenAI API openai_requ…

一条SQL语句的前世今生

文章目录 MySQL 基础架构分析语句分析查询语句更新语句 总结 本篇文章会分析下一个 SQL 语句在 MySQL 中的执行流程,包括 SQL 的查询在 MySQL 内部会怎么流转,SQL 语句的更新是怎么完成的。 MySQL 基础架构分析 下图是 MySQL 的一个简要架构图&#xff…

Move Dev Meetup杭州线下交流会圆满结束

北京时间6月17日下午2点到6点,由MoveFuns DAO 、MoveBit、ComingChat、杭州时戳微蓝信息咨询有限公司和WEB3CN联合举办的Move开发者线下交流会圆满结束。本次交流会吸引了110余名Move开发者报名,其中超过60位参会者成功来到现场参与了线下交流。 第一位分…

Python在不同领域中的应用

Python 是一种功能强大且易于使用的编程语言,因此在各个领域都有广泛的应用。以下是 Python 在不同领域中的应用: 数据科学:Python 是数据科学家和机器学习专家的首选工具之一。它有成熟的数据分析库和工具包,如 Pandas、NumPy、S…

逻辑回归模型的简介及python代码实现

文章目录 1 逻辑回归简介1.1 回归步骤1.2 逻辑回归与多重线性回归 2 逻辑回归模型算法原理2.1 逻辑回归模型的数学原理2.2 逻辑回归模型的代码实现2.3 逻辑回归模型的深入理解2.4 多分类逻辑回归模型演示 总结 1 逻辑回归简介 逻辑回归是分类当中极为常用的手段,它…

(六)关于Linux中服务器磁盘爆满问题的几个解决方案

文章目录 一、现象二、现象产生的原因三、问题的定位过程1.检查业务文件存放位置是否合理2.检查服务器系统盘空间是否分配过小3.对服务器磁盘占用情况进行分析4.若以上方案都解决不了内存占用过高问题,则考虑是否是服务器中存在其他容器产生了一些文件,比…

【使用Hystrix实现服务容错和熔断】—— 每天一点小知识

💧 使用 H y s t r i x 实现服务容错和熔断 \color{#FF1493}{使用Hystrix实现服务容错和熔断} 使用Hystrix实现服务容错和熔断💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客&#x1f390…

进程、线程、协程?go中的协程原理详解 - 协程是什么?为什么要有协程?

1. 为什么要有协程? 我们使用工厂来表示计算机,而内存空间就相当于工厂的地皮,那么我们可以认为进程就是工厂中的厂房,它占据了工厂的地皮。(进程是分配资源的最小单位) 线程是什么呢?我们继续…

电商运营个人简历范文

电商运营个人简历篇1 个人信息 某某x 性 别: 男 婚姻状况: 已婚 出生年月: 1981年1月 民 族: 汉族 身 高: 175cm 最高学历: 大专 体 重: 70公斤 计算机能力: 高级程序员 技术职称&am…

MySQL的IF(exp1, exp2, exp3)、IFNULL(exp1, exp2)、ISNULL(exp)函数的用法

本章主要是讲解一下mysql的常用方法if()和ifnull()的使用 1、ISNULL(exp) 该函数的作用是判断表达式exp是否为null,如果是null,则返回1,否则返回0 案例代码:以上两条语句的查询结果为分别为1和0 select ISNULL(null) from dual…

管理类联考——逻辑——技巧篇——形式逻辑——考官出题套路

文章目录 考官出题套路一:代入逻辑推命题真假1. 考官出题套路特征:2. 核心考点: 考官出题套路二:判断逻辑真假1. 考点概述:2. 快速秒杀选项技巧: 考官出题套路三:推矛盾和“两难推理”1. 考点概…

一句话木马(绝对入门,实战环境安装+测试)主要是记录我的第一次一句话木马过程,复现40分钟左右。

首先介绍一下,搭建在本地的靶场,可以做渗透和注入的测试,真是好东西。 安装教程我推荐一篇博客,真的写的很好,我全程坐下来非常流畅非常流畅,csdn少见的高质量博客 DVWA下载安装_PisaYu的博客-CSDN博客 膜…

MFC第五天 Unicode软件开发 MFC框架构成与封装类原理

文章目录 Unicode软件开发以Unicode为字符集的记事本软件开发 MFC框架构成与封装类原理示例代码如下: Unicode软件开发 Unicode软件开发时需要遵循以下规则:使用中可尽量使用自适应版本。 Unicode软件开发: a)微软的软件工程现在默认使用Uni…

【MYSQL篇】mysql中相关锁和MVCC详解

文章目录 前言MVCC1、第一个事务2、第二个事务3、第三个事务4、第四个事务5、第五个事务 InnoDB 常见的几种锁机制共享锁排它锁意向锁记录锁间隙锁临键锁 小结 前言 数据库的锁是在多线程高并发的情况下用来保证数据稳定性和一致性的一种机制。MySQL 根据底层存储引擎的不同&a…

OpenGL

需要继承的两个类 #include <QOpenGLWidget> #include <QOpenGLFunctions_3_3_Core> class OpenGLWidget : public QOpenGLWidget,public QOpenGLFunctions_3_3_Core { Q_OBJECT public: explicit OpenGLWidget(QWidget *parent nullptr); virtual vo…

如何看待调查称半数年轻人存款不足10万?

文章目录 一、目前的存款在哪一个区间&#xff1f;你觉得存款难吗&#xff1f;2.1 自己的状态2.2 对理财的看法和态度 二、谈谈我为存款做出过哪些努力&#xff1f;三、除了个人因素外&#xff0c;有哪些因素影响到了年轻人的存款能力和存款意愿&#xff1f;四、要攒够多少存款…

【数据库原理与实践】CS系的实验期末考题(20222023)

2022&#xff1a; 学校管理数据库涉及四个关联表结构&#xff1a; 学生表 Student(Sno,Sname,Sdate,Ssex) &#xff0c;其中Sno学生编号&#xff0c;Sname学生姓名&#xff0c;Sdate出生年月&#xff0c;Ssex学生性别 。 课程表 Course(Cno,Cname,Tno) &#xff0c;其中Cno课…

(写自己语言的练手级应用)JSON(JavaScript Object Notation) 产生式(BNF)

写自己的开发语言时&#xff0c;很多人都会拿JSON当第一个练习对象 开源net json FJSON 解析工具https://dbrwe.blog.csdn.net/article/details/107611540?spm1001.2014.3001.5502 <json> :: <object> | <array> <object> :: "{" [ <me…

【OJ比赛日历】快周末了,不来一场比赛吗? #06.23-06.29 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-06-23&#xff08;周五&#xff09; #5场比赛2023-06-24…