Page 1 of 1

3D -Objekt ist auf der Ausgabe nicht sichtbar

Posted: 02 Feb 2025, 19:52
by Anonymous
Ich erstelle eine erweiterte Reality -Anwendung in Python, in der ich verwende: < /p>

[*] opencv < /strong> Für die Kamera -Kalibrierung (Schachbrettbilder) und löschen > trimesh zum Laden eines 3D -Modells (OBJ) - Es ist ein Automodell mit Polygonen, nicht nur Kanten.
[*] (möglicherweise) Pyrender oder eine Form des OpenGL -Renders, um das vollständige 3D -Modell zu überlagern.
Was funktioniert : >

[*] Ich kann R_VEC, T_VEC < /code> von Solvepnp < /code> erfolgreich berechnen (keine Fehler). < /li>
Ich kann Zeichnen Sie einen Wireframe mit CV2.ProjectPoints (...) auf den Videorahmen. Ich sehe die grünen Linien, also weiß ich, dass die projizierten 2D -Koordinaten korrekt und innerhalb der Bildgrenzen sind.
Was funktioniert nicht : < /p>

Das tatsächliche 3D -Modell (eines Autos) erscheint im endgültigen Video nicht < /strong>.

Mit anderen Worten, ich möchte ein solides oder schattiertes 3D -Objekt sehen, aber alles, was ich bekomme, sind nur die Wireframe -Linien (von Projektpunkten) oder gar nichts. < /Li>
< /ul>
Relevanter Code-Snippet
(vereinfacht):

Code: Select all

def process_video_with_moving_car(
template_img_path, video_input_path, video_output_path,
camera_matrix, dist_coeffs, square_size, obj_file_path
):
sift = cv2.SIFT_create()
template_img = cv2.imread(template_img_path, cv2.IMREAD_GRAYSCALE)
template_kp, template_des = sift.detectAndCompute(template_img, None)

cap = cv2.VideoCapture(video_input_path)
if not cap.isOpened():
print("Error: Could not open video file.")
return

frame_width  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter(video_output_path, fourcc, fps, (frame_width, frame_height))

bf = cv2.BFMatcher()

# Load 3D model
vertices_3d, faces = load_obj_as_mesh(obj_file_path, desired_size=square_size)

while True:
ret, frame = cap.read()
if not ret:
break

gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame_kp, frame_des = sift.detectAndCompute(gray_frame, None)

if frame_des is None or len(frame_des) < 2:
out.write(frame)
continue

matches = bf.knnMatch(template_des, frame_des, k=2)
good_matches = [m for m, n in matches if m.distance < 0.5 * n.distance]

if len(good_matches) > 10:
src_pts = np.float32([template_kp[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([frame_kp[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
if H is not None:
retval, r_vec, t_vec = cv2.solvePnP(
np.array([[x, y, 0] for x, y in src_pts[:, 0]], dtype=np.float32),
dst_pts.reshape(-1, 2),
camera_matrix,
dist_coeffs,
flags=cv2.SOLVEPNP_ITERATIVE
)

if retval:
projected_pts, _ = cv2.projectPoints(vertices_3d, r_vec, t_vec, camera_matrix, dist_coeffs)

# The wireframe appears correctly
frame = draw_wireframe(frame, projected_pts.reshape(-1, 2), faces, color=(0, 255, 0), thickness=2)

out.write(frame)

cap.release()
out.release()
cv2.destroyAllWindows()
print("Processing complete. Output saved to:", video_output_path)

# End result: no real "solid" object, only the 2D wireframe from projectPoints