在原图中显示yolo格式的检测框(以不同颜色区分)

文件组织格式如下:

|-- 上级目录
	|	|--images
	|	|--labels
	|	|--outputs
|-- images
	|	|--001.jpg
	|	|--002.jpg
	|	|--003.jpg
|-- labels
	|	|--001.txt
	|	|--002.txt
	|	|--003.txt

本文代码读取的标签格式是yolo格式的
txt标签内容格式例如:

2 0.079167 0.675926 0.090625 0.116667

每一行(代表一个目标框)共有5个数据,其中
第1个数据2表示物体的类别信息。
第2个数据0.079167表示归一化后的中心点x坐标,即中心点的x坐标除以图片宽度。
第3个数据0.675926表示归一化后的中心点y坐标,即中心点的y坐标除以图片高度。
第4个数据0.090625表示归一化后的目标框宽度w,即目标框宽度除以图片宽度。
第5个数据0.116667表示归一化后的目标框高度h,即目标框高度除以图片高度。

ncolors(num)主要用来生成num个区分度较大的RGB颜色值。参考如下:
链接

import cv2 as cv
import os
import colorsys
import random

def get_n_hls_colors(num):
  hls_colors = []
  i = 0
  step = 360.0 / num
  while i < 360:
    h = i
    s = 90 + random.random() * 10
    l = 50 + random.random() * 10
    _hlsc = [h / 360.0, l / 100.0, s / 100.0]
    hls_colors.append(_hlsc)
    i += step

  return hls_colors

def ncolors(num):
  rgb_colors = []
  if num < 1:
    return rgb_colors
  hls_colors = get_n_hls_colors(num)
  for hlsc in hls_colors:
    _r, _g, _b = colorsys.hls_to_rgb(hlsc[0], hlsc[1], hlsc[2])
    r, g, b = [int(x * 255.0) for x in (_r, _g, _b)]
    rgb_colors.append([r, g, b])

  return rgb_colors

def convert(bbox,shape):
    x1 = int((bbox[0] - bbox[2] / 2.0) * shape[1])
    y1 = int((bbox[1] - bbox[3] / 2.0) * shape[0])
    x2 = int((bbox[0] + bbox[2] / 2.0) * shape[1])
    y2 = int((bbox[1] + bbox[3] / 2.0) * shape[0])
    return (x1,y1,x2,y2)
n = 6 # 类别数
# 获取n种区分度较大的rgb值
colors = ncolors(n)

images_list = os.listdir('images') # 获取图片名列表
images_dir = 'images/' # 图片目录
labels_dir = 'labels/' # label目录
output_dir = 'output/' # 输出图片目录


for img_id in images_list:
    img = cv.imread(images_dir + img_id) 

    # 判断后缀是为了排除隐藏文件.ipynb_checkpoints
    if img_id[-3:] != 'jpg':
      continue
    shape = img.shape[0:2]
   
    txt_id = img_id.replace('jpg', 'txt') 
    with open(labels_dir + txt_id) as r:
        lines = r.readlines()
        for line in lines:
            line = [float(i) for i in line.split(' ')] # 按空格划分并转换float类型
            label = int(line[0]) #获取类别信息
            bbox = line[1:] # 获取box信息
            (x1,y1,x2,y2) = convert(bbox,shape)
            cv.rectangle(img, (x1, y1), (x2, y2), (colors[label][2], colors[label][1], colors[label][0]), 3)
            cv.waitKey(0)
    cv.imwrite(output_dir + img_id,img)

注意:OpenCV对RGB图像数据的存储顺序是BGR,rectangle函数中Scalar的顺序也是B,G,R。
如Scalar( 0, 0, 255)代表的是红色

效果图

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值