fixing interpolation error

This commit is contained in:
q
2025-08-22 18:01:10 +03:00
parent 195bddc0dd
commit 74db994d16

View File

@@ -315,6 +315,10 @@ class Marker:
cv2.circle(frame, (current["cx"], current["cy"]), 10, color, 1)
except (KeyError, IndexError, TypeError):
# print(self.get_interpolated_point(), self.nr)
pass
try:
if self.points_interpolation_enabled:
history = []
for p in range(max(1, int(self.nr - self.viewer_fps)), self.nr + 1):
@@ -324,7 +328,7 @@ class Marker:
cv2.polylines(frame, [history], False, COLOR_INTERP, 1)
except (KeyError, IndexError, TypeError):
print(self.get_interpolated_point(), self.nr)
# print(self.get_interpolated_point(), self.nr)
pass
try:
current = self.get_point()
@@ -333,8 +337,8 @@ class Marker:
except KeyError:
pass
except IndexError:
print(self.points[self.point_index])
print(self.nr)
# print(self.points[self.point_index])
# print(self.nr)
pass
def scan_point(self, direction):
@@ -493,9 +497,11 @@ class Marker:
prev_key = key
w = abs(last_p["x1"] - last_p["x0"])
h = abs(last_p["y1"] - last_p["y0"])
visibility = last_p["visible"]
else:
w = 50
h = 50
visibility = POINT_VISIBILITY[0]
if position == "tl":
self.points[self.point_index][self.nr] = {
@@ -503,7 +509,7 @@ class Marker:
"y0": y,
"x1": min(self.video_res[0] - 1, x + w),
"y1": min(self.video_res[1] - 1, y + h),
"visible": last_p["visible"],
"visible": visibility,
}
if position == "br":
self.points[self.point_index][self.nr] = {
@@ -511,7 +517,7 @@ class Marker:
"y0": max(0, y - h),
"x1": x,
"y1": y,
"visible": last_p["visible"],
"visible": visibility,
}
if position == "c":
self.points[self.point_index][self.nr] = {
@@ -519,7 +525,7 @@ class Marker:
"y0": max(0, int(y - h / 2)),
"x1": min(self.video_res[0] - 1, int(x + w / 2)),
"y1": min(self.video_res[1] - 1, int(y + h / 2)),
"visible": last_p["visible"],
"visible": visibility,
}
else:
@@ -528,13 +534,14 @@ class Marker:
current = self.points[self.point_index][self.nr]
w = abs(current["x1"] - current["x0"])
h = abs(current["y1"] - current["y0"])
self.points[self.point_index][self.nr] = {
self.points[self.point_index][self.nr].update(
{
"x0": max(0, int(x - w / 2)),
"y0": max(0, int(y - h / 2)),
"x1": min(self.video_res[0] - 1, int(x + w / 2)),
"y1": min(self.video_res[1] - 1, int(y + h / 2)),
"visible": current["visible"],
}
)
elif position == "tl":
self.points[self.point_index][self.nr]["x0"] = x
self.points[self.point_index][self.nr]["y0"] = y
@@ -554,7 +561,6 @@ class Marker:
self.points[self.point_index][self.nr]["y1"],
)
# self.interpolate_points()
self.points_interpolation_required[self.point_index] = True
def modify_point_wh(self):
@@ -620,7 +626,6 @@ class Marker:
if len(tracker_gui.points) > 0:
for nr in tracker_gui.points:
self.points[self.point_index][nr] = tracker_gui.points[nr]
# self.interpolate_points()
self.points_interpolation_required[self.point_index] = True
self.nr = max(tracker_gui.points) - 1
self.read_next = True
@@ -677,28 +682,22 @@ class World:
pre: before any keyframes
post: after any keyframes
"""
if self.points_interpolation_thread is None:
self.points_interpolation_thread = threading.Thread(target=self.interpolate_points_in_thread, args=())
self.points_interpolation_thread.start()
if not self.points_interpolation_thread.is_alive():
self.points_interpolation_thread = threading.Thread(target=self.interpolate_points_in_thread, args=())
self.points_interpolation_thread.start()
try:
if not point_index in self.points:
return
self.interpolate_thread_start()
if point_index is None:
point_index = self.point_index
self.points_interpolation_required[point_index] = False
def i_point(x0=None, y0=None, x1=None, y1=None, t=None, visible=None, age=None):
return {"x0": x0, "y0": y0, "x1": x1, "y1": y1, "type": t, "visible": visible, "age": age}
def point2array(p):
return [p["x0"], p["y0"], p["x1"], p["y1"]]
if not point_index in self.points:
return
self.points_interpolation_required[point_index] = False
if not point_index in self.points_interpolated:
self.points_interpolated[point_index] = {key: {} for key in range(self.frames)}
@@ -763,6 +762,28 @@ class World:
new_points[key]["age"] = age
self.points_interpolated[point_index] = new_points
except Exception as e:
print(f"Interpolation error: {e}")
def interpolate_thread_start(self):
if self.points_interpolation_thread is None:
self.points_interpolation_thread = threading.Thread(target=self.interpolate_points_in_thread, args=())
self.points_interpolation_thread.start()
return
if not self.points_interpolation_thread.is_alive():
self.points_interpolation_thread = threading.Thread(target=self.interpolate_points_in_thread, args=())
self.points_interpolation_thread.start()
return
def interpolate_thread_stop(self):
self.points_interpolation_thread_exit = True
for point_index in self.points_interpolation_required:
if self.points_interpolation_required[point_index]:
self.interpolate_points(point_index)
def interpolate_points_in_thread(self):
@@ -1319,7 +1340,8 @@ class World:
(255, 255, 255),
)
cv2.imshow("tsmark", frame_visu)
if self.points_interpolation_enabled:
self.interpolate_thread_start()
k2 = cv2.waitKey(0)
if k2 & 0xFF == ord("q") or k2 & 0xFF == 27:
self.point_click = 0
@@ -1440,7 +1462,7 @@ class World:
except Exception as e:
print(e)
self.points_interpolation_thread_exit = True
self.interpolate_thread_stop()
self.video_reader.release()
cv2.destroyAllWindows()
self.print_timestamps()