一个代码示例
运行下面代码会在图像上标注出真实标签框。
python
import numpy as np
import cv2
images_dir = r'D:/Demo/images2' # 图像文件夹位置
labels_dir = r'D:/Demo/labels2' # 标签文件夹位置
output_dir = r'D:/Demo/output' # 输出文件夹位置
os.makedirs(output_dir, exist_ok=True)
for img_name in os.listdir(images_dir):
if not img_name.lower().endswith(('.jpg', '.jpeg', '.png')):
continue
img_path = os.path.join(images_dir, img_name)
label_path = os.path.join(labels_dir, os.path.splitext(img_name)[0] + '.txt')
# 使用 PIL 读取图像(支持中文路径)
try:
pil_img = Image.open(img_path).convert('RGB')
image = np.array(pil_img)
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
except Exception as e:
print(f"无法读取图像: {img_path}, 错误: {e}")
continue
h, w = image.shape[:2]
if not os.path.exists(label_path):
print(f"未找到标签文件: {label_path}")
continue
with open(label_path, 'r', encoding='utf-8') as f:
for line in f:
parts = line.strip().split()
if len(parts) != 5:
continue
# class_id = int(parts[0]) # 不需要类别名,可不使用
x_center = float(parts[1]) * w
y_center = float(parts[2]) * h
box_w = float(parts[3]) * w
box_h = float(parts[4]) * h
x1 = int(x_center - box_w / 2)
y1 = int(y_center - box_h / 2)
x2 = int(x_center + box_w / 2)
y2 = int(y_center + box_h / 2)
color = (0, 255, 0) # 绿色框
# color = (0, 0, 255) 红色框 需要时把上面那行注释掉,用这行代码
thickness = 2
cv2.rectangle(image, (x1, y1), (x2, y2), color, thickness)
# 注意:这里没有 cv2.putText,所以不会显示 "ship"
output_path = os.path.join(output_dir, img_name)
cv2.imwrite(output_path, image)
print(f"已保存带框图像: {output_path}")