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

news2024/11/20 4:23:31
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)

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

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

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

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

相关文章

Android Studio 无法下载 gradle-7.3.3-bin.zip

下载新的Android Studio,然后创建新的工程时,出现报错:Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.3.3-bin.zip 或者超时,我们可以复制:https://services.grad…

11 Games101 - 笔记 - 几何(曲线与曲面)

11 几何(曲线与曲面) 贝塞尔曲线 定义 贝塞尔曲线:由控制点和线段组成的曲线,控制点是可拖动的支点。 如图,蓝色为贝塞尔曲线,p1, p2, p3为控制点,曲线和初始与终止端点相切,并且…

云计算 3月18号 (mysql安装及操作)

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB? DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行…

Swift 结构化并发之全局 Actor 趣谈

概览 在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。 除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢? 在本篇博文中,您将学到如…

ruoyi-nbcio-plus基于vue3的flowable用户任务的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Xpath解析

目录 Xpath的简介: 简介: 相关概念: Xpath的使用: 安装: 用法: 第一步:准备html 第二步:将html构造出etree对象 第三步:使用etree对象的xpath()方法配合xpath表达…

Linux--Ubuntu安装【保姆级教程】

Linux操作系统时程序员必须要学的操作系统。接下来我们就来看一下Linux操作系统是如何安装的 我们在 Vmware 虚拟机中安装 linux 系统,所以需要先安装 vmware 软件,然后再 安装 Linux 系统。 一.所需安装文件: Vmware 下载地址(现在最新版的…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包springboot3篇)

前言 在当前多元化开发环境下,Java作为一种广泛应用的编程语言,其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱,而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

01.重新认识文件(Linux基本概念)

知识引入: 我们经常使用word或者wps写的论文、作业等都是文件,而我们这样对文件的认识也比较片面。我们是否思考过,如果文件里面没有写东西,那么计算机会不会保存呢?答案是,肯定会的。因为我们每次建的空文…

SpringBoot如何替换启动图标

SpringBoot项目在启动时会出现一个默认的启动图案 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/::…

Matlab|基于条件风险价值CVaR的微网动态定价与调度策略

目录 1 主要内容 模型示意图 电能交易流程 模型亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序复现文章《A cooperative Stackelberg game based energy management considering price discrimination and risk assessment》,建立基于主从博弈的考虑…

2024年计算机三级|数据库习题整理(自用④)

所有题目均来自【三级数据库技术基础题库】,此博客仅为知识点的补充,用于自主的回顾学习,仅供参考。 选择题 知识点:数据库文件 透明性分级: ①分片透明性 > ②位置透明性 > ③局部数据模型透明性 数据仓库数据…

正版J-Link仿真器无输出电压问题

目录 一、Jink安装包获取二、正版J-Link无法输出3.3V问题引脚定义图 解决方案:J-Link Commander J-Link是支持仿真ARM内核芯片的JTAG仿真器 一、Jink安装包获取 官网: https://www.segger.com/downloads/jlink/ 二、正版J-Link无法输出3.3V问题 今天…

PostgreSQL中控制文件的解析与恢复

最近遇到有人问起PG中控制文件的一些使用问题,总结了一下。 1、PG控制文件简介 1.1、存储的位置 它的路径位于: 相关信息,可以用命令pg_controldata得到: [10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA pg_control version …

蓝桥杯-02-2023蓝桥杯c/c++省赛B组题目

参考 2023 年第十四届蓝桥杯 C/C B组省赛题解 2023蓝桥杯c/c省赛B组题目(最全版): A:日期统计 这题方法应该很多,没有和别人讨论想法。我的解法思路是:先 load 函数生成所有这一年的合法日期,然后枚举所有可以从数据…

为什么独享ip会更高效?

随着互联网的蓬勃发展,代理IP因其特性,也备受关注,代理IP又有分共享代理IP和独享代理IP,但,无论是在数据采集方面,还是在其他业务场景上,独享代理IP似乎会更受用户欢迎一点,这到底是…

SpringCloud之网关组件Gateway学习

SpringCloud之网关组件Gateway学习 GateWay简介 Spring Cloud Gateway是Spring Cloud的⼀个全新项目,目标是取代Netflix Zuul,它基于Spring5.0SpringBoot2.0WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型…

每日一题 --- 977. 有序数组的平方[力扣][Go]

今天这一题和昨天的知识点是一样的,就是双指针法。 题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,1…

Zero-Change Object Transmission for Distributed Big Data Analytics——论文泛读

ATC 2022 Paper 问题 分布式大数据分析在很大程度上依赖于Java和Scala等高级语言的可靠性和多功能性。然而,这些高级语言也为数据传输制造了障碍。要在Java虚拟机(JVM)之间传输数据,发送方应将对象转换为字节数组(序…

ArmSoM-Sige RK3588开发板产品简介

让我们在 5 分钟内了解 Sige7。 简介​ ArmSoM-Sige7采用Rockchip RK3588新一代旗舰级八核64位处理器,主频高达2.4GHz,6 TOPS算力NPU,最大可配32GB大内存。支持8K视频编解码,拥有丰富的接口,支持双2.5G网口、WiFi6 &…