使用一张原始图片和yolo格式标注的txt文件,框出txt文件对应的标签和类别,并保存图片。
需要用到Python的OpenCV库来读取图片和绘制边界框,以及numpy来处理数据。
安装了所需的库:pip install opencv-python numpy
import cv2
import numpy as np
def draw_boxes_and_classes(image_path, annotation_path, classes_dict):
# 读取图片
image = cv2.imread(image_path)
# 读取标注文件
with open(annotation_path, 'r') as file:
lines = file.readlines()
# 遍历所有标注
for line in lines:
parts = line.strip().split()
# YOLO格式: [class_id center_x center_y width height]
class_id, x_center, y_center, width, height = map(float, parts)
x_center, y_center, width, height = int(x_center * image.shape[1]), int(y_center * image.shape[0]), int(width * image.shape[1]), int(height * image.shape[0])
# 计算边界框的左上角和右下角坐标
x1 = int(x_center - width / 2)
y1 = int(y_center - height / 2)
x2 = x1 + width
y2 = y1 + height
# 绘制边界框
cv2.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2)
# 获取类别名称
class_name = classes_dict.get(int(class_id), "Unknown")
# 在边界框旁显示类别名称
cv2.putText(image, class_name, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
# 保存图片
cv2.imwrite('annotated_image.jpg', image)
# 假设你的图片路径和标注文件路径如下
image_path = 'path/to/your/image.jpg'
annotation_path = 'path/to/your/annotation.txt'
# 假设你有一个类别字典,其中类别索引映射到类别名称
classes_dict = {
0: 'person', # 以此类推
1: 'bicycle',
2: 'car',
# ... 添加所有类别
}
# 调用函数
draw_boxes_and_classes(image_path, annotation_path, classes_dict)
函数定义:draw_boxes_and_classes函数接受三个参数:图片路径、标注文件路径和类别字典。
读取图片:使用cv2.imread读取原始图片。
读取标注文件:逐行读取标注文件,并解析每行的类别索引和边界框坐标。
绘制边界框:根据YOLO格式的坐标计算边界框的左上角和右下角坐标,并使用cv2.rectangle绘制边界框。
显示类别名称:在边界框旁边使用cv2.putText显示类别名称。
保存图片:使用cv2.imwrite保存绘制后的图片。
确保将image_path、annotation_path和classes_dict变量设置为实际的路径和类别字典。这个脚本将在当前脚本运行的目录下保存一个名为’annotated_image.jpg’的图片文件,其中包含绘制的边界框和类别标签。