# Μετατρέψτε την εικόνα σε κλίμακα του γκρι
γκρι = cv2.cvtColor (εικόνα, cv2.COLOR_BGR2GRAY)
# Αποκτήστε το λεξικό Aruco με βάση το μέγεθος του δείκτη και τους συνολικούς δείκτες
λεξικό_κλειδί = 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 (γκρι, aruco_dictionary,
παράμετροι=aruco_params)
video_width, video_height):
frame_height, frame_width = video_frame.shape[:2]
αν len (aruco_markers[0]) != 0:
Για i, marker_corner σε απαρίθμηση (aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).atype (np.int32)
# Σχεδιάστε ένα πολύγωνο γύρω από τις γωνίες του δείκτη
cv2.polylines (video_frame, [marker_corners], Αληθής, (0, 255, 0), 2)
# Προσθήκη αναγνωριστικού δείκτη ως κείμενο στην επάνω αριστερή γωνία του δείκτη
cv2.putText (video_frame, str (aruco_markers[1][Εγώ]),
πλειάδα (marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)
# Βρείτε τη μήτρα ομογραφίας για να αντιστοιχίσετε την εικόνα επικάλυψης στον δείκτη
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [πλάτος_βίντεο, 0], [πλάτος_βίντεο, ύψος_βίντεο],
[0, ύψος_βίντεο]], dtype="float32"), marker_corners)
# Στρεβλώστε την εικόνα επικάλυψης για να ευθυγραμμιστεί με το δείκτη χρησιμοποιώντας μήτρα ομογραφίας
warped_image = cv2.warpPerspective (overlay_image, homography_matrix,
(πλαίσιο_πλάτος, κάδρο_ύψος))
# Δημιουργήστε μια μάσκα για να εφαρμόσετε την παραμορφωμένη εικόνα μόνο στην περιοχή του δείκτη
mask = np.zeros((ύψος_πλαισίου, πλάτος_πλαισίου), dtype="uint8")
cv2.fillConvexPoly (μάσκα, 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)
# Ορίστε τις διαστάσεις της ροής βίντεο
βίντεο_ύψος = 480
πλάτος_βίντεο = 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,
overlay_image, video_width,
βίντεο_ύψος)
# Εμφάνιση του καρέ βίντεο με επικάλυψη
cv2.imshow("Τροφοδοσία κάμερας", video_frame)
# Ελέγξτε εάν πατήστε το πλήκτρο 'q' για έξοδο από τον βρόχο
αν cv2.waitKey(1) & 0xFF == Ord('q'):
Διακοπή