【學習筆記】使用python批量讀取並修改xml檔案(4)
阿新 • • 發佈:2019-01-02
在大老闆的安排下最近在某公司實習,實習期間要求實現一個影象識別模組的封裝。無奈基礎太薄弱,只能將任務細分,單獨學習來實現。以此為背景……
程式碼更新V4.0版本,通過openCV實現xml中bounding box在原始影象和尺寸調整後的圖片中的視覺化(part three部分)。方便對比尺寸調整前後是否存在誤差。
# coding:utf-8 ############################################################################# # version:4.0 @author:KangShiFu # # 思路:1.首先統一resize圖片-,圖片尺寸使用者自行輸入2.讀取標註原圖的xml檔案的長、寬值# # 3.計算變化後的xml的相應座標值,並寫入xml檔案中 # ############################################################################# # 改進方向:1.分母是否為0的判斷。(低優先順序) # 2.通過介面顯示原始的bnb_box,以及更改後的bnb_box×(已實現) # 3.將識別後的bnb_box座標用來輔助標註 import os import os.path import cv2 import xml.dom.minidom #---------------------------part one-----------------------------------# imgw = input("請輸入影象尺寸變化後的寬度:\n") imgw = int(imgw) imgh = input("請輸入影象尺寸變化後的高度:\n") imgh = int(imgh) # 地址也可以改成互動式??? path_img='/home/kanghao/learning_something/about_xml/yibiao512/JPEGImages/' path_rszimg='/home/kanghao/learning_something/about_xml/yibiao512/resizedJPEGImages/' # sorted可以讓os.listdir順序遍歷資料夾中的檔案 files_img=sorted(os.listdir(path_img)) files_rszimg=sorted(os.listdir(path_rszimg)) for imgfile in files_img: img_dir = os.path.join(path_img,imgfile) print(img_dir) raw_img = cv2.imread(img_dir) raw_size = raw_img.shape raw_imgh = float(raw_size[0]) raw_imgw = float(raw_size[1]) resize_img = cv2.resize(raw_img, (imgw, imgh), interpolation=cv2.INTER_CUBIC) # ~ cv2.imshow('rezied img', resize_img) # ~ cv2.waitKey(0) # ~ cv2.destroyAllWindows() rszimg_dir=os.path.join(path_rszimg,imgfile) # ~ cv2.imwrite(rszimg_dir, resize_img) print("圖片尺寸轉換已完成!") #--------------------------part one over-------------------------------# #---------------------------part two-----------------------------------# path_xml='/home/kanghao/learning_something/about_xml/yibiao512/Annotations' files_xml=sorted(os.listdir(path_xml)) #得到資料夾下所有檔名稱 for xmlFile in files_xml: if not os.path.isdir(xmlFile): #判斷是否是資料夾,不是資料夾才打開 print(xmlFile) dom=xml.dom.minidom.parse(os.path.join(path_xml,xmlFile)) root=dom.documentElement # ~ width=root.getElementsByTagName('width') # ~ height=root.getElementsByTagName('height') xmin=root.getElementsByTagName('xmin') ymin=root.getElementsByTagName('ymin') xmax=root.getElementsByTagName('xmax') ymax=root.getElementsByTagName('ymax') filename=root.getElementsByTagName('filename') # 修改<xmin> for i in range(len(xmin)): print("原始的xmin座標值為 " + str(xmin[i].firstChild.data)) xmin_raw = unicode.encode(xmin[i].firstChild.data) xmin[i].firstChild.data=float(xmin_raw)*(imgw/raw_imgw) rsz_xmin = xmin[i].firstChild.data print("修改後的xmin座標值為 " + str(xmin[i].firstChild.data)) # 修改<xmax> for i in range(len(xmax)): print("原始的xmax座標值為 " + str(xmax[i].firstChild.data)) xmax_raw = unicode.encode(xmax[i].firstChild.data) xmax[i].firstChild.data=float(xmax_raw)*(imgw/raw_imgw) rsz_xmax = xmax[i].firstChild.data print("修改後的xmax座標值為 " + str(xmax[i].firstChild.data)) # 修改<ymin> for i in range(len(ymin)): print("原始的ymin座標值為 " + str(ymin[i].firstChild.data)) ymin_raw = unicode.encode(ymin[i].firstChild.data) ymin[i].firstChild.data=float(ymin_raw)*(imgh/raw_imgh) rsz_ymin = ymin[i].firstChild.data print("修改後的ymin座標值為 " + str(ymin[i].firstChild.data)) # 修改<ymax> for i in range(len(ymax)): print("原始的ymax座標值為 " + str(ymax[i].firstChild.data)) ymax_raw = unicode.encode(ymax[i].firstChild.data) ymax[i].firstChild.data=float(ymax_raw)*(imgh/raw_imgh) rsz_ymax = ymax[i].firstChild.data print("修改後的ymax座標值為 " + str(ymax[i].firstChild.data)) #--------------------------part two over-------------------------------# #儲存修改到xml檔案中 # ~ with open(os.path.join(path_xml,xmlFile),'w') as fh: # ~ dom.writexml(fh) # ~ print('恭喜,寫入xml檔案成功!') #---------------------------part three---------------------------------# for i in range(len(filename)): print(filename[i].firstChild.data) img_name=filename[i].firstChild.data raw_img_dir = os.path.join(path_img,img_name) raw_img = cv2.imread(raw_img_dir) rsz_img_dir = os.path.join(path_rszimg,img_name) rsz_img = cv2.imread(rsz_img_dir) cv2.rectangle(raw_img, (int(float(xmin_raw)),int(float(ymin_raw))), (int(float(xmax_raw)),int(float(ymax_raw))), (0,191,255), 5) cv2.rectangle(rsz_img, (int(float(rsz_xmin)),int(float(rsz_ymin))), (int(float(rsz_xmax)),int(float(rsz_ymax))), (238,44,44), 5) cv2.imshow("原始圖片",raw_img) cv2.imshow("尺寸變更後的圖片",rsz_img) cv2.waitKey(0) cv2.destroyAllWindows() #--------------------------part three over-----------------------------#