1. 程式人生 > 程式設計 >python 擷取XML中bndbox的座標中的影象,另存為jpg的例項

python 擷取XML中bndbox的座標中的影象,另存為jpg的例項

檔案目錄

Annotations中是XML檔案。

JPEGImages中是對應的JPG檔案

python 擷取XML中bndbox的座標中的影象,另存為jpg的例項

XML檔案

python 擷取XML中bndbox的座標中的影象,另存為jpg的例項

要擷取bndbox座標中的內容。

python程式碼

# -*- coding: utf-8 -*-
# @Time  : 2020/2/8 22:14
# @Author : SanZhi
# @File  : get_xml.py
# @Software: PyCharm
import cv2
import numpy as np

import xml.dom.minidom
import os
import argparse

def main():
  # JPG檔案的地址
  img_path = 'D:/ser/JPEGImages/'
  # XML檔案的地址
  anno_path = 'D:/ser/Annotations/'
  # 存結果的資料夾
  cut_path = 'D:/ser/cut/'
  # 獲取資料夾中的檔案
  imagelist = os.listdir(img_path)

  for image in imagelist:
    image_pre,ext = os.path.splitext(image)
    img_file = img_path + image
    img = cv2.imread(img_file)
    xml_file = anno_path + image_pre + '.xml'
    DOMTree = xml.dom.minidom.parse(xml_file)
    collection = DOMTree.documentElement
    objects = collection.getElementsByTagName("object")

    for object in objects:
      print("start")
      bndbox = object.getElementsByTagName('bndbox')[0]
      xmin = bndbox.getElementsByTagName('xmin')[0]
      xmin_data = xmin.childNodes[0].data
      ymin = bndbox.getElementsByTagName('ymin')[0]
      ymin_data = ymin.childNodes[0].data
      xmax = bndbox.getElementsByTagName('xmax')[0]
      xmax_data = xmax.childNodes[0].data
      ymax = bndbox.getElementsByTagName('ymax')[0]
      ymax_data = ymax.childNodes[0].data
      xmin = int(xmin_data)
      xmax = int(xmax_data)
      ymin = int(ymin_data)
      ymax = int(ymax_data)
      img_cut = img[ymin:ymax,xmin:xmax,:]
      cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre),img_cut)


if __name__ == '__main__':
  main()

補充知識:python讀取XML中bndbox和object name的方法

直接貼程式碼了,封裝為了函式,直接呼叫即可。其中有幾個點需要注意。

1、bndbox下面有4個子物件,因此不能直接使用firstChild來找到內容,需要從該物件裡面繼續尋找標籤為xmin等這樣的物件,注意要加[0]才正確,有問題的可以直接除錯,然後看變數的結構,根據變數的結構來呼叫某一物件。

2、將空格' '替換為'_',方便命名。但是使用str.replace(' ','_')不會直接改變str的內容,返回的字串是改變後的,因此需要變數儲存。

import xml.dom.minidom as xmldom
def get_bndboxfromxml(imageNum,xmlfilebasepath):
  # 讀取xml檔案
  bndbox = [0,0]
  xmlfilepath = xmlfilebasepath + "\%06d" % imageNum+'.xml'
  # print(xmlfilepath)
  domobj = xmldom.parse(xmlfilepath)
  elementobj = domobj.documentElement
  sub_element_obj = elementobj.getElementsByTagName('bndbox')
  if sub_element_obj is not None:
    bndbox[0] = int(sub_element_obj[0].getElementsByTagName('xmin')[0].firstChild.data)
    bndbox[1] = int(sub_element_obj[0].getElementsByTagName('ymin')[0].firstChild.data)
    bndbox[2] = int(sub_element_obj[0].getElementsByTagName('xmax')[0].firstChild.data)
    bndbox[3] = int(sub_element_obj[0].getElementsByTagName('ymax')[0].firstChild.data)
  return bndbox


def get_bndboxnamefromxml(imageNum,xmlfilebasepath):
  bndbox = [0,0]
  xmlfilepath = xmlfilebasepath + "\%06d" % imageNum + '.xml'
  domobj = xmldom.parse(xmlfilepath)
  elementobj = domobj.documentElement
  sub_element_obj = elementobj.getElementsByTagName('name')
  name = sub_element_obj[0].firstChild.data.replace(' ','_')

  return name

以上這篇python 擷取XML中bndbox的座標中的影象,另存為jpg的例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。