【OpenCV实现图像:可视化目标检测框】
文章目录
- 概要
- 画框函数
- 代码实现
- 标签美化
- 角点美化
- 透明效果
- 小结
概要
目标检测框的可视化在计算机视觉和机器学习领域中是一项重要的任务,有助于直观地理解和评估目标检测算法的性能。通过使用Python和相关的图像处理库,可以轻松实现目标检测框的可视化。主要步骤包括读取图像数据、提取目标检测框的坐标信息,然后利用可视化工具在图像上绘制这些框。Matplotlib是一个常用的可视化库,其pyplot模块提供了方便的函数来绘制图像和图形。通过结合目标检测算法的输出和Matplotlib的功能,可以创建一个直观且易于理解的图像,展示图像中目标的位置和边界框。
常见的目标检测框的输出.

左上为常用的不带标签的输出框,右上为YOLO系列美化带标签后的矩形框,左下为四个角点美化后的矩形框,右下为带标签的角点美化矩形框.
画框函数
在OpenCV中,通常使用cv2.rectangle函数来绘制矩形框,该函数的一般形式如下:
cv2.rectangle(image, start_point, end_point, color, thickness)
这里是函数的参数解释:
image: 输入图像
start_point: 矩形框左上角点的坐标
end_point: 矩形框右下角点的坐标
color: 矩形框的颜色,默认使用BGR顺序表示
thickness: 线的粗细,其中 -1 代表填充整个矩形
通过调用这个函数,可以在图像上绘制矩形框,用于突显目标或标记检测结果。
代码实现
用python来实现上述示例中的相应的画框效果.
1)读入图像
首先我们来读入一副彩色图像,并画框:
import cv2img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [ 25, 43,200,180, "sdq"]
box_color = (255,0,255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)
cv2.imshow('Image with Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
box = [ 20, 25,80,200, “sdq”]
在这里,box 是一个列表,包含了五个元素:
20:矩形框的左上角 x 坐标。
25:矩形框的左上角 y 坐标。
80:矩形框的右下角 x 坐标。
200:矩形框的右下角 y 坐标。
"sdq":一个标签表示矩形框的标识或类别。
结果如下:

标签美化
接下来来给矩形框添加标签,观察上述画图函数,注意最后一个参数thickness,如果此值等于-1,那么将对矩形框执行填充效果。
标签美化代码
def draw_label_type(draw_img,bbox,label_color):label = str(bbox[-1])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1] + 2),(bbox[0] + labelSize[0], bbox[1] + labelSize[1] + 3),color=label_color,thickness=-1) )cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize + 3),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0, 0, 0),thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color,thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0, 0, 0),thickness=1)
使用代码:
import cv2def draw_label_type(draw_img, bbox, label_color):label = str(bbox[4])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1]),(bbox[0] + labelSize[0], bbox[1] + labelSize[1]),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [25, 43, 200, 180, "sdq"]
box_color = (255, 0, 255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)draw_label_type(img, box, label_color=(255, 255, 255)) # 添加标签cv2.imshow('Image with Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

角点美化
上述添加完标签后,由于标签框和目标矩形框颜色一致,边界处不太容易区分,这里添加对角点美化的代码。
def draw_box_corner(draw_img,bbox,length,corner_color):# Top Leftcv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0] + length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0], bbox[1] + length), corner_color, thickness=3)# Top Rightcv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2] - length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2], bbox[1] + length), corner_color, thickness=3)# Bottom Leftcv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0] + length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0], bbox[3] - length), corner_color, thickness=3)# Bottom Rightcv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2] - length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2], bbox[3] - length), corner_color, thickness=3)
相应的相应的参数含义如下:
draw_img: 输入图像
bbox: 目标检测框 形式(x1,y1,x2,y2)
length: 直线长度
corner_color 直线颜色
完整融合代码:
import cv2def draw_label_type(draw_img, bbox, label_color):label = str(bbox[4])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1]),(bbox[0] + labelSize[0], bbox[1] + labelSize[1]),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)def draw_box_corner(draw_img, bbox, length, corner_color):# Top Leftcv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0] + length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[1]), (bbox[0], bbox[1] + length), corner_color, thickness=3)# Top Rightcv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2] - length, bbox[1]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[1]), (bbox[2], bbox[1] + length), corner_color, thickness=3)# Bottom Leftcv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0] + length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[0], bbox[3]), (bbox[0], bbox[3] - length), corner_color, thickness=3)# Bottom Rightcv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2] - length, bbox[3]), corner_color, thickness=3)cv2.line(draw_img, (bbox[2], bbox[3]), (bbox[2], bbox[3] - length), corner_color, thickness=3)img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [25, 43, 200, 180, "sdq"]
box_color = (255, 0, 255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)draw_label_type(img, box, label_color=(255, 255, 255)) # 添加标签
draw_box_corner(img, box, length=10, corner_color=(0, 255, 0)) # 添加对角点cv2.imshow('Image with Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

透明效果
通过cv2.rectangle 函数设置 thickness参数 ,可以得到填充后的图像,进而利用opencv中的 cv2.add_weight 函数可以实现透明效果,自行尝试。
利用add_weight 函数对上面两副图像进行加权. 如下:
alpha = 0.8
gamma = 0
out_img = cv2.addWeighted(img,alpha,draw_img,1-alpha,gamma)
完整代码:
import cv2def draw_label_type(draw_img, bbox, label_color):label = str(bbox[4])labelSize = cv2.getTextSize(label + '0', cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]if bbox[1] - labelSize[1] - 3 < 0:cv2.rectangle(draw_img,(bbox[0], bbox[1]),(bbox[0] + labelSize[0], bbox[1] + labelSize[1]),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] + labelSize[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)else:cv2.rectangle(draw_img,(bbox[0], bbox[1] - labelSize[1] - 3),(bbox[0] + labelSize[0], bbox[1] - 3),color=label_color, thickness=-1)cv2.putText(draw_img, label,(bbox[0], bbox[1] - 3),cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 0, 0), thickness=1)img_name = 'img_6.png'
img = cv2.imread(img_name)
box = [25, 43, 200, 180, "sdq"]
box_color = (255, 0, 255)
cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), color=box_color, thickness=2)draw_img = img.copy()
draw_label_type(draw_img, box, label_color=(255, 255, 255)) # 添加标签alpha = 0.8
gamma = 0
out_img = cv2.addWeighted(img, alpha, draw_img, 1 - alpha, gamma)cv2.imshow('Image with Transparent Rectangle', out_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
小结
在目标检测中,优化矩形框的标签和角点可以提高可视化效果和用户理解。透明效果的应用则使得目标框融入原始图像,不影响图像的主体内容,提高了整体呈现的美观性。
相关文章:
【OpenCV实现图像:可视化目标检测框】
文章目录 概要画框函数代码实现标签美化角点美化透明效果小结 概要 目标检测框的可视化在计算机视觉和机器学习领域中是一项重要的任务,有助于直观地理解和评估目标检测算法的性能。通过使用Python和相关的图像处理库,可以轻松实现目标检测框的可视化。…...
C/C++---------------LeetCode第1436. 旅行终点站
旅行的终点站 题目及要求哈希算法在main内使用 题目及要求 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi 。请你找出这次旅行的终点站,即没有任何可…...
如何在AD上创建完整的项目
首先,我们先安装好AD,这里我使用的是AD22,安装过程如下: Altium Designer 22下载安装教程-CSDN博客 Altium Designer 22是全球领先的PCB设计软件之一,为电路板设计师提供了一种集成的解决方案,旨在简化和加…...
实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值
目录 背景问题问题分析问题解决 错误解决与定位技巧总结 背景 仍旧是学生信息管理系统的问题,当时做的时候没发现这么多问题呢,只能说明一件事,做的时候没有站在用户的角度考虑需求,设置了什么内容,就按照设置好的去测…...
九、ffmpeg命令转封装
开了几天小差,今天继续学习ffmpeg。 准备测试使用的视频,并查看其信息 # 查看视频信息。使用Mediainfo也可以 ffprobe test.mp4 视频格式的信息如下。 保持编码格式:ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.tsffmpeg -i…...
数字逻辑电路基础-时序逻辑电路之锁存器
文章目录 一、锁存器简介二、verilog源码三、综合及仿真结果 一、锁存器简介 本文介绍数字逻辑电路中一种常用的基础时序逻辑电路-锁存,顾名思义,它的功能就是将输入在控制信号有效时透明传输到输出端,当控制信号无效时,输出值保…...
Python---global关键字---设置全局变量
global 英 /ˈɡləʊb(ə)l/ adj. 全球的,全世界的;全面的,整体的;(计算机)全局的;球形的 需求:如果有一个数据,在函数A和函数B中都要使用,该怎么办&…...
bug场景记录
项目场景: mapper.xml文件中sql语句执行失败,显示输入的参数数量不对 问题描述 <select id"page" resultType"com.sky.entity.Employee">select * from employee<where><if test"name ! null and name !"…...
【云备份】第三方库的认识与使用
文章目录 json库粗略认识详细认识writer 类reader类jsoncpp序列化实现jsoncpp反序列化实现 bundle文件压缩库简单认识bundle库实现文件压缩bundle库实现文件解压缩 httplib库Request类Response类Server类Client类 json库 粗略认识 json是一种数据交换格式,采用完全…...
6.2.SDP协议
那今天呢?我们来介绍一下sdp协议,那实际上呢?sdp协议非常的简单。我们如果拿到一个stp的文档去看的话,那你要分阅里边的所有的内容会觉得很枯燥,但实际上呢,如果我们按照这张图所展示的结构去看stp的话。你…...
[汇编实操]DOSBox工具安装——Ubuntu18.04系统
一、下载&安装 sudo apt install -y dosbox 二、启动 dosbox 三、C盘挂载 将上述文件下载放在任意路径,将DEBUG目录映射为虚拟C盘 MASM.EXE 是用来编译的,LINK.EXE 用来链接,这俩是必须的。 执行如下命令: mount c /m…...
前端 HTML 的 DOM 事件相关知识有哪些?
HTML 的 DOM 事件是指在网页上发生的各种事件,如点击、鼠标移动、键盘输入等。 通过 JavaScript 脚本可以对这些事件进行监听和处理,以实现交互效果。以下是一些常见的 DOM 事件及其相关知识点: 1、click:点击事件,在…...
Mac自带的看图如何连续查看多张图片
一、问题 mac看访达里的图片时,双击打开一张图片,然后按上下左右键都没法切换到另外的图片。而且也没找到像window一样单击缩略图可以看到预览图。其实是自己不懂得怎么使用,哈哈哈😂 二、方法 2.1、图标方式 可以看到缩略图&a…...
HTTP四大参数类型及请求参数的方式和如何接收
HTTP 请求中4大参数类型和接收方法。 1、请求头参数head 请求头参数顾名思义,是存放在请求头中发送给服务器的参数,服务器通过解析请求头获取参数内容。通常会存放本次请求的基本设置,以帮助服务器理解并解析本次请求的body体。 参数形式如…...
【C++11】default、delete与Noncopyable
C11 oop中的default、delete与Noncopyable default 在C11标准中,可以使用default关键字来显式地声明默认的构造函数和析构函数。 使用default关键字可以用来显式声明默认的构造函数和析构函数。这样做可以让编译器自动生成默认实现 –>->->关于构造函数…...
【心得】基于flask的SSTI个人笔记
目录 计算PIN码 例题1 SSTI的引用链 例题2 SSTI利用条件: 渲染字符串可控,也就说模板的内容可控 我们通过模板 语法 {{ xxx }}相当于变相的执行了服务器上的python代码 利用render_template_string函数参数可控,或者部分可控 render_…...
ubuntu20.04 nginx 部署静态网页
1、安装nginx Ubuntu环境下安装部署Nginx(有网)_ubuntu 安装nginx_荒Huang的博客-CSDN博客 2、压缩并上传文件到服务器指定位置(unzip命令),修改nginx配置文件,指定root目录为文件的目录,index 值为指定的html文件 …...
vue脚手架的基础搭建过程
MVVM架构 Vue框架底层设计遵循MVVM架构。 Model层(M)模型层(业务逻辑层) View层(V)视图层 主管UI ViewModel层(VM) 将项目代码划分清晰的层次结构后,非常有利于后期代…...
函数与数组
一.函数 1、函数的作用 定义较为复杂的但是需要重复使用的内容,以便再次使用,可以直接调用,节约时间,提高效率。 语句块定义成函数约等于别名,定义函数,再引用函数。 封装的可重复利用的具有特定功能的…...
2023年【安全生产监管人员】考试题及安全生产监管人员找解析
题库来源:安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总,相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…...
5分钟快速上手3dsconv:解决3DS游戏安装难题的完整指南
5分钟快速上手3dsconv:解决3DS游戏安装难题的完整指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 你是否遇…...
终极Windows界面美化指南:用ExplorerPatcher打造个性化工作环境
终极Windows界面美化指南:用ExplorerPatcher打造个性化工作环境 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 厌倦了Windows 11千…...
详解CN域名注册:流程、要求、材料及注意事项全解析
CN域名作为中国国家顶级域名,凭借其本土标识和稳定性能,成为深耕国内市场的首选。注册受CNNIC严格监管,遵循规范流程至关重要。本文国科云将系统梳理cn域名注册全流程、核心要求及关键注意事项。一、CN域名注册核心流程CN域名注册遵循“先申请…...
预算感知AI代理:动态资源优化与成本控制策略
1. 预算感知AI代理的核心价值与挑战在构建大规模AI代理系统时,资源消耗与性能表现的矛盾始终是工程实践中的关键痛点。传统AI代理(如ReAct框架)常采用"尽力而为"的资源使用策略,导致两个典型问题:一是早期阶…...
Proxmox VE模板制作实战:将Ubuntu 22.04 Cloud-Init镜像打造成你的“黄金镜像”
Proxmox VE黄金镜像实战:从Ubuntu 22.04 Cloud-Init到企业级模板的深度优化 在虚拟化环境中,标准化镜像的管理效率直接决定了运维团队的生产力水平。想象一下这样的场景:凌晨三点收到业务扩容需求,你需要快速部署20台配置一致的Ub…...
X平台算法解析:掌握黄金法则提升内容触及率与互动率
1. 项目概述与核心价值如果你在X(原Twitter)上发布内容,却感觉自己的帖子像石沉大海,互动寥寥无几,那你很可能正在与那个看不见摸不着却又无处不在的“算法”作斗争。今天要聊的这个开源项目x-algorithm,不…...
化学推理模型评估与Chem-R架构解析
1. 化学推理模型评估体系构建化学推理作为人工智能与化学科学的交叉领域,其核心挑战在于如何量化评估模型模拟人类专家思维的能力。我们设计了一套多维度的评估体系,从六个正交维度全面考察推理质量:1.1 评估指标设计原理化学推理不同于一般的…...
【12.MyBatis源码剖析与架构实战】10.嵌套查询映射源码剖析
MyBatis 嵌套查询映射源码深度剖析 嵌套查询映射(Nested Query Mapping)是 MyBatis 中通过 <association> 或 <collection> 元素的 select 属性,实现一个 SQL 查询的某列值作为参数,去执行另一个 SQL 查询,并将其结果填充到主对象的关联属性中。这可以避免使…...
AstronClaw+Loomy:云端AI大脑与本地智能终端的协同办公实践
1. 项目概述:从“能用”到“好用”的AI助手进化之路 如果你和我一样,在过去一年里尝试过各种AI工具,从ChatGPT到Claude,再到国内外的各类Agent框架,那你一定经历过一个典型的“过山车”式体验:一开始被它们…...
Docker 的镜像(Image)和容器(Container)
Docker 的镜像(Image)和容器(Container)是其最核心的两个概念,理解它们的关系是掌握 Docker 的关键。简单来说,镜像是静态的模板,而容器是这个模板运行起来的动态实例。这非常类似于面向对象编程…...
