Skip to content

Commit fe79a77

Browse files
committed
Working again
1 parent 877c13e commit fe79a77

14 files changed

Lines changed: 671 additions & 124 deletions

source/Correspondences.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import numpy as np
21
import cv2
3-
from sklearn.neighbors import NearestNeighbors
4-
52
import helper
3+
import numpy as np
4+
import torch
5+
from sklearn.neighbors import NearestNeighbors
66

77

8-
def initialize(laser, camera, segmentator, minInterval, maxInterval):
9-
maxima = segmentator.getLocalMaxima(segmentator.getClosedGlottisIndex()).copy()
8+
def initialize(laser, camera, maxima_image, minInterval, maxInterval):
9+
maxima = maxima_image
1010

1111
locations = list()
1212
ids = list()
@@ -15,7 +15,7 @@ def initialize(laser, camera, segmentator, minInterval, maxInterval):
1515
for y in range(laser.gridHeight() - 1, -1, -1):
1616
laserRay = laser.ray(y, x)
1717

18-
mask = helper.generateMask(np.zeros((segmentator.getImage(0).shape[0], segmentator.getImage(0).shape[1]), np.uint8), camera.intrinsic(), laser.origin(), laserRay, minInterval, maxInterval, 2, 2)
18+
mask = helper.generateMask(np.zeros_like(maxima_image, dtype=np.uint8), camera.intrinsic(), laser.origin(), laserRay, minInterval, maxInterval, 2, 2)
1919
masked_maxima = maxima * mask
2020
masked_points = masked_maxima.nonzero()
2121

source/GUI/ImageViewerWidget.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import cv2
2+
from cropAndSubpixelPoints import PointViewer
23
from PyQt5.QtCore import Qt
34
from PyQt5.QtGui import QImage, QPixmap
45
from PyQt5.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget
@@ -11,14 +12,13 @@ def __init__(self, parent=None):
1112
self.base_layout = QHBoxLayout(self)
1213

1314
self.imageDICT = {}
15+
self.point_viewer = PointViewer(None, None)
1416

1517
self.addImageWidget("Main", (256, 512))
1618
self.base_layout.addWidget(QVLine())
1719
self.addImageWidget("Segmentation", (256, 512))
1820
self.base_layout.addWidget(QVLine())
19-
self.addImageWidget("Laserdots", (256, 512))
20-
self.base_layout.addWidget(QVLine())
21-
self.addImageWidget("Closed Vocal Folds", (256, 512))
21+
self.base_layout.addWidget(self.point_viewer)
2222

2323
def addImageWidget(self, title, size):
2424
widg = QWidget(self)
@@ -36,11 +36,12 @@ def addImageWidget(self, title, size):
3636
lay.addWidget(image_widg)
3737
self.base_layout.addWidget(widg)
3838

39-
def updateImages(self, a, b, c):
39+
def updateImages(self, a, b, current_frame):
4040
# We assume images to be in RGB Format
4141
self.updateImage(a, self.imageDICT["Main"])
4242
self.updateImage(b, self.imageDICT["Segmentation"])
43-
self.updateImage(c, self.imageDICT["Laserdots"])
43+
self.point_viewer.change_frame(current_frame)
44+
self.point_viewer.redraw()
4445

4546
def convertImage(self, image):
4647
# Check if Mono

source/GUI/MainMenuWidget.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def __init__(self, viewer_palette, parent=None):
6363
self.addButton("Triangulate")
6464
self.addButton("Dense Shape Estimation")
6565
self.addButton("Least Squares Optimization")
66+
self.addButton("Temporal Smoothing")
6667
self.base_layout.addWidget(QHLine())
6768
self.addButton("Automatic Reconstruction")
6869
self.addButton("Save Models")
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from typing import List
2+
3+
import numpy as np
4+
import zoomableVideo
5+
from PyQt5.QtGui import QBrush, QColor, QImage, QPen
6+
from PyQt5.QtWidgets import QGraphicsEllipseItem, QMenu
7+
8+
9+
class PointViewer(zoomableVideo.ZoomableVideo):
10+
def __init__(
11+
self,
12+
video: List[QImage],
13+
points: np.array,
14+
parent=None,
15+
):
16+
super(PointViewer, self).__init__(video, parent)
17+
18+
self._pointpen = QPen(QColor(128, 255, 128, 255))
19+
self._pointbrush = QBrush(QColor(128, 255, 128, 128))
20+
21+
self._pointsize: int = 3
22+
23+
self._point_items: List[QGraphicsEllipseItem] = []
24+
25+
if video is not None:
26+
self._image_width = video[0].width()
27+
self._image_height = video[0].height()
28+
29+
self.point_positions = points
30+
31+
def add_points(self, points: np.array) -> None:
32+
# Points should be in FRAMES x NUM_POINTS x 2 in [Y, X]
33+
self.point_positions = points
34+
35+
def contextMenuEvent(self, event) -> None:
36+
"""
37+
Opens a context menu with options for zooming in and out.
38+
39+
:param event: The QContextMenuEvent containing information about the context menu event.
40+
:type event: QContextMenuEvent
41+
"""
42+
menu = QMenu()
43+
menu.addAction("Zoom in MouseWheel Up", self.zoomIn)
44+
menu.addAction("Zoom out MouseWheel Down", self.zoomOut)
45+
menu.addAction("Reset View", self.zoomReset)
46+
menu.addAction("Fit View", self.fit_view)
47+
menu.exec_(event.globalPos())
48+
49+
def redraw(self) -> None:
50+
if self.images is not None:
51+
self.set_image(self.images[self._current_frame])
52+
53+
if self.point_positions is None:
54+
return
55+
56+
for point_item in self._point_items:
57+
self.scene().removeItem(point_item)
58+
self._point_items = []
59+
60+
# Get current frame indices:
61+
points = self.point_positions[self._current_frame]
62+
for point in points:
63+
if (point == np.nan).any():
64+
return
65+
66+
ellipse_item = self.scene().addEllipse(
67+
point[1] - self._pointsize / 2,
68+
point[0] - self._pointsize / 2,
69+
self._pointsize,
70+
self._pointsize,
71+
self._pointpen,
72+
self._pointbrush,
73+
)
74+
self._point_items.append(ellipse_item)
75+
76+
def keyPressEvent(self, event) -> None:
77+
self.change_frame(self._current_frame + 1)
78+
self.fit_view()

source/GUI/zoomable.py

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
from PyQt5.QtCore import Qt
2+
from PyQt5.QtGui import QImage, QPixmap, QTransform
3+
from PyQt5.QtWidgets import QGraphicsPixmapItem, QGraphicsScene, QGraphicsView, QMenu
4+
5+
6+
class Zoomable(QGraphicsView):
7+
"""
8+
A QGraphicsView widget that allows zooming in and out with the mouse wheel.
9+
10+
:param parent: The parent widget for the ZoomableViewWidget instance.
11+
:type parent: QWidget, optional
12+
13+
Attributes:
14+
_zoom (float): The current zoom level of the view.
15+
16+
Methods:
17+
wheelEvent(event):
18+
Handles mouse wheel events to zoom in or out based on scroll direction.
19+
20+
contextMenuEvent(event):
21+
Opens a context menu with options for zooming in and out.
22+
23+
zoomIn():
24+
Increases the zoom level by a factor of zoom_speed.
25+
26+
zoomOut():
27+
Decreases the zoom level by a factor of zoom_speed.
28+
29+
zoomReset():
30+
Resets the zoom level to 1.
31+
32+
zoom() -> float:
33+
Returns the current zoom level.
34+
35+
updateView():
36+
Updates the view transformation based on the current zoom level.
37+
"""
38+
39+
def __init__(self, parent=None):
40+
"""
41+
Initializes the ZoomableViewWidget with an optional parent.
42+
43+
:param parent: The parent widget for the ZoomableViewWidget instance.
44+
:type parent: QWidget, optional
45+
"""
46+
super(Zoomable, self).__init__(parent)
47+
self._zoom: float = 1.0
48+
self._zoom_speed: float = 1.1
49+
self._image_pointer: QGraphicsPixmapItem = None
50+
self.setDragMode(QGraphicsView.ScrollHandDrag)
51+
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
52+
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
53+
54+
scene = QGraphicsScene(self)
55+
self.setScene(scene)
56+
57+
def wheelEvent(self, event) -> None:
58+
"""
59+
Handles mouse wheel events to adjust the zoom level.
60+
61+
:param event: The QWheelEvent containing information about the mouse wheel event.
62+
:type event: QWheelEvent
63+
"""
64+
mouse = event.angleDelta().y() / 120
65+
66+
if mouse > 0:
67+
self.zoomIn()
68+
else:
69+
self.zoomOut()
70+
71+
def contextMenuEvent(self, event) -> None:
72+
"""
73+
Opens a context menu with options for zooming in and out.
74+
75+
:param event: The QContextMenuEvent containing information about the context menu event.
76+
:type event: QContextMenuEvent
77+
"""
78+
menu = QMenu()
79+
menu.addAction("Zoom in\tMouseWheel Up", self.zoomIn)
80+
menu.addAction("Zoom out\tMouseWheel Down", self.zoomOut)
81+
menu.addAction("Reset Zoom", self.zoomReset)
82+
menu.exec_(event.globalPos())
83+
84+
def zoomIn(self) -> None:
85+
"""
86+
Increases the zoom level by a factor of self._zoom_speed.
87+
"""
88+
self._zoom *= self._zoom_speed
89+
self.update_view()
90+
91+
def zoomOut(self) -> None:
92+
"""
93+
Decreases the zoom level by a factor of self._zoom_speed.
94+
"""
95+
self._zoom /= self._zoom_speed
96+
self.update_view()
97+
98+
def zoomReset(self) -> None:
99+
"""
100+
Resets the zoom level to 1.
101+
"""
102+
self._zoom = 1
103+
self.update_view()
104+
self.fit_view()
105+
106+
def zoom(self) -> float:
107+
"""
108+
Returns the current zoom level.
109+
110+
:return: The current zoom level.
111+
:rtype: float
112+
"""
113+
return self._zoom
114+
115+
def zoom_speed(self) -> float:
116+
"""
117+
Returns the current zoom speed.
118+
119+
:return: The current zoom level.
120+
:rtype: float
121+
"""
122+
return self._zoom_speed
123+
124+
def set_zoom_speed(self, zoom_speed: float) -> None:
125+
"""
126+
Set the zoom speed.
127+
"""
128+
self._zoom_speed = zoom_speed
129+
130+
def update_view(self) -> None:
131+
"""
132+
Updates the view transformation based on the current zoom level.
133+
"""
134+
self.setTransform(QTransform().scale(self._zoom, self._zoom))
135+
136+
def set_image(self, image: QImage) -> None:
137+
"""
138+
Update the shown image.
139+
"""
140+
141+
if self.scene().items():
142+
self.scene().removeItem(self._image_pointer)
143+
144+
pixmap = QPixmap(image)
145+
self._image_pointer = self.scene().addPixmap(pixmap)
146+
147+
def fit_view(self) -> None:
148+
self.fitInView(self.scene().sceneRect(), Qt.KeepAspectRatio)
149+
self._zoom = self.transform().m11()

source/GUI/zoomableVideo.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from typing import List
2+
3+
import zoomable
4+
from PyQt5 import QtCore
5+
from PyQt5.QtGui import QImage
6+
from PyQt5.QtWidgets import QMenu
7+
8+
9+
class ZoomableVideo(zoomable.Zoomable):
10+
11+
signal_increment_frame = QtCore.pyqtSignal(bool)
12+
signal_decrement_frame = QtCore.pyqtSignal(bool)
13+
14+
def __init__(
15+
self,
16+
images: List[QImage] = None,
17+
parent=None,
18+
):
19+
super(ZoomableVideo, self).__init__(parent)
20+
self.images = images
21+
22+
if self.images:
23+
self.set_image(self.images[0])
24+
25+
self._current_frame: int = 0
26+
self._num_frames: int = len(self.images) if self.images else 0
27+
28+
def redraw(self) -> None:
29+
if self.images:
30+
self.set_image(self.images[self._current_frame])
31+
32+
def change_frame(self, frame: int) -> None:
33+
if frame < 0 or frame >= self._num_frames:
34+
return
35+
36+
self._current_frame = frame
37+
self.redraw()
38+
39+
def add_video(self, video: List[QImage]) -> None:
40+
self.images = video
41+
self._num_frames = len(self.images)
42+
self._image_width = video[0].width()
43+
self._image_height = video[0].height()
44+
45+
def contextMenuEvent(self, event) -> None:
46+
"""
47+
Opens a context menu with options for zooming in and out.
48+
49+
:param event: The QContextMenuEvent containing information about the context menu event.
50+
:type event: QContextMenuEvent
51+
"""
52+
menu = QMenu()
53+
menu.addAction("Zoom in\tMouseWheel Up", self.zoomIn)
54+
menu.addAction("Zoom out\tMouseWheel Down", self.zoomOut)
55+
menu.addAction("Frame forward\tRight Arrow", self.frame_forward)
56+
menu.addAction("Frame backward\tLeft Arrow", self.frame_backward)
57+
menu.addAction("Reset Zoom", self.zoomReset)
58+
menu.exec_(event.globalPos())
59+
60+
def frame_forward(self):
61+
if self._current_frame + 1 < 0 or self._current_frame + 1 >= self._num_frames:
62+
return
63+
self.change_frame(self._current_frame + 1)
64+
self.signal_increment_frame.emit(True)
65+
66+
def frame_backward(self):
67+
if self._current_frame - 1 < 0 or self._current_frame - 1 >= self._num_frames:
68+
return
69+
self.change_frame(self._current_frame - 1)
70+
self.signal_decrement_frame.emit(True)
71+
72+
def resizeEvent(self, event):
73+
super().resizeEvent(event)
74+
self.fit_view()
75+
76+
def keyPressEvent(self, event):
77+
if event.key() == QtCore.Qt.Key_Right:
78+
self.frame_forward()
79+
elif event.key() == QtCore.Qt.Key_Left:
80+
self.frame_backward()

0 commit comments

Comments
 (0)