python 擷取XML中bndbox的座標中的影象,另存為jpg的例項
阿新 • • 發佈:2020-03-10
檔案目錄
Annotations中是XML檔案。
JPEGImages中是對應的JPG檔案
XML檔案
要擷取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的例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。