python代码回显图片标注信息

在做模型训练的时候,会用到数据集,分为图像和标注信息,我们在网上直接下载的数据集,想看它的标注框,但是只有原图像和标注的txt文件,这个时候可以写程序直接看效果:

已有的数据示例:

想要看到的效果:

如果我们有安装过labelImg,并且标注文件txt的格式刚好是规范的五列yolo格式,可以直接打开labelImg选择图像目录以及保存的标注文件目录就能看到想要的效果。

但这里我们下载的数据集中标注文件里是八列数据并不规范,所以不能用labelImg直接打开看,要想用labelImg的话需要写程序先把标注文件转化成yolo格式(我的其他博文有写,参照:无人机拍摄图像数据集下载与处理),这样就绕远了,复杂了,我们的目的仅仅是看下标注情况

当然,如果我们的标注文件txt就是规范的yolo格式,但不想用labelImg看标注信息,也可以参照以下代码写程序(需要注意的是,必须清楚标注文件里每列是什么含义)

所以用到以下方法:

完整代码:

import cv2
import os

basePath = "D:/python/VisDrone2019-DET-val-test/VisDrone2019-DET-val/"
imagePath = basePath + "images/"
annoPath = basePath + "annotations/"

category = {
    "0": "regions",
    "1": "pedestrian",
    "2": "people",
    "3": "bicycle",
    "4": "car",
    "5": "van",
    "6": "truck",
    "7": "tricycle",
    "8": "awning-tricycle",
    "9": "awning-tricycle",
    "10": "awning-tricycle",
    "11": "others",
}

files = os.listdir(imagePath)
images = []
for file in files:
    if file.endswith(".jpg") or file.endswith(".png"):
        images.append(file)


def showAnno(index):
    file_name, file_extension = os.path.splitext(images[index])
    annoFile = annoPath + file_name + ".txt"
    image = cv2.imread(imagePath + images[index])
    lines = []
    with open(annoFile, "r") as file:
        for line in file:
            line = line.strip()
            rects = line.split(",")
            cv2.rectangle(
                image,
                (int(rects[0]), int(rects[1])),
                (int(rects[0]) + int(rects[2]), int(rects[1]) + int(rects[3])),
                (0, 255, 0),
                2,
            )
            cv2.putText(
                image,
                category.get(rects[5], rects[5]),
                (int(rects[0]), int(rects[1]) - 10),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.5,
                (0, 255, 0),
                1,
            )
    return image


index = 0
while index < len(images):
    image = showAnno(index)
    cv2.imshow("anno", image)
    c = cv2.waitKey(0)  # 接收键盘上的值
    print(c)
    if c == 27:  # ESC退出键
        break
    elif c == 97:  # A展示上一张
        index -= 1
    elif c == 100:  # D展示下一张
        index += 1

cv2.destroyAllWindows()

要实现多个 JSON 打标文件回显多张图片,可以使用以下步骤: 1. 使用 Pythonjson 库读取 JSON 打标文件,并将其转换为 Python 对象。 2. 使用 OpenCV 库读取图片文件。 3. 使用转换后的打标信息,在图片上绘制标注框、标注点等。 4. 显示处理后的图片。 下面是一个简单的示例代码,可以实现读取单个 JSON 打标文件并在一张图片上绘制标注框: ```python import cv2 import json # 读取 JSON 打标文件 with open('labels.json', 'r') as f: labels = json.load(f) # 读取图片文件 img = cv2.imread('image.jpg') # 绘制标注框 for label in labels: x1, y1, x2, y2 = label['bbox'] cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 显示处理后的图片 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 如果有多个图片和对应的 JSON 打标文件,可以使用一个循环来处理它们,例如: ```python import cv2 import json # 读取所有图片和对应的打标文件 data = [ ('image1.jpg', 'labels1.json'), ('image2.jpg', 'labels2.json'), ('image3.jpg', 'labels3.json') ] # 处理每个图片和打标文件 for image_file, label_file in data: # 读取 JSON 打标文件 with open(label_file, 'r') as f: labels = json.load(f) # 读取图片文件 img = cv2.imread(image_file) # 绘制标注框 for label in labels: x1, y1, x2, y2 = label['bbox'] cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 显示处理后的图片 cv2.imshow(image_file, img) # 等待用户按下任意键退出程序 cv2.waitKey(0) cv2.destroyAllWindows() ``` 这个示例代码可以读取多个图片和对应的 JSON 打标文件,并在每个图片上绘制标注框,然后显示它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值