【opencv+图像处理】Image Processing in OpenCV 1-2基本图形绘制

news2025/7/21 19:53:11

🍉 博主微信 cvxiayixiao
🍓 【Segment Anything Model】计算机视觉检测分割任务专栏。 链接
🍑 【公开数据集预处理】特别是医疗公开数据集的接受和预处理,提供代码讲解。链接
🍈 【opencv+图像处理】opencv代码库讲解,结合图像处理知识,不仅仅是调库。链接

本专栏代码地址https://github.com/xiawei20161308104/xv_opencv_tutorials

文章目录

  • 1.本节涉及的opencv新函数
  • 2.opencv cv.line()绘制直线
    • 代码
    • 效果
  • 3.opencv cv.circle()绘制圆形
    • 代码
    • 效果
  • 3.opencv cv.circle()绘制实心圆
    • 代码
    • 效果
  • 4.opencv cv.circle()图像上绘制多个圆
    • 代码
    • 效果
  • 5.opencv cv.rectangle()绘制矩形
    • 代码
    • 效果
  • 6.opencv cv.rectangle()绘制多个矩形
    • 代码
    • 效果
  • 7.opencv cv.ellipse()绘制椭圆
    • 代码
    • 效果
    • 将椭圆放在图像的右上角代码
    • 效果
  • 8.opencv cv.putText()绘制文本
    • 代码
    • 效果
  • 9.综合练习
    • 代码
    • 效果
    • 问题

1.本节涉及的opencv新函数

 🚩cv.line(), 
 🚩cv.circle() , 
 🚩cv.rectangle(), 
 🚩cv.ellipse(), 
 🚩cv.putText() 

2.opencv cv.line()绘制直线

cv.line()函数用于绘制图像,首先有一个底图,在底图之上绘制直线,(0,0)为起始点,(511,511)为终止点,5为线宽
imshow()函数用于显示图像,第一个参数是窗口的名称,第二个参数是要显示的图像。
waitKey(0)函数用于等待用户按下任意键关闭图像窗口。
destroyAllWindows()函数用于关闭所有打开的窗口

代码

import numpy as np
import cv2 as cv
# 创建一个黑色图像
img = np.zeros((512,512,3), np.uint8)
# 在图像上绘制一条蓝色的对角线,线宽为5像素
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果

在这里插入图片描述

3.opencv cv.circle()绘制圆形

在上图基础上绘制一个半径为100的圆,圆心为(256, 256),颜色为红色,线宽为2

代码

第一个参数是图像。
第二个参数是圆心的坐标 (x, y)。
第三个参数是圆的半径。
第四个参数是颜色,以 (B, G, R) 的形式指定。
第五个参数是线宽,如果为负数,则表示填充整个圆

cv.circle(img, (256, 256), 100, (0, 0, 255), 2)

效果

在这里插入图片描述

3.opencv cv.circle()绘制实心圆

在cv.circle()函数中将线宽参数(thickness)设置为负值

代码

# 绘制一个填充的圆,半径为100,圆心在(256, 256),颜色为蓝色
cv.circle(img, (256, 256), 100, (255, 0, 0), -1)

线宽参数(thickness)设置为-1,表示绘制填充的圆。 圆的半径为100,圆心位于(256, 256),填充颜色为蓝色((255,0, 0))。

效果

在这里插入图片描述

4.opencv cv.circle()图像上绘制多个圆

多次调用cv.circle()函数,并为每个圆指定不同的参数

代码

# 绘制多个实心圆与空心圆
import numpy as np
import cv2 as cv
# 创建一个黑色图像
img = np.zeros((512,512,3), np.uint8)
# 在图像上绘制一条蓝色的对角线,线宽为5像素
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.circle(img, (256, 256), 100, (0, 0, 255), 2)
cv.circle(img, (256, 256), 100, (255, 0, 0), -1)
cv.circle(img, (100, 100), 50, (255, 0, 0), 2)
cv.circle(img, (200, 200), 80, (0, 255, 0), -1)
cv.circle(img, (300, 300), 30, (0, 0, 255), -1)

cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果

在这里插入图片描述

5.opencv cv.rectangle()绘制矩形

代码

import numpy as np
import cv2 as cv

# 创建一个空白图像
img = np.zeros((512, 512, 3), np.uint8)

# 在图像上绘制一个矩形,左上角坐标为(100, 100),右下角坐标为(400, 300),颜色为绿色,线宽为2
cv.rectangle(img, (100, 100), (400, 300), (0, 255, 0), 2)

# 显示图像
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

第一个参数是图像。
第二个参数是矩形的左上角坐标 (x1, y1)。
第三个参数是矩形的右下角坐标 (x2, y2)。
第四个参数是颜色,以 (B, G, R) 的形式指定。
第五个参数是线宽,如果为负数,则表示填充整个矩形。

效果

在这里插入图片描述

6.opencv cv.rectangle()绘制多个矩形

代码

import numpy as np
import cv2 as cv

# 画一个黑色背景
img = np.zeros((512, 512, 3), np.uint8)

# 画很多个矩形  -1是画一个实心的
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)

cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果

在这里插入图片描述

7.opencv cv.ellipse()绘制椭圆

cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])

img:要在上面绘制椭圆的图像或绘图表面。
center:椭圆中心的坐标,以元组 (x, y) 形式表示。
axes:表示椭圆的长轴和短轴长度的元组 (major_axis_length, minor_axis_length)。
angle:椭圆的旋转角度,以度为单位。
startAngle:椭圆弧的起始角度,以度为单位。
endAngle:椭圆弧的结束角度,以度为单位。
color:椭圆的颜色,使用 BGR 格式表示。可以是一个标量值或元组 (B, G, R)。
thickness(可选):表示椭圆边界的厚度。如果未指定,椭圆将被填充。
lineType(可选):指定用于绘制椭圆边界的线条类型。可以是以下之一:cv2.LINE_4、cv2.LINE_8、cv2.LINE_AA。默认情况下,使用 cv2.LINE_8。
shift(可选):指定椭圆中心和轴值的坐标中的小数位数。默认为 0。

代码

import numpy as np
import cv2 as cv

# Create a blank image
img = np.zeros((512, 512, 3), np.uint8)

# Draw multiple rectangles
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
# 绘制一个填充的红色椭圆
center = (250, 250)
axes = (150, 100)
color = (0, 0, 255)  # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
# Display the image
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果

在这里插入图片描述

将椭圆放在图像的右上角代码

可以通过调整椭圆中心的坐标来实现

import numpy as np
import cv2 as cv

# Create a blank image
img = np.zeros((512, 512, 3), np.uint8)

# Draw multiple rectangles
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
# 绘制一个填充的红色椭圆
center = (250, 250)
axes = (150, 100)
color = (0, 0, 255)  # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
center = (400, 100)  # 将椭圆中心的坐标修改为右上角位置
axes = (15, 10)
color = (0, 0, 255)  # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
# Display the image
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果

在这里插入图片描述

8.opencv cv.putText()绘制文本

置绘制单行或多行文本,并允许你设置字体、字号、颜色等文本属性。

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

img:要在上面绘制文本的图像或绘图表面。
text:要绘制的文本内容。
org:文本的起始坐标,以元组 (x, y) 形式表示,表示文本框左下角的位置。
fontFace:字体类型,可以是预定义的字体名称,也可以是自定义字体文件的路径。
fontScale:字体缩放因子,决定文本的大小。
color:文本的颜色,使用 BGR 格式表示。可以是一个标量值或元组 (B, G, R)。
thickness(可选):文本的线条粗细,如果为 0,则表示绘制填充的文本。默认值为 1。
lineType(可选):文本边界的线条类型,可以是以下之一:cv2.LINE_4、cv2.LINE_8、cv2.LINE_AA。默认情况下,使用 cv2.LINE_8。
bottomLeftOrigin(可选):如果为 True,则将 org 参数解释为文本框左下角的位置。默认为 False,表示 org 参数解释为文本框左上角的位置

代码

import numpy as np
import cv2 as cv

# Create a blank image
img = np.zeros((512, 512, 3), np.uint8)

# Draw multiple rectangles
cv.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
cv.rectangle(img, (300, 300), (400, 400), (0, 0, 255), -1)
# 绘制一个填充的红色椭圆
center = (250, 250)
axes = (150, 100)
color = (0, 0, 255)  # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
center = (400, 100)  # 将椭圆中心的坐标修改为右上角位置
axes = (15, 10)
color = (0, 0, 255)  # 使用 BGR 颜色格式
cv.ellipse(img, center, axes, 0, 0, 360, color, thickness=-1)
# 绘制文本
text = "Hello, OpenCV!"
org = (50, 100)  # 文本框左下角的位置
fontFace = cv.FONT_HERSHEY_SIMPLEX  # 字体类型
fontScale = 1.5  # 字体缩放因子
color = (255, 255, 255)  # 使用白色文本
thickness = 2  # 文本线条粗细
cv.putText(img, text, org, fontFace, fontScale, color, thickness)
# Display the image
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

效果

在这里插入图片描述

9.综合练习

代码

import cv2
import numpy as np
import matplotlib.font_manager as fm
# 创建一张空白图像
img = np.zeros((400, 600, 3), dtype=np.uint8)

# 绘制直线
start_point = (50, 50)
end_point = (550, 50)
line_color = (0, 255, 0)  # 绿色线条
line_thickness = 2
cv2.line(img, start_point, end_point, line_color, line_thickness)

# 绘制圆
center = (300, 200)
radius = 100
circle_color = (0, 0, 255)  # 红色圆圈
circle_thickness = 3
cv2.circle(img, center, radius, circle_color, circle_thickness)

# 绘制矩形
top_left = (100, 250)
bottom_right = (400, 350)
rectangle_color = (255, 0, 0)  # 蓝色矩形
rectangle_thickness = -1  # 填充矩形
cv2.rectangle(img, top_left, bottom_right, rectangle_color, rectangle_thickness)

# 绘制椭圆
center = (500, 300)
axes = (100, 50)
angle = 30
start_angle = 0
end_angle = 360
ellipse_color = (255, 255, 0)  # 黄色椭圆
ellipse_thickness = 2
cv2.ellipse(img, center, axes, angle, start_angle, end_angle, ellipse_color, ellipse_thickness)

# 绘制文本
text = "中文"
font_size = 30
org = (200, 150)
font_face = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
text_color = (255, 255, 255)  # 白色文本
text_thickness = 2
cv2.putText(img, text, org, fontFace=font_face, fontScale=font_size/10, color=text_color, thickness=text_thickness)

# 显示图像
cv2.imshow("绘图示例", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果

在这里插入图片描述

问题

所有字体都不支持中文 会乱码

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

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

相关文章

Hadoop HDFS(分布式文件系统)

一、Hadoop HDFS(分布式文件系统) 为什么要分布式存储数据 假设一个文件有100tb,我们就把文件划分为多个部分,放入到多个服务器 靠数量取胜,多台服务器组合,才能Hold住 数据量太大,单机存储能力有上限,需要…

小学辅导虚拟资料项目拆解 - 沉睡者IT

最近我看到了一个很不错的项目,它几乎没有成本,操作起来也不难,而且相对稳定的回报率。 这个项目适合新手小白或者工作室类型的团队。 之前分享的一些项目,比如天涯神贴、别墅设计图、古籍电子书、宝宝起名,都属于这个…

rcore 笔记 第一个裸机程序

文章目录 环境应用程序与基本执行环境应用程序执行环境与基本操作平台执行应用程序应用程序执行环境目标平台与目标三元组 移除标准库依赖移除 println! 宏提供 panic_handler 功能应对致命错误移除 main 函数 编译运行内核指令程序内存布局与编译流程 内核第一条指令编写内核第…

黑马 小兔鲜儿 uniapp 小程序开发- 用户模块- 07

小兔鲜儿 - 用户模块07 在用户登录/注册成功后,展示会员信息,更新会员信息。 会员中心页(我的) 主要实现两部分业务: 渲染当前登录会员的昵称和头像,从 Store 中获取。猜你喜欢分页加载,可封装成组合式函数实现复用…

态路小课堂丨如何为QSFP-DD800G光模块选择合适的光纤跳线

TARLUZ态路 在之前2篇文章中,我们介绍了关于800G光模块的封装、光口类型等内容。本文态路通信将为您介绍“如何为QSFP-DD800G光模块选择合适的光纤跳线”。方便您在800G数据中心网络互连场景中快速完成链路布线。 文章1: 三款800G光模块方案介绍—SR8/…

C++标准模板(STL)- 类型支持 (复合类型类别,is_member_pointer,is_reference,is_compound)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它

办公是现代生活不可避免的组成部分&#xff0c;科技的快速发展&#xff0c;给了我们更多新的生活方式&#xff0c;促使我们更加关注自己的身体状况&#xff0c;我们挨过了饭都吃不饱的年代&#xff0c;随着办公人群的不断扩张&#xff0c;不知道你有没有发现身边人或多或少都有…

代码随想录算法训练营第三十九天 | LeetCode 343. 整数拆分、96. 不同的二叉搜索树

代码随想录算法训练营第三十九天 | LeetCode 343. 整数拆分、96. 不同的二叉搜索树 文章链接&#xff1a;整数拆分 不同的二叉搜索树 视频链接&#xff1a;整数拆分 不同的二叉搜索树 1. LeetCode 343. 整数拆分 1.1 思路 给我们一个数&#xff0c;如何去拆成若…

力扣第62题 不同路径 c++ 动态规划 dp二维 + dp一维 解法

题目 62. 不同路径 中等 相关标签 数学 动态规划 组合数学 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Fini…

Kubernetes异常?别担心,100个命令来解救你

关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 这篇文章是关于使用 Kubectl 进行 Kubernetes 诊断的指南。作者列出了 100 个 Kubectl 命令&#xff0c;这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于&#xff1a; 集群信息Pod 诊断服务诊断…

一款成熟的文件外发审计管控系统,应该具备哪些价值?

在信息化高速发展的时代&#xff0c;电子文件泄密事件层出不穷&#xff0c;比如文本文档、图像、音频、视频、电子表格等&#xff0c;都是日常会接触到的文件类型。像制造业企业&#xff0c;会有比较多的上下游协作交流&#xff0c;外发的电子文档以明文的形式提供给合作伙伴&a…

信号类型(通信)——QAM调制信号

系列文章目录 《信号类型&#xff08;通信&#xff09;——仿真》 文章目录 前言 一、原理图 二、仿真 2.1、QAM仿真 2.2、不同滚降系数 2.3、不同M下QAM调制对比 总结 前言 本文主要结合仿真分析了QAM的信号处理过程&#xff0c;并简单分析了成型滤波器中的滚降系数对QA…

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、简单使用1.First、在project下的build.gradle添加2.按需导入3. 常用代码 rtsp流的优化大功告成 总结 前言 本文介绍&#xff0c;…

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中&#xff0c;Apache Kafka已成为一个不可或缺的组件&#xff0c;用于可靠地处理和传输大规模的数据流。然而&#xff0c;随着Kafka集群规模的不断增长&…

私募证券基金动态-23年9月报

成交量&#xff1a;9月日均7,197.15亿元 2023年9月A股两市日均成交7,197.15亿元&#xff0c;环比下降12.78%、同比下降1.38%&#xff0c;为近2年单月日均成交最低的月份。9月整体20个交易日&#xff0c;单日成交金额最高没有过万亿&#xff0c;单日最低破6000亿&#xff0c;仅…

博弈论学习笔记(2)——完全信息静态博弈

前言 这部分我们学习的是完全信息静态博弈&#xff0c;主要内容包括博弈论的基本概念、战略式博弈、Nash均衡、Nash均衡解的特性、以及Nash均衡的应用。 零、绪论 1、什么是博弈论 1&#xff09;博弈的定义 博弈论&#xff1a;研究决策主体的行为发生直接相互作用时候的决策…

蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)

目录 1、求和 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 1、求和 题目&#xff1a; 思路&#xff1a; 1、首先想到的是两重遍历&#xff0c;累加和。但是当n取200000时&#xff0c;会超时&#xff0c;所以暴力的遍历没有办法通过全部案例。 2、将公式变形得到…

AI先行者第一辑:AI for Science 要坚持高压强投入

‍‍ 中国在AI for Science的基础还非常的薄弱&#xff0c;且非短期内可以提升&#xff0c;需要有一个长期性的计划&#xff0c;也需要有足够的金钱投入和人才队伍建设。 本篇作者褚学森&#xff0c;中国船舶科学研究中心、深海技术科学太湖实验室 研究员&#xff1b;新兴技术研…

代码随想录算法训练营第四十天丨 动态规划part03

343. 整数拆分 思路 看到这道题目&#xff0c;都会想拆成两个呢&#xff0c;还是三个呢&#xff0c;还是四个.... 来看一下如何使用动规来解决。 动态规划 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]…

DNS 域名解析系统

文章目录 前言什么是 DNS 域名解析系统为什么需要 DNS 域名解析DNS 是如何发展的hosts 文件维护域名和IP的映射关系DNS 系统&#xff08;服务器&#xff09;DNS 镜像系统 前言 前面为大家分享了关于计算机网络中应用层——自定义协议、传输层——UDP、TCP 协议、网络层——IP协…