1. 程式人生 > >【學習筆記】使用python批量讀取並修改xml檔案(3)

【學習筆記】使用python批量讀取並修改xml檔案(3)

在大老闆的安排下最近在某公司實習,實習期間要求實現一個影象識別模組的封裝。無奈基礎太薄弱,只能將任務細分,單獨學習來實現。以此為背景……


經過公司師姐的指點,突然毛瑟頓開,編寫了V3.0的程式碼,可以實現的功能:使用者輸入欲改變的圖片尺寸後計算新的xml中bnb box的值將圖片尺寸改變後儲存將xml的新值寫入xml並儲存

完整程式碼如下:

# coding:utf-8
########################################################################
# version:3.0 @author:KangShiFu                                        #
# 思路:1.首先統一resize圖片-,圖片尺寸使用者自行輸入2.讀取標註原圖的xml檔案的長、寬值#
# 3.計算變化後的xml的相應座標值,並寫入xml檔案中                              #
########################################################################
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/'
# sorted可以讓os.listdir順序遍歷資料夾中的檔案
files_img=sorted(os.listdir(path_img))
for imgfile in files_img:
	img_dir = os.path.join(path_img,imgfile)
	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()
	cv2.imwrite(img_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')
	
		# 修改<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)
			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)
			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)
			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)
			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('恭喜,寫入xmin/ymin成功!')

需要的小夥伴直接拿去用,順便幫我檢測一下還有什麼問題……十分感謝!有不足的地方懇請評論區指出。