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):
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
Ich erstelle eine erweiterte Reality -Anwendung in Python, in der ich verwende: < /p>
[*] [b] opencv < /strong> Für die Kamera -Kalibrierung (Schachbrettbilder) und löschen > trimesh [/b] zum Laden eines 3D -Modells (OBJ) - Es ist ein Automodell mit Polygonen, nicht nur Kanten. [*] [b] (möglicherweise) [/b] Pyrender oder eine Form des OpenGL -Renders, um das vollständige 3D -Modell zu überlagern. [b] Was funktioniert [/b]: >
[*] 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. [b] Was funktioniert nicht [/b] : < /p>
Das tatsächliche 3D -Modell (eines Autos) [b] 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 [/b] (vereinfacht): [code]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
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)
Ich hatte viele Probleme mit dem Test Explorer in VSCode. Es hat bis letzte Woche gut funktioniert. Ich habe neue Tests geschrieben und auf „Tests aktualisieren“ geklickt, und dann hat es plötzlich...
In meinem React Native -Projekt erscheint der Marker nicht auf der Karte, aber sein Symbol nicht. Ich habe dem Marker auch eine Titeleigenschaft gegeben, zum Beispiel Titel = 'Test', ich habe nach...
Das in der docx-Datei angezeigte Bild ist im PDF nicht sichtbar, wenn es mit unoconv konvertiert wird, wo das Bild mit
angezeigt wird $document = new...
Ich habe dieses sehr seltsame Verhalten bei der Verwendung von pglite (PostgreSQL Version 16) in Firefox, wo ich ein UPDATE JOIN und dann ein SELECT ausführe, das beim ersten Mal nicht die durch das...
Der E-Mail-Client verfügt über einige Eigenschaften aus Sicherheitsgründen und die Position ist eine davon. Es funktioniert also lokal einwandfrei, wenn Sie Ihre HTML-Datei sehen, nicht wenn Sie sie...