import cv2
import os
import numpy as np
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
image_path = 'img/'
path = input('标签路径')
image_label = input('标签')
filelist = os.listdir(image_path)
for i in filelist:
if i.endswith('.jpg'):
name = i.split('.', 3)[0] + '.' + i.split('.', 3)[1]
print(name)
src = os.path.join(os.path.abspath(image_path), i)
image = cv2.imread(src)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gradX = cv2.Sobel(gray, cv2.CV_32F, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gray, cv2.CV_32F, dx=0, dy=1, ksize=-1)
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
sp = image.shape
blurred = cv2.blur(gradient, (9, 9))
_, thresh = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
x = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
_a, cnts, _b = x
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))
cv2.imwrite("contoursImage2.jpg", image)
Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
y1 = min(Ys)
y2 = max(Ys)
if x1<0:
x1 = 0
if x2>sp[1]:
x2 = sp[1]
if y1<0:
y1 = 0
if y2>sp[0]:
y2 =sp[0]
x1 = x1
cv2.rectangle(image,(x1,y1),(x2,y2),(0,255,0),5)
cv2.imwrite("contoursImage2.jpg", image)
filename = name.split('.')[0]+'.xml'
def CreateXml():
book = ElementTree()
purOrder = Element("annotation")
SubElement(purOrder, "folder").text = "A"
SubElement(purOrder, "filename").text = name
SubElement(purOrder, "path").text = path
item1 = Element("source")
SubElement(item1, "database").text = "Unknown"
purOrder.append(item1)
item2 = Element("size")
SubElement(item2, "width").text = str(sp[1])
SubElement(item2, "height").text = str(sp[0])
SubElement(item2, "depth").text = str(sp[2])
purOrder.append(item2)
SubElement(purOrder, "segmented").text = "0"
item3 = Element("object")
SubElement(item3, "name").text = image_label
SubElement(item3, "pose").text = "Unspecified"
SubElement(item3, "truncated").text = "0"
SubElement(item3, "difficult").text = "0"
item33 = Element("bndbox")
SubElement(item33, "xmin").text = str(x1)
SubElement(item33, "ymin").text = str(y1)
SubElement(item33, "xmax").text = str(x2)
SubElement(item33, "ymax").text = str(y2)
item3.append(item33)
purOrder.append(item3)
book._setroot(purOrder)
indent(purOrder)
return book
def indent(elem, level=0):
i = "\n" + level * " "
print
elem;
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
for e in elem:
indent(e, level + 1)
if not e.tail or not e.tail.strip():
e.tail = i
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
return elem
if __name__ == '__main__':
book = CreateXml()
book.write(filename, "utf-8")