AnnotatedImageView.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """AnnotatedImageView: Displays images with bounding boxes etc."""
  2. from PyQt5 import QtWidgets, QtGui, QtCore
  3. from ..utils import Video
  4. class AnnotatedImageView(QtWidgets.QGraphicsView):
  5. def __init__(self, parent):
  6. super(AnnotatedImageView, self).__init__(parent=parent)
  7. self._scene = QtWidgets.QGraphicsScene()
  8. self.setScene(self._scene)
  9. self._rect = QtCore.QRectF(0, 0, 0, 0)
  10. self.setRenderHint(QtGui.QPainter.Antialiasing)
  11. self._image = None
  12. self._current_video = None
  13. def display(self, prediction, mode='prediction'):
  14. self._scene.clear()
  15. if prediction['filetype'] == 'image':
  16. self._image = QtGui.QImage(prediction['filename'])
  17. item = QtWidgets.QGraphicsPixmapItem(QtGui.QPixmap.fromImage(self._image))
  18. self._scene.addItem(item)
  19. self._scene.setSceneRect(item.boundingRect())
  20. self._rect = item.boundingRect()
  21. if mode in prediction.keys():
  22. self._overlay(prediction[mode])
  23. elif prediction['filetype'] == 'video':
  24. if 'cap' in prediction.keys():
  25. cap = prediction['cap']
  26. else:
  27. cap = Video(prediction['filename'])
  28. if 'frame' in prediction.keys():
  29. frame = prediction['frame']
  30. else:
  31. frame = 0
  32. video_frame = cap.get_frame(frame)
  33. if video_frame is not None:
  34. self._image = QtGui.QImage(video_frame,
  35. video_frame.shape[1], video_frame.shape[0],
  36. video_frame.shape[2] * video_frame.shape[1], QtGui.QImage.Format_RGB888)
  37. item = QtWidgets.QGraphicsPixmapItem(QtGui.QPixmap.fromImage(self._image))
  38. self._scene.addItem(item)
  39. self._scene.setSceneRect(item.boundingRect())
  40. self._rect = item.boundingRect()
  41. if 'prediction-by-frame' in prediction.keys():
  42. self._overlay(prediction['prediction-by-frame'][frame])
  43. self.refit_display()
  44. def _overlay(self, prediction):
  45. if 'faces' in prediction.keys():
  46. self._overlay_faces(prediction['faces'])
  47. def _overlay_faces(self, faces):
  48. box_background = QtGui.QColor(255, 255, 255, 51)
  49. box_border = QtGui.QColor(0, 0, 0, 1)
  50. width = float(self._image.width())
  51. height = float(self._image.height())
  52. for face in faces:
  53. self._scene.addRect(face['x'] * width, face['y'] * height, face['w'] * width, face['h'] * height,
  54. QtGui.QPen(QtGui.QBrush(box_border), 3.0),
  55. QtGui.QBrush(box_background))
  56. def refit_display(self):
  57. if self._rect is None:
  58. self.resetTransform()
  59. else:
  60. self.fitInView(self._rect, QtCore.Qt.KeepAspectRatio)
  61. def resizeEvent(self, event: QtGui.QResizeEvent):
  62. self.refit_display()
  63. QtWidgets.QGraphicsView.resizeEvent(self, event)
  64. def reset(self):
  65. self._scene.clear()
  66. self._image = None
  67. self._current_video = None
  68. self._rect = None
  69. # TODO display context action