Cách tạo trải nghiệm thực tế tăng cường nhập vai với OpenCV
Thực tế tăng cường (AR) hợp nhất thực tế với nội dung ảo bằng cách phủ thông tin kỹ thuật số lên môi trường thế giới thực. Trong những năm gần đây, những tiến bộ trong thị giác máy tính và xử lý hình ảnh đã giúp việc phát triển các ứng dụng AR trở nên dễ dàng hơn.
OpenCV là một thư viện thị giác máy tính nguồn mở phổ biến. Nó cung cấp các công cụ và thuật toán sẽ giúp bạn tạo ra trải nghiệm AR hấp dẫn. Để tạo chương trình AR, bạn sẽ chọn hình ảnh chiếu, phát hiện đối tượng giữ chỗ vật lý, sau đó chiếu và hiển thị nội dung AR.
Mục Lục
Thiết lập môi trường
Trước khi bắt đầu viết mã, bạn cần chuẩn bị môi trường phát triển của mình. Bắt đầu bằng cách tạo một môi trường ảo, sau đó chạy lệnh đầu cuối này để cài đặt NumPy và OpenCV:
pip install opencv-contrib-python numpy
Bạn sẽ sử dụng OpenCV cho chức năng thị giác máy tính và NumPy để tính toán ma trận homography sau này trong mã.
Đảm bảo bạn cài đặt opencv-contrib-python thư viện và không opencv-python. Điều này là do opencv-python không có cv2.aruco mô-đun mà bạn sẽ chủ yếu dựa vào để tạo chương trình thực tế tăng cường.
Nhập các thư viện cần thiết
Tạo một tệp Python mới. Khi bắt đầu tập lệnh, hãy nhập OpenCV và NumPy:
import numpy as np
import cv2
Nhập các thư viện này sẽ cho phép bạn sử dụng các chức năng của chúng trong mã của mình.
Chọn hình ảnh lớp phủ
Khi hiển thị các đối tượng ảo trong cảnh AR, bạn cần một hình ảnh mà ứng dụng sẽ chiếu lên các điểm đánh dấu được phát hiện. Tải hình ảnh lớp phủ bằng cách sử dụng cv2.imread chức năng.
overlay_image = cv2.imread('your_overlay_image.jpg')
Bạn có thể sử dụng các phương pháp khác để có được hình ảnh lớp phủ, chẳng hạn như tạo động mô hình 3D.
Phát hiện điểm đánh dấu ArUco
Sau khi chọn Hình ảnh lớp phủ, bạn cần xác định vị trí trong nguồn cấp dữ liệu video của mình để phủ hình ảnh. Đây là lúc các điểm đánh dấu ArUco xuất hiện. Chúng là các điểm đánh dấu hình vuông có mẫu ID duy nhất có thể dễ dàng phát hiện bằng thuật toán thị giác máy tính.
Khi một ứng dụng phát hiện điểm đánh dấu, chẳng hạn, ứng dụng có thể phản hồi bằng cách chiếu một hình ảnh vào vị trí của nó. Dưới đây là một ví dụ về điểm đánh dấu ArUco.
Tạo một chức năng sẽ phát hiện các điểm đánh dấu ArUco trong nguồn cấp dữ liệu video của bạn. Hàm này sẽ chuyển đổi nguồn cấp dữ liệu video thành thang độ xám. Sau đó lấy từ điển ArUco dựa trên kích thước điểm đánh dấu và tổng số điểm đánh dấu. Cuối cùng, nó sẽ phát hiện các điểm đánh dấu trong nguồn cấp dữ liệu.
def findArucoMarkers(image, markerSize=6, totalMarkers=250):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
dictionary_key = getattr(cv2.aruco, f'DICT_{markerSize}X'
f'{markerSize}_{totalMarkers}')
aruco_dictionary = cv2.aruco.getPredefinedDictionary(dictionary_key)
aruco_params = cv2.aruco.DetectorParameters()
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers(gray, aruco_dictionary,
parameters=aruco_params)
return marker_corners, marker_ids
Hàm trả về các góc và ID của các điểm đánh dấu được phát hiện.
Chiếu hình ảnh lớp phủ lên điểm đánh dấu
Khi bạn đã phát hiện ra các điểm đánh dấu trong khung hình video, bạn cần chiếu hình ảnh lớp phủ lên chúng. Để đạt được điều này, hãy viết một hàm tính toán ma trận đồng âm giữa hình ảnh và khung hình video. Điều này là để thiết lập một phép biến đổi hình học giúp căn chỉnh hình ảnh lớp phủ với điểm đánh dấu ArUco được phát hiện trong khung hình video.
Sau đó, bạn nên làm cong hình ảnh lớp phủ dựa trên bản đồ tương đồng. Sau đó, tạo mặt nạ để xác định vùng của lớp phủ và cuối cùng trộn hình ảnh lớp phủ có mặt nạ với khung hình video.
def superimposeImageOnMarkers(video_frame, aruco_markers, overlay_image,
video_width, video_height):
frame_height, frame_width = video_frame.shape[:2] if len(aruco_markers[0]) != 0:
for i, marker_corner in enumerate(aruco_markers[0]):
marker_corners = marker_corner.reshape((4, 2)).astype(np.int32)
cv2.polylines(video_frame, [marker_corners], True, (0, 255, 0), 2)
cv2.putText(video_frame, str(aruco_markers[1][i]),
tuple(marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [video_width, 0], [video_width, video_height],
[0, video_height]], dtype="float32"), marker_corners)
warped_image = cv2.warpPerspective(overlay_image, homography_matrix,
(frame_width, frame_height))
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,
mask=mask)
masked_video_frame = cv2.bitwise_and(video_frame, video_frame,
mask=cv2.bitwise_not(mask))
video_frame = cv2.add(masked_warped_image, masked_video_frame)
return video_frame
Hàm trả về khung hình video với hình ảnh lớp phủ được đặt chồng lên các điểm đánh dấu ArUco được phát hiện.
Kết xuất nội dung AR
Để hiển thị nội dung AR, hãy tạo một chức năng kết hợp các bước phát hiện điểm đánh dấu và chiếu hình ảnh. Chức năng này sẽ liên tục chụp các khung hình video và phát hiện các điểm đánh dấu ArUco. Sau đó, nó sẽ chồng hình ảnh lớp phủ lên các điểm đánh dấu.
def processVideoFeed(overlay_image):
video_height = 480
video_width = 640
video_capture = cv2.VideoCapture(0)
overlay_image = cv2.resize(overlay_image, (video_width, video_height))
while video_capture.isOpened():
ret, video_frame = video_capture.read()
if ret:
aruco_markers = findArucoMarkers(video_frame, totalMarkers=100)
video_frame = superimposeImageOnMarkers(video_frame, aruco_markers,
overlay_image, video_width,
video_height)
cv2.imshow("Camera Feed", video_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
Chức năng hiển thị khung hình video thu được, tạo ảo giác các đối tượng ảo xuất hiện trong thế giới thực.
Để chạy chương trình, thực hiện lệnh quy trìnhVideoFeed chức năng.
processVideoFeed(overlay_image)
Bạn có thể xem đầu ra ví dụ từ chương trình trong video này:
Điểm đánh dấu trong nguồn cấp dữ liệu video của bạn phải có cùng kích thước điểm đánh dấu và tổng thuộc tính điểm đánh dấu như những điểm bạn đã chỉ định trong mã.
Thực tế Augmented được áp dụng ở đâu?
Các ngành và lĩnh vực khác nhau sử dụng thực tế tăng cường để nâng cao trải nghiệm của khách hàng. Các ứng dụng AR được sử dụng trong các ngành này cho phép khách hàng hình dung sản phẩm trông như thế nào trong thế giới thực.
Làm quen với loại ứng dụng này để xem công nghệ đang hoạt động.