import numpy as np
import cv2
import xml.etree.ElementTree as ET
from PIL import Image
name_classes = ['hqc'] # 類别名,可以更改為對應的voc類别名稱即可
def flip_horizontal(jpg_file,new_jpg,png_file,new_png):
img = Image.open(jpg_file)
png =Image.open(png_file)
# out = im.transpose(Image.ROTATE_180)
out_img = img.transpose(Image.FLIP_LEFT_RIGHT)
out_png = png.transpose(Image.FLIP_LEFT_RIGHT)
out_img.save(new_jpg)
out_png.save(new_png)
def flip_xml(xml_file,new_xml):
tree = ET.parse(xml_file)
objs = tree.findall('object')
for ix, obj in enumerate(objs):
name = obj.find('name').text
if name == 'hqc': # 因為本資料集隻針對某一個更改的,你要改的有很多,此處要改為 if name in name_classes :
print(xml_file)
obj_new = obj.find('bndbox')
xmin = str( 256 - int(obj_new.find('xmax').text)) # 因為進行水準翻轉,這隻改變x坐标值,y坐标值不變
xmax = str( 256 - int(obj_new.find('xmin').text)) # 此處256是圖檔的寬和高,水準翻轉,最大值變最小值,最小值變最大值
obj_new.find('xmin').text = xmin
obj_new.find('xmax').text = xmax
tree.write(new_xml)
if __name__ == '__main__':
# 原始的圖檔,xml,png資料集的路徑
xml_file='F:/資料集/hqc/annotation/2.xml'
jpg_file=r'F:/資料集/hqc/image/2.jpg'
png_file=r'F:/資料集/hqc/label/2.png'
# 水準翻轉後儲存的路徑
new_jpg=r'F:/資料集/shiyan/2.jpg'
new_xml = r'F:/資料集/shiyan/2.xml'
new_png='F:/資料集/shiyan/2.png'
flip_xml(xml_file, new_xml)
flip_horizontal(jpg_file, new_jpg,png_file,new_png)
image =Image.open(new_jpg)
tree = ET.parse(new_xml)
root = tree.getroot()
for obj in root.iter('object'):
difficult = 0
if obj.find('difficult') != None:
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in name_classes or int(difficult) == 1:
continue
cls_id = name_classes.index(cls)
xmlbox = obj.find('bndbox')
b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text),
int(xmlbox.find('ymax').text))
print(b)
image = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
cv_img = cv2.rectangle(image, (int(float(b[0])),
int(float(b[1]))),
(int(float(b[2])),
int(float(b[3]))), (255, 0, 0), 2)
image = Image.fromarray(cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB))
image.show()
實作的效果如下:
原始圖像
水準翻轉
水準翻轉後的标簽
水準反轉後的框