Open3D - Speichernutzung Erhöhung bei der Anzeige des Webcam -Streams

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Open3D - Speichernutzung Erhöhung bei der Anzeige des Webcam -Streams

by Anonymous » 19 Aug 2025, 12:39

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'])) < /Code> Die Textur wird nach einem Anstieg der Erhöhung der Erhöhung des Gedächtnisses nach ein paar Minuten aktualisiert. 3D -Ebene? < /P>

Code: Select all

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()

Top