خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه با OpenCV تجربیات واقعیت افزوده همهجانبه ایجاد کنیم

واقعیت افزوده می تواند هر چیزی را از حواس پرتی سرگرم کننده تا مدل سازی جدی در دنیای واقعی ارائه دهد، اما شما باید با اصول اولیه شروع کنید.

واقعیت افزوده (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')

می توانید از روش های دیگری برای به دست آوردن یک تصویر همپوشانی استفاده کنید، مانند تولید یک مدل سه بعدی به صورت پویا.

مطلب مرتبط:   5 فریمورک WebAssembly برای برنامه بعدی شما

تشخیص نشانگرهای ArUco

پس از انتخاب تصویر همپوشانی، باید موقعیتی را در فید ویدیوی خود تعیین کنید که در آن تصویر را روی هم قرار دهید. این همان جایی است که نشانگرهای 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 شناسایی شده در قاب ویدیو تراز می کند.

مطلب مرتبط:   نحوه استفاده از دسکتاپ GitHub در مک

سپس باید تصویر روکش را بر اساس هموگرافی تاب دهید. سپس یک ماسک برای تعریف ناحیه پوشش ایجاد کنید و در نهایت تصویر پوشش ماسک شده را با فریم ویدیو ترکیب کنید.

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()

این تابع، فریم ویدیوی حاصل را نشان می‌دهد و توهم ظاهر شدن اشیاء مجازی در دنیای واقعی را ایجاد می‌کند.

مطلب مرتبط:   SonarQube چیست؟ 5 ویژگی کلیدی برای برنامه نویسان

برای اجرای برنامه، تابع processVideoFeed را اجرا کنید.

# Start processing the video feed
processVideoFeed(overlay_image)

در این ویدیو می توانید نمونه خروجی برنامه را مشاهده کنید:

نشانگر موجود در فید ویدیوی شما باید همان اندازه نشانگر و ویژگی های کل نشانگر را داشته باشد که در کد مشخص کرده اید.

واقعیت افزوده در کجا اعمال می شود؟

صنایع و زمینه های مختلف از واقعیت افزوده برای افزایش تجربه مشتری استفاده می کنند. برنامه های کاربردی واقعیت افزوده مورد استفاده در این صنایع به مشتریان این امکان را می دهد تا نحوه ظاهر محصولات را در دنیای واقعی تجسم کنند.

با این نوع برنامه ها آشنا شوید تا فناوری را در عمل ببینید.