Open3D - Speicherverbrauch Erhöhen Sie beim Anzeigen von Webcam -Stream
Posted: 17 Aug 2025, 23:15
Ich versuche, einen Webcam-Feed in einem Flugzeug in Open3D zu visualisieren (Testable Code unten). self.app.post_to_main_thread (self.vis, lambda: self.vis.modify_geometry_material (self.Geometries [0] ['name'], self.geometries [0] ['Material'])), die Textur ist entsprechend aktualisiert, aber es gibt eine Erhöhung der Memory. Ebene? < /p>
import open3d as o3d
import numpy as np
import cv2
import open3d.visualization.rendering as rendering
import open3d.visualization.gui as gui
import time
import threading
def create_video_plane(width, height):
# Vertices for a rectangle in the XY plane, centered at (0,0,0)
vertices = np.array([
[-width/2, -height/2, 0],
[ width/2, -height/2, 0],
[ width/2, height/2, 0],
[-width/2, height/2, 0]
])
triangles = np.array([
[0, 1, 2],
[2, 3, 0]
])
# UV coordinates for each vertex (must match vertices order)
uvs = np.array([
[0, 0], # vertex 0
[1, 0], # vertex 1
[1, 1], # vertex 2
[0, 1], # vertex 3
])
mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector(vertices)
mesh.triangles = o3d.utility.Vector3iVector(triangles)
mesh.triangle_uvs = o3d.utility.Vector2dVector([
[0, 0], [1, 0], [1, 1], # triangle 0
[1, 1], [0, 1], [0, 0] # triangle 1
])
mesh.compute_vertex_normals()
return mesh
class TestApp:
def __init__(self):
self.rgb_frame_width = 3840
self.rgb_frame_height = 2160
self.ratio = self.rgb_frame_width / self.rgb_frame_height
self.window_width = 1280
self.window_height = int(self.window_width / self.ratio)
self.app = o3d.visualization.gui.Application.instance
self.app.initialize()
self.vis = o3d.visualization.O3DVisualizer("Test")
self.app.add_window(self.vis)
self.frame = None
self.image_texture = o3d.geometry.Image(np.zeros((self.rgb_frame_height, self.rgb_frame_width, 3), dtype=np.uint8))
self.plane = create_video_plane(self.rgb_frame_width, self.rgb_frame_height)
self.plane.translate([0, 0, self.rgb_frame_width/100])
self.image_added = False
#VideoFrameSingleton().start(video_source=0, K=np.eye(3), dist_coeffs=np.zeros(5), fps=30, rgb_frame_width=self.rgb_frame_width, rgb_frame_height=self.rgb_frame_height)
self.cap = cv2.VideoCapture(0)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.rgb_frame_width)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.rgb_frame_height)
self.cap.set(cv2.CAP_PROP_FPS, 30)
self.cap.set(cv2.CAP_PROP_AUTOFOCUS, 0)
self.is_running = True
self._thread = threading.Thread(target=self.video_loop, daemon=True)
self._thread.start()
video_material = rendering.MaterialRecord()
video_material.shader = "defaultUnlit"
video_material.base_color = [1.0, 1.0, 1.0, 1.0]
video_material.albedo_img = self.image_texture
self.geometries = []
self.geometries.append({"name":"video_plane", "geometry":self.plane, "material":video_material})
threading.Thread(target=self.update_thread, daemon=True).start()
self.app.run()
def video_loop(self):
while self.is_running:
ret, frame = self.cap.read()
if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = np.ascontiguousarray(frame)
self.frame = frame # Store only the raw frame
time.sleep(1.0 / 30)
def update_thread(self):
while(self.frame is None):
time.sleep(0.1)
while(self.frame is not None):
self.geometries[0]['material'].albedo_img = o3d.geometry.Image(self.frame)
if not self.image_added:
self.vis.add_geometry(self.geometries[0]['name'], self.geometries[0]['geometry'], self.geometries[0]['material'])
self.image_added = True
else:
self.app.post_to_main_thread(self.vis, lambda: self.vis.modify_geometry_material(self.geometries[0]['name'], self.geometries[0]['material']))
#self.vis.modify_geometry_material(self.geometries[0]['name'], self.geometries[0]['material'])
time.sleep(1/20)
app = TestApp()
< /code>
Hat dies schon jemand schon in Open3D+OpenCV gemacht? (Ich konnte auch kein verfügbares Repo finden).
import open3d as o3d
import numpy as np
import cv2
import open3d.visualization.rendering as rendering
import open3d.visualization.gui as gui
import time
import threading
def create_video_plane(width, height):
# Vertices for a rectangle in the XY plane, centered at (0,0,0)
vertices = np.array([
[-width/2, -height/2, 0],
[ width/2, -height/2, 0],
[ width/2, height/2, 0],
[-width/2, height/2, 0]
])
triangles = np.array([
[0, 1, 2],
[2, 3, 0]
])
# UV coordinates for each vertex (must match vertices order)
uvs = np.array([
[0, 0], # vertex 0
[1, 0], # vertex 1
[1, 1], # vertex 2
[0, 1], # vertex 3
])
mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector(vertices)
mesh.triangles = o3d.utility.Vector3iVector(triangles)
mesh.triangle_uvs = o3d.utility.Vector2dVector([
[0, 0], [1, 0], [1, 1], # triangle 0
[1, 1], [0, 1], [0, 0] # triangle 1
])
mesh.compute_vertex_normals()
return mesh
class TestApp:
def __init__(self):
self.rgb_frame_width = 3840
self.rgb_frame_height = 2160
self.ratio = self.rgb_frame_width / self.rgb_frame_height
self.window_width = 1280
self.window_height = int(self.window_width / self.ratio)
self.app = o3d.visualization.gui.Application.instance
self.app.initialize()
self.vis = o3d.visualization.O3DVisualizer("Test")
self.app.add_window(self.vis)
self.frame = None
self.image_texture = o3d.geometry.Image(np.zeros((self.rgb_frame_height, self.rgb_frame_width, 3), dtype=np.uint8))
self.plane = create_video_plane(self.rgb_frame_width, self.rgb_frame_height)
self.plane.translate([0, 0, self.rgb_frame_width/100])
self.image_added = False
#VideoFrameSingleton().start(video_source=0, K=np.eye(3), dist_coeffs=np.zeros(5), fps=30, rgb_frame_width=self.rgb_frame_width, rgb_frame_height=self.rgb_frame_height)
self.cap = cv2.VideoCapture(0)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.rgb_frame_width)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.rgb_frame_height)
self.cap.set(cv2.CAP_PROP_FPS, 30)
self.cap.set(cv2.CAP_PROP_AUTOFOCUS, 0)
self.is_running = True
self._thread = threading.Thread(target=self.video_loop, daemon=True)
self._thread.start()
video_material = rendering.MaterialRecord()
video_material.shader = "defaultUnlit"
video_material.base_color = [1.0, 1.0, 1.0, 1.0]
video_material.albedo_img = self.image_texture
self.geometries = []
self.geometries.append({"name":"video_plane", "geometry":self.plane, "material":video_material})
threading.Thread(target=self.update_thread, daemon=True).start()
self.app.run()
def video_loop(self):
while self.is_running:
ret, frame = self.cap.read()
if ret:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = np.ascontiguousarray(frame)
self.frame = frame # Store only the raw frame
time.sleep(1.0 / 30)
def update_thread(self):
while(self.frame is None):
time.sleep(0.1)
while(self.frame is not None):
self.geometries[0]['material'].albedo_img = o3d.geometry.Image(self.frame)
if not self.image_added:
self.vis.add_geometry(self.geometries[0]['name'], self.geometries[0]['geometry'], self.geometries[0]['material'])
self.image_added = True
else:
self.app.post_to_main_thread(self.vis, lambda: self.vis.modify_geometry_material(self.geometries[0]['name'], self.geometries[0]['material']))
#self.vis.modify_geometry_material(self.geometries[0]['name'], self.geometries[0]['material'])
time.sleep(1/20)
app = TestApp()
< /code>
Hat dies schon jemand schon in Open3D+OpenCV gemacht? (Ich konnte auch kein verfügbares Repo finden).