This commit is contained in:
Martin Baeuml
2011-10-11 11:06:33 +02:00
parent 9e153a78c4
commit 09060a52fc
2 changed files with 69 additions and 39 deletions
+46 -31
View File
@@ -2,24 +2,28 @@ from PyQt4.QtGui import *
from PyQt4.Qt import *
import math
class ItemInserter(QObject):
"""
The base class for all item insertion handlers.
"""
# Signals
annotationFinished = pyqtSignal()
inserterFinished = pyqtSignal()
inserterFinished = pyqtSignal()
def __init__(self, labeltool, scene, default_properties=None, prefix="", commit=True):
def __init__(self, labeltool, scene, default_properties={},
prefix="", commit=True):
QObject.__init__(self)
self._labeltool = labeltool
self._scene = scene
self._default_properties = default_properties if default_properties is not None else {}
self._prefix = prefix
self._ann = {}
self._commit = commit
self._item = None
self._pen = Qt.red
self._labeltool = labeltool
self._scene = scene
self._default_properties = default_properties
if self._default_properties is None:
self._default_properties = {}
self._prefix = prefix
self._ann = {}
self._commit = commit
self._item = None
self._pen = Qt.red
def annotation(self):
return self._ann
@@ -57,6 +61,7 @@ class ItemInserter(QObject):
def abort(self):
self.inserterFinished.emit()
class PointItemInserter(ItemInserter):
def mousePressEvent(self, event, image_item):
pos = event.scenePos()
@@ -66,15 +71,19 @@ class PointItemInserter(ItemInserter):
self._ann.update(self._default_properties)
if self._commit:
image_item.addAnnotation(self._ann)
self._item = QGraphicsEllipseItem(QRectF(pos.x()-2, pos.y()-2, 5, 5))
self._item = QGraphicsEllipseItem(QRectF(pos.x() - 2,
pos.y() - 2, 5, 5))
self._item.setPen(self.pen())
self.annotationFinished.emit()
event.accept()
class RectItemInserter(ItemInserter):
def __init__(self, labeltool, scene, default_properties=None, prefix="", commit=True):
ItemInserter.__init__(self, labeltool, scene, default_properties, prefix, commit)
self._init_pos = None
def __init__(self, labeltool, scene, default_properties={},
prefix="", commit=True):
ItemInserter.__init__(self, labeltool, scene, default_properties,
prefix, commit)
self._init_pos = None
def mousePressEvent(self, event, image_item):
pos = event.scenePos()
@@ -120,36 +129,41 @@ class RectItemInserter(ItemInserter):
self._init_pos = None
ItemInserter.abort(self)
class FixedRatioRectItemInserter(RectItemInserter):
def __init__(self, labeltool, scene, default_properties=None, prefix="", commit=True):
RectItemInserter.__init__(self, labeltool, scene, default_properties, prefix, commit)
self._ratio = 1
if default_properties is not None:
self._ratio = float(default_properties.get('_ratio', 1))
def __init__(self, labeltool, scene, default_properties={},
prefix="", commit=True):
RectItemInserter.__init__(self, labeltool, scene, default_properties,
prefix, commit)
self._ratio = float(default_properties.get('_ratio', 1))
def mouseMoveEvent(self, event, image_item):
if self._current_item is not None:
new_geometry = QRectF(self._current_item.rect().topLeft(), event.scenePos())
new_geometry = QRectF(self._current_item.rect().topLeft(),
event.scenePos())
dx = new_geometry.width()
dy = new_geometry.height()
d = math.sqrt(dx*dx + dy*dy)
d = math.sqrt(dx * dx + dy * dy)
r = self._ratio
k = math.sqrt(r*r+1)
h = d/k
w = d*r/k
k = math.sqrt(r * r + 1)
h = d / k
w = d * r / k
new_geometry.setWidth(w)
new_geometry.setHeight(h)
self._current_item.setRect(new_geometry.normalized())
event.accept()
class SequenceItemInserter(ItemInserter):
inserters = []
def __init__(self, labeltool, scene, default_properties=None, prefix="", commit=True):
ItemInserter.__init__(self, labeltool, scene, default_properties, prefix, commit)
self._items = []
self._state = 0
def __init__(self, labeltool, scene, default_properties={},
prefix="", commit=True):
ItemInserter.__init__(self, labeltool, scene, default_properties,
prefix, commit)
self._items = []
self._state = 0
self._current_inserter = None
self._current_image_item = None
@@ -171,8 +185,7 @@ class SequenceItemInserter(ItemInserter):
next_state = self._state + 1
if self._current_inserter is not None:
if self._current_inserter is not None:
self.updateAnnotation(self._current_inserter.annotation())
self.updateAnnotation(self._current_inserter.annotation())
item = self._current_inserter.item()
if item is not None:
self._scene.addItem(item)
@@ -189,7 +202,8 @@ class SequenceItemInserter(ItemInserter):
next_state = 0
callable_, prefix, message = self.inserters[next_state]
self._current_inserter = callable_(self._labeltool, self._scene, prefix=prefix, commit=False)
self._current_inserter = callable_(self._labeltool, self._scene,
prefix=prefix, commit=False)
self._current_inserter.annotationFinished.connect(self.nextState)
if message:
self._scene.setMessage(message)
@@ -217,6 +231,7 @@ class SequenceItemInserter(ItemInserter):
self._cleanup()
self.inserterFinished.emit()
class BBoxFaceInserter(SequenceItemInserter):
inserters = [
(RectItemInserter, "bbox", "Labelling bounding box"),
+23 -8
View File
@@ -4,12 +4,15 @@ from PyQt4.Qt import *
import logging
LOG = logging.getLogger(__name__)
class IgnorePrefix:
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
class BaseItem(QAbstractGraphicsShapeItem):
"""
Base class for visualization items.
@@ -29,9 +32,9 @@ class BaseItem(QAbstractGraphicsShapeItem):
parent :
"""
QAbstractGraphicsShapeItem.__init__(self, parent)
self.setFlags(QGraphicsItem.ItemIsSelectable | \
QGraphicsItem.ItemIsMovable | \
QGraphicsItem.ItemSendsGeometryChanges | \
self.setFlags(QGraphicsItem.ItemIsSelectable |
QGraphicsItem.ItemIsMovable |
QGraphicsItem.ItemSendsGeometryChanges |
QGraphicsItem.ItemSendsScenePositionChanges)
self._model_item = model_item
@@ -45,6 +48,7 @@ class BaseItem(QAbstractGraphicsShapeItem):
self._text = ""
self._text_bg_brush = None
self._auto_text_keys = self.defaultAutoTextKeys[:]
self._valid = True
def changeColor(self):
if self._model_item is not None:
@@ -190,7 +194,8 @@ class BaseItem(QAbstractGraphicsShapeItem):
nextindex = 0
else:
try:
nextindex = (valuelist.index(oldvalue)+1) % len(valuelist)
nextindex = valuelist.index(oldvalue) + 1
nextindex %= len(valuelist)
except ValueError:
nextindex = 0
newvalue = valuelist[nextindex]
@@ -296,7 +301,8 @@ class RectItem(BaseItem):
self._resize_start_rect = None
self._updateRect(self._dataToRect(self._model_item))
LOG.debug("Constructed rect %s for model item %s" % (self._rect, model_item))
LOG.debug("Constructed rect %s for model item %s" %
(self._rect, model_item))
def __call__(self, model_item=None, parent=None):
item = RectItem(model_item, parent)
@@ -365,7 +371,9 @@ class RectItem(BaseItem):
def mouseMoveEvent(self, event):
if self._resize:
diff = event.scenePos() - self._resize_start
rect = QRectF(self._resize_start_rect.topLeft(), self._resize_start_rect.bottomRight() + diff).normalized()
tl = self._resize_start_rect.topLeft()
br = self._resize_start_rect.bottomRight()
rect = QRectF(tl, br + diff).normalized()
self._updateRect(rect)
self.updateModel()
event.accept()
@@ -398,6 +406,7 @@ class RectItem(BaseItem):
self.updateModel()
event.accept()
class GroupItem(BaseItem):
items = []
@@ -421,6 +430,7 @@ class GroupItem(BaseItem):
def boundingRect(self):
return self.childrenBoundingRect()
class OccludablePointItem(PointItem):
cycleValuesOnKeypress = {
'o': ('occluded', [True, False])
@@ -440,6 +450,7 @@ class OccludablePointItem(PointItem):
occluded = self._model_item[key]
self.setColor(Qt.red if occluded else Qt.yellow)
class IDRectItem(RectItem):
cycleValuesOnKeypress = dict(
[('i', (IgnorePrefix('id'), range(10)))] +
@@ -447,6 +458,7 @@ class IDRectItem(RectItem):
)
defaultAutoTextKeys = ['id']
class BBoxFaceItem(GroupItem):
items = [
(IDRectItem, "bbox"),
@@ -455,6 +467,7 @@ class BBoxFaceItem(GroupItem):
(OccludablePointItem, "mc"),
]
class ControlItem(QGraphicsItem):
def __init__(self, parent=None):
QGraphicsItem.__init__(self, parent)
@@ -467,6 +480,7 @@ class ControlItem(QGraphicsItem):
color.setAlpha(200)
painter.fillRect(self.boundingRect(), color)
class NPointFacePointItem(QGraphicsEllipseItem):
def __init__(self, landmark, *args, **kwargs):
self._landmark = landmark
@@ -489,6 +503,7 @@ class NPointFacePointItem(QGraphicsEllipseItem):
self.setPen(color)
self.update()
class NPointFaceItem(GroupItem):
items = [
(OccludablePointItem, "leoc"),
@@ -506,7 +521,8 @@ class NPointFaceItem(GroupItem):
def createChildren(self):
for callable_, prefix in self.items:
if prefix + 'x' in self._model_item and prefix + 'y' in self._model_item:
if prefix + 'x' in self._model_item and \
prefix + 'y' in self._model_item:
child = callable_(self._model_item, prefix, self)
self._children.append(child)
@@ -523,4 +539,3 @@ class NPointFaceItem(GroupItem):
pen.setStyle(Qt.DashLine)
painter.setPen(pen)
painter.drawRect(self.boundingRect())