deffind ArucoMarkers(תמונה, markerSize=6, totalMarkers=250):
# המר את התמונה לגווני אפור
אפור = 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)

defsuperimposeImageOnMarkers(video_frame, aruco_markers, overlay_image,
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)

# הוסף מזהה סמן כטקסט בפינה השמאלית העליונה של הסמן

instagram viewer

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)

defprocessVideoFeed(תמונת_על):
# הגדר את מידות הזנת הווידאו
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'):
לשבור