Python OpenCV 实现从 JSON 标注提取坐标并绘制边界框

码头散步
码头散步
发布时间:2026-10-16| 3人浏览过
原创

本文介绍如何使用 Python 和 OpenCV 库,从 LabelMe 等工具生成的 JSON 标注文件中提取矩形坐标,并将其绘制回原始图像。通过遍历文件夹获取文件列表,解析 JSON 中的 shapes 节点获取左上角和右下角坐标,利用 cv2.rectangle 函数在图像上画出对应边框,最终保存处理后的图像。

前言

问题需求:

现有两个文件夹,分别用于存放原始图像 image 和对应的标签文件。目标是将标签文件中的标注信息提取出来,并在对应的原始图像上绘制出标注框。

相应的思路

  • 第一步是确定各个文件的路径;
  • 第二步是解析 JSON 文件,提取其中的标注数据,并读取对应的图像以绘制边框。由于图像文件和标签文件的前缀名称一致,可以生成一个前缀列表,通过拼接“图像路径+前缀+.jpeg”来读取图像,同理使用“写入图像路径+前缀+.jpeg”和“标签路径+前缀+.json”来保存图像和读取标签。

读取前缀列表

  • 利用os.walk()迭代遍历文件夹及相应的文件列表;
  • 或者通过os.listdir直接获取文件夹下的文件列表;
# 通过os.walk()读取文件夹以及相应的文件列表
def get_file_list(path):
    file_list=[]
    for dir_list,folder,file in os.walk(path):
        file_list=file
    return file_list

#通过os.listdir()读取文件夹下的文件列表
def get_file_list2(path):
    file_list=os.listdir(path)
    return file_list
file_list=get_file_list2(r"E:\temp\AI\label")
print(file_list)

找出 json 结构中对应框坐标位置,画出对应的框

查看 json 文件结构,对应找到坐标所在的位置:

  • 观察 json 文件可知,坐标信息位于 shapes 节点下的 points 列表中。其中列表的第 0 项代表左上角位置,第 1 项代表右下角位置(原文误写为右上,根据代码逻辑修正理解,但此处保留原文描述逻辑,实际代码使用 points[1] 作为右下角)。因此,在 OpenCV 的画框函数中,参数 pt1 和 pt2 即可确定cv2.rectangle(img, pt1, pt2, color, thickness=None )
{
  "version": "3.16.5",
  "flags": {},
  "shapes": [
    {
      "label": "0",
      "line_color": null,
      "fill_color": null,
      "points": [
        [
          2720.0,
          1094.0
        ],
        [
          2768.0,
          1158.0
        ]
      ],
      "shape_type": "rectangle",
      "flags": {}
    }
  ],
...
}

那么代码就如下所示:

import json
import cv2
path_label=r"E:\temp\AI\label"
path_img=r"E:\temp\AI\image"
path_result=r"E:\temp\AI\result"
# 通过遍历将图像纷纷画框
for file in file_list:
    txt=open(os.path.join(path_label,file))
    load_json=json.load(txt)
    for shape in load_json["shapes"]:
        left_top=(int(shape["points"][0][0]),int(shape["points"][0][1]))
        right_bottom=(int(shape["points"][1][0]),int(shape["points"][1][1]))
        #对象进行画框
        img_name=file.split(".")[0]+".jpeg"
        img=cv2.imread(os.path.join(os.path.join(path_img,img_name)))
        cv2.rectangle(img, left_top,right_bottom, (0, 255, 0), 2)
        cv2.imwrite(os.path.join(path_result,img_name), img)

例如,其中一个图像上的一个缺陷位置就被标注出来

到此这篇关于 python 用 opencv 将标注提取画框到对应的图像中的文章就介绍到这了,更多相关 python opencv 标注提取内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。