Opencv ---- 图像处理+生成xml文件(数据集处理)

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")










 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值