Проблемы при работе с Open3d, многопроцессорностью python и обнаружением функций
Недавно я начал работать с Intel Open3d, потому что он действительно хорошо обрабатывает трехмерную визуализацию (в отличие от https://matplotlib.org/, по моему опыту, и с меньшими накладными расходами, чем pangolin).
Я весь день сталкивался с этой ошеломляющей проблемой и понятия не имел, почему что-то не работает: в моем основном процессе я запускаю неблокирующий визуализатор open3d, а в отдельном процессе я выполняю некоторую обработку изображений с участием обнаружение функций (как ORB, так и SuperPoint), но функция обнаружения функций никогда не завершается.
Ниже приведен минимальный (нерабочий) пример:
import time
import multiprocessing as mp
import cv2
import open3d as o3d
import numpy as np
class Viewer:
def __init__(self, stop_flag):
self._stop_flag = stop_flag
self._vis = o3d.visualization.Visualizer()
self._vis.create_window()
def run(self):
while not stop_flag.is_set():
self._vis.update_geometry()
self._vis.poll_events()
self._vis.update_renderer()
self._vis.destroy_window()
def worker(stop_flag, num_iterations):
def _generate_img():
return np.random.randn(400, 400, 3).astype(np.float32)
def _do_work():
print("Processing image...")
orb = cv2.ORB.create()
orb.detect(_generate_img(), mask=None)
print("Finished processing")
for i in range(num_iterations):
_do_work()
time.sleep(0.5)
stop_flag.set()
if __name__ == "__main__":
stop_flag = mp.Event()
viewer = Viewer(stop_flag)
worker_p = mp.Process(target=worker, args=[stop_flag, 10])
worker_p.start()
viewer.run()
worker_p.join()
Однако процесс работает нормально, когда я меняю любого из трех вовлеченных игроков следующим образом:
- Переход от многопоточности к многопоточности
if __name__ == "__main__":
import threading
stop_flag = threading.Event()
viewer = Viewer(stop_flag)
worker_t = threading.Thread(target=worker, args=[stop_flag, 10])
worker_t.start()
viewer.run()
worker_t.join()
- Выполнение другой задачи обработки изображений, кроме обнаружения сфер или суперточек
def _do_work():
print("Processing image...")
for i in range(5):
np.fft.fft2(_generate_img())
print("Finished processing")
- Замена окна open3d на окно opencv
class Viewer:
def __init__(self, stop_flag):
self._stop_flag = stop_flag
def run(self):
while not stop_flag.is_set():
frame = np.random.randn(400, 400)
cv2.imshow("Frame", frame)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.destroyAllWindows()
cv2.waitKey(1)
Я знаю, что это супер-специфично, но любая помощь приветствуется!