# המר את התמונה לגווני אפור
אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
# קבל את מילון Aruco המבוסס על גודל הסמן וסה"כ הסמנים
dictionary_key = getattr (cv2.aruco, f'DICT_{markerSize}איקס'
ו'{markerSize}_{totalMarkers}')
aruco_dictionary = cv2.aruco.getPredefinedDictionary (מפתח_מילון)
# הגדר את הפרמטרים של גלאי Aruco
aruco_params = cv2.aruco. DetectorParameters()
# זיהוי סמני Aruco בתמונה בגווני אפור
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers (אפור, מילון_ארקו,
parameters=aruco_params)
video_width, video_height):
frame_height, frame_width = video_frame.shape[:2]
אם len (aruco_markers[0]) != 0:
ל i, marker_corner ב enumerate (סמנים_aruco[0]):
marker_corners = marker_corner.reshape((4, 2)).astype (np.int32)
# צייר מצולע סביב פינות הסמן
cv2.polylines (video_frame, [marker_corners], נָכוֹן, (0, 255, 0), 2)
# הוסף מזהה סמן כטקסט בפינה השמאלית העליונה של הסמן
cv2.putText (video_frame, str (aruco_markers[1][אני]),
tuple (סמן_פינות[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)
# מצא את מטריצת ההומוגרפיה כדי למפות את תמונת שכבת העל על הסמן
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [רוחב_וידאו, 0], [video_width, video_height],
[0, video_height]], dtype="float32"), סמן_פינות)
# עיוות את תמונת השכבה כדי ליישר את הסמן באמצעות מטריצת הומוגרפיה
warped_image = cv2.warpPerspective (תמונה_על, homography_matrix,
(רוחב_מסגרת, גובה_מסגרת))
# צור מסכה כדי להחיל את התמונה המעוותת רק על אזור הסמן
mask = np.zeros((frame_height, frame_width), dtype="uint8")
cv2.fillConvexPoly (mask, marker_corners, (255, 255, 255), cv2.LINE_AA)
masked_warped_image = cv2.bitwise_and (warped_image, warped_image,
מסכה=מסכה)
# החל את המסכה ההפוכה על מסגרת הווידאו
masked_video_frame = cv2.bitwise_and (video_frame, video_frame,
mask=cv2.bitwise_not (מסכה))
# שלב את התמונה המעוותת המסוכה ומסגרת הווידאו המסוכה
video_frame = cv2.add (masked_warped_image, masked_video_frame)
# הגדר את מידות הזנת הווידאו
video_height = 480
video_width = 640
# פתח את לכידת הווידאו
video_capture = cv2.VideoCapture(0)
# טען ושנה את גודל תמונת השכבה
overlay_image = cv2.resize (overlay_image, (video_width, video_height))
בזמן video_capture.isOpened():
# קרא מסגרת מתוך לכידת הווידאו
ret, video_frame = video_capture.read()
אם לְהַשְׁרוֹת:
# מצא סמני Aruco במסגרת הווידאו
aruco_markers = findArucoMarkers (video_frame, totalMarkers=100)
# הצב את תמונת השכבה על הסמנים במסגרת הווידאו
video_frame = superimposeImageOnMarkers (video_frame, aruco_markers,
תמונת_על, רוחב_וידאו,
video_height)
# הצג את מסגרת הווידאו עם שכבת-על
cv2.imshow("עדכון מצלמה", video_frame)
# בדוק אם יש ללחוץ על מקש 'q' כדי לצאת מהלולאה
אם cv2.waitKey(1) & 0xFF == ord('q'):
לשבור