이 시간 동안 작은 작업은 그림에서 손 개체를 추출하는 것이었고 labelimg 마킹 소프트웨어를 사용하여 일부 그림을 표시 (xml 레이블 파일 생성)하고 원본 그림에서 이러한 대상을 제거하는 작은 스크립트를 작성했습니다. 중간에 효과가 아래에 나와 있으며 괜찮습니다.
원본 그림 (예 1) :
자르기 효과 (예 1) :
원본 그림 (예 2) :
자르기 효과 (예 2, 여기에 마킹을위한 빈 손이 있으므로 잘리지 않음) :
완전한 코드
이 코드는 다음 문제를 해결합니다.
1. 동일한 xml 파일에 여러 개의 대상 상자가 있음
2. 그림과 xml 파일이 서로 다르거 나 같은 폴더에 있음
3. 일부 그림이 표시되지 않고 해당 xml 파일이 존재하지 않음
4 . 그림 폴더 (png, jpg) 파일
의 그림 5. 불규칙한 그림 이름 지정
import cv2
import xml.etree.ElementTree as ET
import os
img_path = r'D:\Dataset\HoldingObject\11\color_S000C000P001R000A011' #图片路径
xml_path = r'D:\Dataset\HoldingObject\11\color_S000C000P001R000A011' #标签路径
obj_img_path = r'D:\Dataset\HoldingObject\11\11-1' #目标裁剪图片存放路径
for img_file in os.listdir(img_path): #遍历图片文件夹
if img_file[-4:] in ['.png', '.jpg']: #判断文件是否为图片格式
img_filename = os.path.join(img_path, img_file) #将图片路径与图片名进行拼接
img_cv = cv2.imread(img_filename) #读取图片
img_name = (os.path.splitext(img_file)[0]) #分割出图片名,如“000.png” 图片名为“000”
xml_name = xml_path + '\\' + '%s.xml'%img_name #利用标签路径、图片名、xml后缀拼接出完整的标签路径名
if os.path.exists(xml_name): #判断与图片同名的标签是否存在,因为图片不一定每张都打标
root = ET.parse(xml_name).getroot() #利用ET读取xml文件
count = 0 #目标框个数统计,防止目标文件覆盖
for obj in root.iter('object'): #遍历所有目标框
name = obj.find('name').text #获取目标框名称,即label名
xmlbox = obj.find('bndbox') #找到框目标
x0 = xmlbox.find('xmin').text #将框目标的四个顶点坐标取出
y0 = xmlbox.find('ymin').text
x1 = xmlbox.find('xmax').text
y1 = xmlbox.find('ymax').text
obj_img = img_cv[int(y0):int(y1), int(x0):int(x1)] #cv2裁剪出目标框中的图片
cv2.imwrite(obj_img_path + '\\' + '%s_%s'%(img_name, count) + '.jpg', obj_img) #保存裁剪图片
count += 1 #目标框统计值自增1