• python用opencv将标注文件中的标注提取画框到对应的图像中


    问题需求

    拥有两个文件夹,一个保存图片image,一个保存标签文件,要求把标签文件中的标注提取出来,并在图片中画出来

    相应的思路

    • 首先提出各个文件的路径;
    • 然后将解析json文件,将其中的标注文件提取,并将对应的图像读取在图像上将对应的框画出来;
      由于图像以及标签的文件前缀都是一样的,所以只要一个前缀列表提取出来,然后将图像的路径与其进行拼接(图像路径+前缀+.jpeg)就可以读取对应的图像,而写入的图像也是一样(写入图像路径+前缀+.jpeg),标签文件也是一样(标签路径+前缀+.json)

    读取前缀列表

    1. 通过os.walk()迭代读取文件夹以及相应的文件列表
    2. 通过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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    json文件列表

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

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

    • 可以看到json文件中坐标是在shapes对应的points里的列表,而且是列表第0项表示左上位置,而第一项表示右上位置,所以在cv2的画框的两个参数参数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": {}
        }
      ],
    ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    那么代码就如下所示

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出到文件中
    比如其中一个图像的一个缺陷位置就被标注出来了
    在这里插入图片描述

    代码以及文件链接:https://download.csdn.net/download/weixin_42295969/86404495

  • 相关阅读:
    欧拉计划Python解法(第6题-第10题)
    jest在已有项目中的安装与使用
    【微信小程序】小程序使用详细教程(建议收藏)
    Microsoft Dynamics 365 CE 扩展定制 - 2. 客户端扩展
    C++模拟实现红黑树
    PSD95抗体研究丨SYSY PSD95抗体结果图展示
    quartz框架(六)-ThreadPool
    pytorch 笔记: Swin-Transformer 代码
    Attention机制详解(深入浅出)
    Linux中shell命令取别名
  • 原文地址:https://blog.csdn.net/weixin_42295969/article/details/126414920