Add a function which can load xml file

This commit is contained in:
tzutalin 2015-12-09 21:29:26 +08:00
parent e85c4568b9
commit ed787d4f3a
3 changed files with 61 additions and 5 deletions

View File

@ -22,6 +22,7 @@ from labelDialog import LabelDialog
from colorDialog import ColorDialog from colorDialog import ColorDialog
from labelFile import LabelFile, LabelFileError from labelFile import LabelFile, LabelFileError
from toolBar import ToolBar from toolBar import ToolBar
from pascal_voc_io import PascalVocReader
__appname__ = 'labelImg' __appname__ = 'labelImg'
@ -139,6 +140,9 @@ class MainWindow(QMainWindow, WindowMixin):
changeSavedir = action('&Change default saved Annotation dir', self.changeSavedir, changeSavedir = action('&Change default saved Annotation dir', self.changeSavedir,
'Ctrl+r', 'open', u'Change default saved Annotation dir') 'Ctrl+r', 'open', u'Change default saved Annotation dir')
openAnnotation = action('&Open Annotation', self.openAnnotation,
'Ctrl+q', 'openAnnotation', u'Open Annotation')
openNextImg = action('&Next Image', self.openNextImg, openNextImg = action('&Next Image', self.openNextImg,
'n', 'next', u'Open Next') 'n', 'next', u'Open Next')
@ -263,7 +267,7 @@ class MainWindow(QMainWindow, WindowMixin):
labelList=labelMenu) labelList=labelMenu)
addActions(self.menus.file, addActions(self.menus.file,
(open, opendir,changeSavedir, self.menus.recentFiles, save, saveAs, close, None, quit)) (open, opendir,changeSavedir, openAnnotation, self.menus.recentFiles, save, saveAs, close, None, quit))
addActions(self.menus.help, (help,)) addActions(self.menus.help, (help,))
addActions(self.menus.view, ( addActions(self.menus.view, (
labels, advancedMode, None, labels, advancedMode, None,
@ -797,6 +801,22 @@ class MainWindow(QMainWindow, WindowMixin):
self.statusBar().showMessage('%s . Annotation will be saved to %s' %('Change saved folder', self.defaultSaveDir)) self.statusBar().showMessage('%s . Annotation will be saved to %s' %('Change saved folder', self.defaultSaveDir))
self.statusBar().show() self.statusBar().show()
def openAnnotation(self, _value=False):
path = os.path.dirname(unicode(self.filename))\
if self.filename else '.'
formats = ['*.%s' % unicode(fmt).lower()\
for fmt in QImageReader.supportedImageFormats()]
filters = "Open Annotation XML file (%s)" % \
' '.join(formats + ['*.xml'])
filename = unicode(QFileDialog.getOpenFileName(self,
'%s - Choose a xml file' % __appname__, path, filters))
tVocParseReader = PascalVocReader(filename)
shapes = tVocParseReader.getShapes()
self.loadLabels(shapes)
return
def openDir(self, _value=False): def openDir(self, _value=False):
if not self.mayContinue(): if not self.mayContinue():
return return
@ -834,8 +854,6 @@ class MainWindow(QMainWindow, WindowMixin):
if filename: if filename:
self.loadFile(filename) self.loadFile(filename)
def openNextImg(self, _value=False): def openNextImg(self, _value=False):
# Proceding next image without dialog if having any label # Proceding next image without dialog if having any label
if self.autoSaving is True and self.defaultSaveDir is not None: if self.autoSaving is True and self.defaultSaveDir is not None:
@ -1039,7 +1057,6 @@ class Settings(object):
def inverted(color): def inverted(color):
return QColor(*[255 - v for v in color.getRgb()]) return QColor(*[255 - v for v in color.getRgb()])
def read(filename, default=None): def read(filename, default=None):
try: try:
with open(filename, 'rb') as f: with open(filename, 'rb') as f:

View File

@ -3,7 +3,7 @@ import os.path
import numpy import numpy
import cv2 import cv2
import sys import sys
from pascal_voc_writer import PascalVocWriter from pascal_voc_io import PascalVocWriter
from base64 import b64encode, b64decode from base64 import b64encode, b64decode
class LabelFileError(Exception): class LabelFileError(Exception):

View File

@ -100,6 +100,45 @@ class PascalVocWriter:
out_file.write(self.prettify(root)) out_file.write(self.prettify(root))
out_file.close() out_file.close()
class PascalVocReader:
def __init__(self, filepath):
## shapes type:
## [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color]
self.shapes=[]
self.filepath = filepath
self.parseXML()
def getShapes(self):
return self.shapes
def addShape(self, label, rect):
xmin = rect[0]
ymin = rect[1]
xmax = rect[2]
ymax = rect[3]
points = [(xmin,ymin), (xmin,ymax), (xmax, ymax), (xmax, ymin)]
self.shapes.append((label, points, None, None))
def parseXML(self):
assert self.filepath.endswith('.xml'), "Unsupport file format"
xmltree = ElementTree.parse(self.filepath).getroot()
filename = xmltree.find('filename').text
for object_iter in xmltree.findall('object'):
rects = []
bndbox = object_iter.find("bndbox")
rects.append([int(it.text) for it in bndbox])
label = object_iter.find('name').text
for rect in rects:
self.addShape(label, rect)
return True
# tempParseReader = PascalVocReader('test.xml')
# print tempParseReader.getShapes()
""" """
# Test # Test
tmp = PascalVocWriter('temp','test', (10,20,3)) tmp = PascalVocWriter('temp','test', (10,20,3))