如何可视化VIA标注JSON文件中的关键点?附读取代码与示例数据
实现VIA标注JSON中关键点的可视化
所需依赖
首先安装必要的Python库:
pip install opencv-python matplotlib glob2
完整代码实现
import os import json import cv2 import glob import matplotlib.pyplot as plt # 配置路径 JSON_PATH = '/JSON/json.json' IMG_DIR = '/Dataset' # 数据集根目录 # 构建文件名到完整路径的映射,方便快速查找 image_paths = glob.glob(os.path.join(IMG_DIR, '*.png')) image_filename_map = {os.path.basename(path): path for path in image_paths} # 加载JSON标注数据 with open(JSON_PATH, 'r', encoding='utf-8') as f: annotation_data = json.load(f) # 遍历每张图片的标注信息 for img_metadata in annotation_data['_via_img_metadata'].values(): img_filename = img_metadata['filename'] keypoint_regions = img_metadata['regions'] # 跳过无关键点标注的图片 if not keypoint_regions: continue # 检查图片是否存在于数据集 if img_filename not in image_filename_map: print(f"警告:未找到图片 {img_filename}") continue # 读取图片 img_full_path = image_filename_map[img_filename] img = cv2.imread(img_full_path) # OpenCV默认BGR格式,转换为RGB用于matplotlib显示 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 绘制每个关键点 for region in keypoint_regions: shape_attrs = region['shape_attributes'] # 确保是点类型标注 if shape_attrs['name'] == 'point': cx = shape_attrs['cx'] cy = shape_attrs['cy'] # 绘制红色实心圆(半径5,厚度-1表示填充) cv2.circle(img_rgb, (cx, cy), 5, (255, 0, 0), -1) # 可选:添加坐标文本标注 cv2.putText(img_rgb, f"({cx},{cy})", (cx + 10, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1) # 显示标注后的图片 plt.figure(figsize=(12, 12)) plt.imshow(img_rgb) plt.title(f"关键点标注:{img_filename}") plt.axis('off') plt.show() # 可选:保存标注后的图片到数据集目录 save_filename = f"annotated_{img_filename}" save_path = os.path.join(IMG_DIR, save_filename) # 转换回BGR格式保存 cv2.imwrite(save_path, cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR)) print(f"已保存标注图片:{save_path}")
代码说明
- 路径配置:修改
JSON_PATH和IMG_DIR为你的实际路径。 - 图片映射:通过
glob获取所有PNG图片,构建文件名到路径的字典,避免重复查找。 - 标注遍历:遍历
_via_img_metadata下的每个图片条目,提取关键点坐标。 - 关键点绘制:使用OpenCV的
circle函数绘制红色实心点,可选添加坐标文本。 - 结果展示与保存:用matplotlib显示图片,同时支持保存标注后的图片到本地。
注意事项
- 确保JSON中的
filename与数据集里的图片文件名完全一致(包括大小写)。 - 若图片路径包含特殊字符,需确保编码正确(代码中已指定
encoding='utf-8')。 - 可根据需求调整关键点的颜色、大小、文本样式等参数。
内容的提问来源于stack exchange,提问作者Asifuzzaman Jishan
相关产品推荐
相关产品推荐

