栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

【python】在原图中显示标签(yolo格式)的检测框bbox

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【python】在原图中显示标签(yolo格式)的检测框bbox

主要流程:

读取标签文件数据,打开图像,利用opencv-python库,在原图中画出标签的bbox检测框,并可以保存。

先说明一下我们的文件结构:
训练集:我们在案例中将训练集目录命名为images
然后训练集目录内全部都是jpg图像。
例如:

 |-- images
         |   |-- 000000000009.jpg
         |   |-- 000000000025.jpg
         |   |-- 000000000030.jpg
         |   |-- ... 

训练集标签:我们在案例中将训练集目录命名为labels
然后训练集标签目录内全部都是txt文件。

 |-- labels
         |   |-- 000000000009.txt
         |   |-- 000000000025.txt
         |   |-- 000000000030.txt
         |   |-- ... 

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

0 0.3125 0.179104 0.0453125 0.0985075

简单介绍:
每行一共5个数据,数据与数据之间空格隔开。
第一个数据0表示分类的类别序号
第二个数据0.3125表示x_center/width,即检测框中点的x坐标除以图像宽度。
第三个数据0.179104表示y_center/height,即检测框中点的y坐标除以图像高度。
第四个数据0.0453125表示roi_width/width。即检测框的宽度除以图像宽度。
第五个数据0.0985075表示roi_width/width。即检测框的高度除以图像高度。

然后我们的代码如下:
具体路径根据实际情况而定

import shutil
import os
import cv2
import re


def main():

	#  images-dir
    path_image = './1/images'
    #  labels-dir
    path_labels = './1/labels'
    type_object = '.txt'

    # 画框效果图的输出目录
    output_images = './hands/images'
    output_labels = './hands/labels'

    history_name = []

    for ii in os.walk(path_image):
        for j in ii[2]:
            type = j.split(".")[1]
            if type != 'jpg':
                continue
            path_img = os.path.join(path_labels, j)
            label_name = j[:-4] + type_object
            path_label = os.path.join(path_labels, label_name)
            if os.path.exists(path_label) != True:
                continue
            f = open(path_label, 'r+', encoding='utf-8')
            print(path_img)
            img = cv2.imread(path_img)
            w = img.shape[1]
            h = img.shape[0]
            new_lines = []
            hands_lines = []
            while True:
                line = f.readline()
                if line:
                    img_tmp = img.copy()
                    msg = line.split(" ")
                    # print(x_center,",",y_center,",",width,",",height)
                    x1 = int((float(msg[1]) - float(msg[3]) / 2) * w)  # x_center - width/2
                    y1 = int((float(msg[2]) - float(msg[4]) / 2) * h)  # y_center - height/2
                    x2 = int((float(msg[1]) + float(msg[3]) / 2) * w)  # x_center + width/2
                    y2 = int((float(msg[2]) + float(msg[4]) / 2) * h)  # y_center + height/2
                    # print(x1, ",", y1, ",", x2, ",", y2)
                    cv2.rectangle(img_tmp, (x1, y1), (x2, y2), (0, 0, 255), 5)
                    cv2.imshow("show", img_tmp)
                    c = cv2.waitKey(0)
                    # print("c=",c)
                    if c == 8:
                        reflag = True
                        ii[2].insert(0,j)

                        if len(history_name) > 0:
                            his = history_name.pop(len(history_name))
                            ii[2].insert(0,his)
                        break
                    else:
                        reflag = False
                    if c != 32:
                        # 代表不是干扰项,排除
                        new_lines.append(line)
                        print("不是干扰项!")
                    else:
                        print("判断这是干扰项!")
                        hands_lines.append(line)
                else:
                    break

            if reflag:
                continue

            if len(hands_lines) > 0:
                shutil.copyfile(path_img, os.path.join(output_images, j))
                shutil.copyfile(path_label, os.path.join(output_labels, label_name))
            if len(new_lines) == 0:
                os.remove(path_img)
                os.remove(path_label)
                print("删除成功!")
            else:
                # 重写标签
                f = open(path_label, 'w', encoding='utf-8')
                f.writelines(new_lines)
                f.close()

                if len(history_name) > 5:
                    history_name.pop()

                history_name.append(j)


if __name__ == '__main__':
    main()

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/280211.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号