目标检测预测框可视化python代码实现--OpenCV

import numpy as np 
import cv2
import colorsys
from PIL import Image, ImageDraw, ImageFont


def puttext_cn(img, text, pt, color=(255,0,0), size=16):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype("simhei.ttf", size, encoding="utf-8")
    # 绘制文本
    draw.text(pt, text, color, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)


def plot_results1(image_path, bboxes_list, class_names_list):
    img = cv2.imread(image_path)
    for i in range(len(bboxes_list)):
        bbox = bboxes_list[i]
        left, top, right, bottom = bbox[0], bbox[1], bbox[2], bbox[3]
        class_name = class_names_list[i]
        class_index = class_names_list.index(class_name)
        # cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
        # 参数表示依次为:(图片,长方形框左上角坐标, 长方形框右下角坐标,字体颜色,字体粗细)
        cv2.rectangle(img, (int(left),int(top)), (int(right),int(bottom)),  colors[int(class_index)], thickness=2)      
        label = class_name
        # cv2.getTextSize() 计算文本字符串的宽度和高度
        # text 输入文字字符串; fontFace 要使用的字体;
        # fontScale 字体比例因子,用来被特定字体的基本大小相乘;
        # thickness 用于渲染文本的线的粗细;
        labelSize, baseLine = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
        top = max(top, labelSize[1])
        # cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
        # 各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(img, label, (int(left-10), int(top-10)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, colors[int(class_index)], thickness=2)
    cv2.imwrite("./test/0322/1.jpg", img)
    

def plot_results2(image_path, bboxes_list, class_names_list):
    img = cv2.imread(image_path)
    for i in range(len(bboxes_list)):
        bbox = bboxes_list[i]
        left, top, right, bottom = bbox[0], bbox[1], bbox[2], bbox[3]
        class_name = class_names_list[i]
        class_index = class_names_list.index(class_name)
        # cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
        # 参数表示依次为:(图片,长方形框左上角坐标, 长方形框右下角坐标,字体颜色,字体粗细)
        cv2.rectangle(img, (int(left),int(top)), (int(right),int(bottom)),  colors[int(class_index)], thickness=2)      
        label = class_name
        # cv2.getTextSize() 计算文本字符串的宽度和高度
        # text 输入文字字符串; fontFace 要使用的字体;
        # fontScale 字体比例因子,用来被特定字体的基本大小相乘;
        # thickness 用于渲染文本的线的粗细;
        labelSize_w, labelSize_h = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.75, 1)[0]
        cv2.rectangle(img, (int(left), int(top-labelSize_h)), (int(left+labelSize_w), int(top)), colors[int(class_index)], -1, cv2.LINE_AA)
        top = max(top, labelSize_h)
        # cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
        # 各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(img, label, (int(left), int(top)), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (255, 255, 255), thickness=1, lineType=cv2.LINE_AA)
    cv2.imwrite("./test/0322/2.jpg", img)


def plot_results3(image_path, bboxes_list, class_names_list):
    img = cv2.imread(image_path)
    for i in range(len(bboxes_list)):
        bbox = bboxes_list[i]
        left, top, right, bottom = bbox[0], bbox[1], bbox[2], bbox[3]
        class_name = class_names_list[i]
        class_index = class_names_list.index(class_name)
        # cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
        # 参数表示依次为:(图片,长方形框左上角坐标, 长方形框右下角坐标,字体颜色,字体粗细)
        cv2.rectangle(img, (int(left),int(top)), (int(right),int(bottom)),  colors[int(class_index)], thickness=2)      
        label = class_name
        # cv2.getTextSize() 计算文本字符串的宽度和高度
        # text 输入文字字符串; fontFace 要使用的字体;
        # fontScale 字体比例因子,用来被特定字体的基本大小相乘;
        # thickness 用于渲染文本的线的粗细;
        labelSize_w, labelSize_h = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)[0]
        cv2.rectangle(img, (int(left), int(top-labelSize_h-5)), (int(left+labelSize_w), int(top-5)), (55,55,55), -1, cv2.LINE_AA)
        top = max(top, labelSize_h)
        # cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
        # 各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(img, label, (int(left), int(top-5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (102,255,255), thickness=1, lineType=cv2.LINE_AA)
    cv2.imwrite("./test/0322/3.jpg", img)


def plot_results4(image_path, bboxes_list, class_names_list):
    img = cv2.imread(image_path)
    for i in range(len(bboxes_list)):
        bbox = bboxes_list[i]
        left, top, right, bottom = bbox[0], bbox[1], bbox[2], bbox[3]
        class_name = class_names_list[i]
        class_index = class_names_list.index(class_name)
        # cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift )
        # 参数表示依次为:(图片,长方形框左上角坐标, 长方形框右下角坐标,字体颜色,字体粗细)
        cv2.rectangle(img, (int(left),int(top)), (int(right),int(bottom)),  colors[int(class_index)], thickness=2)      
        label = class_name
        # cv2.getTextSize() 计算文本字符串的宽度和高度
        # text 输入文字字符串; fontFace 要使用的字体;
        # fontScale 字体比例因子,用来被特定字体的基本大小相乘;
        # thickness 用于渲染文本的线的粗细;
        labelSize_w, labelSize_h = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)[0]
        cv2.rectangle(img, (int(left), int(top-labelSize_h-5)), (int(left+labelSize_w*0.5), int(top-2)), (55,55,55), -1, cv2.LINE_AA)
        top = max(top, labelSize_h)
        # cv2.putText(img, str(i), (123,456)), font, 2, (0,255,0), 3)
        # 各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        #cv2.putText(img, label, (int(left), int(top-5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (102,255,255), thickness=1, lineType=cv2.LINE_AA)
        print(label, (int(left), int(top)))
        img = puttext_cn(img, label, (int(left), int(top-15)), (255,255,102), size=12)
    
    cv2.imwrite("./test/0322/4.jpg", img)



if __name__ == "__main__":
    image_path = "./test/0322/032201.jpg"
    bboxes_list = [[707,538,803,667], [321,519,413,536], [689,483,717,520]]
    class_names_list = ['cement_crack_p', 'cement_spall_kok', 'cement_crack_p']
    # class_names_list = ['水泥-横向裂缝', '水泥-边角剥落', '水泥-纵向裂缝']
    
    # 获得hsv格式的不同色度
    hsv_tuples = [(x/len(class_names_list), 0.5, 1.) for x in range(len(class_names_list))]  
    # 获得RGB格式的不同颜色
    colors = list(map(lambda x: colorsys.hsv_to_rgb(*x), hsv_tuples))  
    # 通过hsv格式来调整不同类别对应边框的色度
    colors = list(map(lambda x: (int(x[0] * 255), int(x[1] * 255), int(x[2] * 255)), colors)) 
    
    plot_results3(image_path, bboxes_list, class_names_list)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】ArkUI - 状态管理

在声明式 UI 中,是以状态驱动视图更新,如图1所示: 图1 其中核心的概念就是状态(State)和视图(View): 状态(State):指驱动视图更新的数据&#xf…

BI技巧丨个性化视觉对象

BOSS:那个,那个谁,最近用户反映了,说是你们做的报表不太行啊?! 白茶:(???)老板,怎么说? BOSS:就是…

pytest之统一接口请求封装

pytest之统一接口请求封装 pytest的requests_util.pyrequests_util.py 接口自动化测试框架的封装yaml文件如何实现接口关联封装yaml文件如何实现动态参数的处理yaml文件如何实现文件上传有参数化时候,怎么实现断言yaml的数据量大怎么处理接口自动化框架的扩展&#…

CSK6 接入聆思平台(LSPlatform)

一、开发环境 硬件:视觉语音大模型AI开发套件 二、使用大语言模型 官方指导文档: 开始使用 | 聆思文档中心 获取API密钥 | 聆思文档中心 1、注册 提交申请之后需要将注册电话号码通过微信发送给聆思科技工作人员,工作人员授权后&#xff…

阿里云4核16G服务器价格26.52元1个月、149.00元半年,ECS经济型e实例

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年,配置为阿里云服务器ECS经济型e实例ecs.e-c1m4.xlarge,4核16G、按固定带宽 10Mbs、100GB ESSD Entry系统盘,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接打开如下图&a…

Docker搭建LNMP环境实战(02):Win10下安装VMware

实战开始,先安装 VMware 虚拟机。话不多说,上手就干! 1、基本环境检查 1.1、本机Bios是否支持虚拟化 进入:任务管理器- 性能,查看“虚拟化”是否启用,如果已启用,则满足要求,如果未…

Linux 中的vim和gdb

目录 vim命令模式(常用)nyy-----复制n次np------黏贴n次u------撤销dd-----剪切/删除$-----将光标定位到当前行结尾^-----将光标定位到最开始。gg------将光标定位文本开始shiftg-----将光标定位文件尾。nshiftg----将光标定位到第n行上下左右键:h j k l (左下上右)…

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…

【Linux】详谈命令行参数环境变量

目录 一、浅谈命令行参数 二、环境变量 2.1环境变量的内涵以及理解 2.2PATH环境变量: 2.3输入程序名就能运行我们的程序 2.4系统中的环境变量 2.5导出环境变量 三、main函数的第三个参数 3.1获得环境变量的三种方法 四、本地变量 一、浅谈命令行参数 我们的m…

ubuntu arm qt 读取execl xls表格数据

一,ubuntu linux pc编译读取xls的库 1,安装libxls(读取xls文件 电脑版) 确保你已经安装了基本的编译工具,如gcc和make。如果没有安装,可以使用以下命令安装: sudo apt-update sudo apt-get install build-essentia…

C++ vector容器类型

vector类为内置数组提供了一种替代表示&#xff0c;与string类一样 vector 类是随标准 C引入的标准库的一部分 &#xff0c;为了使用vector 我们必须包含相关的头文件 &#xff1a; #include <vector> 使用vector有两种不同的形式&#xff0c;即所谓的数组习惯和 STL习…

基于python+vue超市货品信息管理系统flask-django-php-nodejs

在此基础上&#xff0c;结合现有超市货品信息管理体系的特点&#xff0c;运用新技术&#xff0c;构建了以 python为基础的超市货品信息管理信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员和用户二种…

android.os.TransactionTooLargeException解决方案,Kotlin

android.os.TransactionTooLargeException解决方案&#xff0c;Kotlin 首先&#xff0c;特意制造一个让Android发生TransactionTooLargeException的场景&#xff0c;一个Activity启动另外一个Activity&#xff0c;在Intent的Bundle里面塞入一个大的ArrayList: import android.…

鸿蒙一次开发,多端部署(十四)一多开发实例(短信)

本章从系统预置的应用中&#xff0c;选择短信应用作为典型的案例&#xff0c;从页面开发和工程结构的角度&#xff0c;介绍"一多"的具体实践。系统的产品形态在不断丰富中&#xff0c;当前主要有默认设备和平板两种产品形态&#xff0c;本章的具体实践也将围绕这两种…

react基本使用

事件处理 react事件和DOM事件 react事件原生事件onClickonclickonClick{eventListener}οnclick"eventListener()"e.preventDefalutοnclick"javascript" class ListItem extends Component {constructor(props){super(props) //子类中调用父类构造函数}…

STM32---DHT11采集与BH1750FVI光照传感器(HAL库、含源码)

写在前面&#xff1a;本节我们学习使用两个常见的传感器模块&#xff0c;分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用&#xff0c;因为其使用简单方便&#xff0c;所以经常被用于STM32的项目之中。今天将使用分享给大家&a…

错误centos docker版本过低导致 is not a valid repository/tag: invalid reference format

文章目录 错误centos docker版本过低导致 is not a valid repository/tag: invalid reference format1、查看免费主机刚才下载的docker版本2、卸载旧版本3、安装yum依赖包4、安装镜像信息5、安装docker CE6、查看docker版本7、再次运行就成功了&#xff01;&#xff01;&#x…

科技革新背后:码垛机器人在不同领域的实践应用

随着科技的进步&#xff0c;机器人技术已经渗透到各个行业之中&#xff0c;成为提高生产效率、减少人工成本的重要工具。码垛机器人作为自动化技术的杰出代表&#xff0c;其在各个行业中的应用场景日益广泛&#xff0c;从食品饮料到化工产品&#xff0c;再到物流仓储&#xff0…

【国家计算机二级考试C语言.2024】学习备忘录

说明 分值 4060100 40分&#xff1a; 这里面有一大堆程序结果选这题&#xff0c;如果手速还可以。那遇到有疑问的情况就自己去倒计算器的ad E上面去打一打。能够跑出来&#xff0c;结果那是100%的没问题。 有些概念题比较讨厌&#xff0c;只能自己去记忆了。要去背诵熟熟的。…

取消springboot中的Test类中的日志打印

使用SpringBootTest注解进行单元测试时, 打印东西的时候,总会伴随很多的无关紧要的日志信息&#xff0c;影响观感。去掉这些日志应该怎么做呢 ? 两个步骤: 第一步、修改application.properties logging.level.rootoff logging.level.org.springframeworkoff # 关闭baner信息…