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

news/2024/7/10 0:36:43 标签: 目标检测, python, 人工智能
python">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.niftyadmin.cn/n/5447232.html

相关文章

Head First Design Patterns -模板方法模式

什么是模板方法模式 在一个方法中定义一个算法的骨架,而把一些步骤延迟到子类。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。 这些算法步骤中的一个或者多个被定义为抽象的,由子类实现。 类图 代码 书中用泡茶和…

康奋威科技邀您到场参观2024长三角快递物流展

参展企业介绍 杭州康奋威科技股份有限公司创立于2005年,由国家“万人计划”专家任天挺先生创立并担任法人,是一家专业从事智能装备研发与制造的国家级高新技术企业。专注于自动化控制、机械设计、信息化方面的技术研究,主要为太阳能光伏、智…

opencv常用数据结构和函数?

OpenCV是一个强大的计算机视觉库,它提供了丰富的数据结构和函数,用于处理图像和视频数据。以下是一些OpenCV中常用的数据结构和函数: 常用数据结构: cv::Mat:这是OpenCV中最基本和最常用的数据结构,用于存…

【微服务】StackOverflow的架构学习

目录 架构基础设施网络服务器SQL 服务器Redis推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战StackOverflow 是资源需求量最大的网站之一。我们作为架构师,在进行各种微服务架构的实践的同时,也需要学习借鉴各个成熟实践的精华。 因此本…

无人机图像识别与分析

无人机图像识别与分析是无人机技术应用的一个重要方向,涉及到计算机视觉、机器学习和模式识别等多个技术领域。以下是无人机图像识别与分析的一般流程和关键技术: 1. 图像获取 使用无人机搭载的高清摄像头、热成像相机或其他特殊传感器,在不…

spring boot dynamic 动态数据数据源配置连接池

前言 我们可以使用 dynamic-datasource 来快速实现多数据源,但是多数据源配置连接池 以及说明文档都是收费的。 这里整理的连接池的配置以及配置说明 连接池配置 (druid或者 hikari 选择一个即可) 特此说明 如果配置配到了 spring.datasour…

pytorch深度学习——dataset(附数据集下载)

在学习深度学习的时候,我们需要考虑如何去处理数据去训练我们的模型,pytorch为我们提供了Dataset和DataLoader两个类来对数据进行处理,前者作用是提供了一种方式来获取数据及其label,后者的作用是为网络提供不同的数据形式。本文主…

vscode 编译多个c++文件

在tasks.json中,"args": [ //"${file}", "${fileDirname}\\*.cpp",]这是更改vscode的任务json,为了仿真launch正确。在settings.json中,更改code-runner插件设置,改"code-runner.executorMap"…