واقعیت افزوده می تواند هر چیزی را از حواس پرتی سرگرم کننده تا مدل سازی جدی در دنیای واقعی ارائه دهد، اما شما باید با اصول اولیه شروع کنید.
واقعیت افزوده (AR) واقعیت را با محتوای مجازی با همپوشانی اطلاعات دیجیتال در یک محیط دنیای واقعی ادغام می کند. در سالهای اخیر، پیشرفتها در بینایی کامپیوتری و پردازش تصویر، توسعه برنامههای AR را آسانتر کرده است.
OpenCV یک کتابخانه بینایی کامپیوتری منبع باز محبوب است. این ابزارها و الگوریتمهایی را ارائه میکند که به شما کمک میکند تجربیات AR قانعکنندهای ایجاد کنید. برای ایجاد برنامه AR شما یک تصویر طرح ریزی شده انتخاب می کنید، یک شی مکان نگهدار فیزیکی را شناسایی می کنید، سپس محتوای AR را پروژه و رندر می کنید.
تنظیم محیط
قبل از شروع کدنویسی، باید محیط توسعه خود را آماده کنید. با ایجاد یک محیط مجازی شروع کنید، سپس این دستور ترمینال را برای نصب NumPy و OpenCV اجرا کنید:
pip install opencv-contrib-python numpy
از OpenCV برای عملکرد بینایی کامپیوتر و NumPy برای محاسبه ماتریس هموگرافی بعداً در کد استفاده خواهید کرد.
اطمینان حاصل کنید که کتابخانه opencv-contrib-python و نه opencv-python را نصب کرده اید. دلیلش این است که opencv-python ماژول cv2.aruco را ندارد که برای ایجاد برنامه واقعیت افزوده به شدت به آن تکیه خواهید کرد.
کد منبع کامل در یک مخزن GitHub موجود است.
واردات کتابخانه های مورد نیاز
یک فایل پایتون جدید ایجاد کنید. در ابتدای اسکریپت، OpenCV و NumPy را وارد کنید:
import numpy as np
import cv2
وارد کردن این کتابخانه ها به شما امکان می دهد از توابع آنها در کد خود استفاده کنید.
انتخاب تصویر همپوشانی
هنگام رندر کردن اشیاء مجازی در صحنه AR، به تصویری نیاز دارید که برنامه روی نشانگرهای شناسایی شده نمایش دهد. تصویر همپوشانی را با استفاده از تابع cv2.imread بارگذاری کنید.
overlay_image = cv2.imread('your_overlay_image.jpg')
می توانید از روش های دیگری برای به دست آوردن یک تصویر همپوشانی استفاده کنید، مانند تولید یک مدل سه بعدی به صورت پویا.
تشخیص نشانگرهای ArUco
پس از انتخاب تصویر همپوشانی، باید موقعیتی را در فید ویدیوی خود تعیین کنید که در آن تصویر را روی هم قرار دهید. این همان جایی است که نشانگرهای ArUco وارد می شوند. آنها نشانگرهای مربعی با الگوی شناسه منحصر به فرد هستند که به راحتی توسط الگوریتم های بینایی رایانه قابل شناسایی هستند.
هنگامی که یک برنامه یک نشانگر را تشخیص میدهد، میتواند به عنوان مثال، یک تصویر را در جای خود نشان دهد. در زیر نمونه ای از نشانگر ArUco آورده شده است.
عملکردی ایجاد کنید که نشانگرهای ArUco را در فید ویدیوی شما شناسایی کند. این تابع باید فید ویدیو را به مقیاس خاکستری تبدیل کند. سپس فرهنگ لغت ArUco را بر اساس اندازه نشانگر و کل نشانگرها بدست آورید. در نهایت، باید نشانگرهای موجود در خوراک را شناسایی کند.
def findArucoMarkers(image, markerSize=6, totalMarkers=250):
# Convert the image to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Get the Aruco dictionary based on the marker size and total markers
dictionary_key = getattr(cv2.aruco, f'DICT_{markerSize}X'
f'{markerSize}_{totalMarkers}')
aruco_dictionary = cv2.aruco.getPredefinedDictionary(dictionary_key)
# Set the Aruco detector parameters
aruco_params = cv2.aruco.DetectorParameters()
# Detect Aruco markers in the grayscale image
marker_corners, marker_ids, _ = cv2.aruco.detectMarkers(gray, aruco_dictionary,
parameters=aruco_params)
return marker_corners, marker_ids
این تابع گوشه ها و شناسه های نشانگرهای شناسایی شده را برمی گرداند.
نمایش تصویر پوشش روی نشانگرها
هنگامی که نشانگرها را در قاب ویدیو شناسایی کردید، باید تصویر همپوشانی را روی آنها بفرستید. برای رسیدن به این هدف، تابعی بنویسید که ماتریس هموگرافی بین تصویر و فریم ویدئو را محاسبه کند. این برای ایجاد یک تبدیل هندسی است که تصویر همپوشانی را با نشانگر ArUco شناسایی شده در قاب ویدیو تراز می کند.
سپس باید تصویر روکش را بر اساس هموگرافی تاب دهید. سپس یک ماسک برای تعریف ناحیه پوشش ایجاد کنید و در نهایت تصویر پوشش ماسک شده را با فریم ویدیو ترکیب کنید.
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)
# Draw a polygon around the marker corners
cv2.polylines(video_frame, [marker_corners], True, (0, 255, 0), 2)
# Add marker ID as text on the top-left corner of the marker
cv2.putText(video_frame, str(aruco_markers[1][i]),
tuple(marker_corners[0]),
cv2.FONT_HERSHEY_SIMPLEX,0.5, (0, 255, 0), 2)
# Find the homography matrix to map the overlay image onto the marker
homography_matrix, _ = cv2.findHomography(
np.array([[0, 0], [video_width, 0], [video_width, video_height],
[0, video_height]], dtype="float32"), marker_corners)
# Warp the overlay image to align with the marker using homography matrix
warped_image = cv2.warpPerspective(overlay_image, homography_matrix,
(frame_width, frame_height))
# Create a mask to apply the warped image only on the marker area
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)
# Apply the inverse mask to the video frame
masked_video_frame = cv2.bitwise_and(video_frame, video_frame,
mask=cv2.bitwise_not(mask))
# Combine the masked warped image and masked video frame
video_frame = cv2.add(masked_warped_image, masked_video_frame)
return video_frame
این تابع، فریم ویدیو را با تصویر همپوشانی که بر روی نشانگرهای ArUco شناسایی شده قرار گرفته است، برمی گرداند.
ارائه محتوای AR
برای ارائه محتوای AR، تابعی ایجاد کنید که مراحل تشخیص نشانگر و نمایش تصویر را ترکیب می کند. این عملکرد باید به طور مداوم فریم های ویدیویی را ضبط کند و نشانگرهای ArUco را شناسایی کند. سپس باید تصویر همپوشانی را روی نشانگرها قرار دهد.
def processVideoFeed(overlay_image):
# Set the dimensions of the video feed
video_height = 480
video_width = 640
# Open the video capture
video_capture = cv2.VideoCapture(0)
# Load and resize the overlay image
overlay_image = cv2.resize(overlay_image, (video_width, video_height))
while video_capture.isOpened():
# Read a frame from the video capture
ret, video_frame = video_capture.read()
if ret:
# Find Aruco markers in the video frame
aruco_markers = findArucoMarkers(video_frame, totalMarkers=100)
# Superimpose the overlay image on the markers in the video frame
video_frame = superimposeImageOnMarkers(video_frame, aruco_markers,
overlay_image, video_width,
video_height)
# Display the video frame with overlay
cv2.imshow("Camera Feed", video_frame)
# Check for 'q' key press to exit the loop
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video_capture.release()
cv2.destroyAllWindows()
این تابع، فریم ویدیوی حاصل را نشان میدهد و توهم ظاهر شدن اشیاء مجازی در دنیای واقعی را ایجاد میکند.
برای اجرای برنامه، تابع processVideoFeed را اجرا کنید.
# Start processing the video feed
processVideoFeed(overlay_image)
در این ویدیو می توانید نمونه خروجی برنامه را مشاهده کنید:
نشانگر موجود در فید ویدیوی شما باید همان اندازه نشانگر و ویژگی های کل نشانگر را داشته باشد که در کد مشخص کرده اید.
واقعیت افزوده در کجا اعمال می شود؟
صنایع و زمینه های مختلف از واقعیت افزوده برای افزایش تجربه مشتری استفاده می کنند. برنامه های کاربردی واقعیت افزوده مورد استفاده در این صنایع به مشتریان این امکان را می دهد تا نحوه ظاهر محصولات را در دنیای واقعی تجسم کنند.
با این نوع برنامه ها آشنا شوید تا فناوری را در عمل ببینید.