لوگو دیاتوسعه
برنامه نویسی به سبک حرفه ای
نمایش عینک بر روی صورت از طریق وبکم Live

نمایش عینک بر روی صورت از طریق وبکم Live

مقدمه

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

با استفاده از این روش، مشکلاتی مانند ناسازگاری طرح عینک با صورت فرد، مشکل در اندازه‌گیری دقیق عینک و حتی نگرانی از خرید نادرست عینک از طریق اینترنت، به حداقل می‌رسد. همچنین، این روش به فروشندگان عینک این امکان را می‌دهد تا مدل‌های مختلفی را برای مشتریان خود به نمایش بگذارند و تجربه خرید آنلاین را برای آن‌ها بهبود بخشند.

برای تشخیص چهره و قرار دادن عینک بر روی صورت با استفاده از دوربین وبکم در پایتون، میتوانید از کتابخانهٔ OpenCV و dlib استفاده کنید. این کتابخانه‌ها در عملیات تشخیص چهره بسیار قدرتمند هستند.

مرحله اول : نصب پیش نیاز ها

قبل از همه، ابتدا پایتون و پیش‌نیازها (کتابخانهٔ OpenCV و dlib) را نصب کنید:

				
					
pip install opencv-python
pip install dlib

مرحله دوم : افزودن کتابخانه ها به برنامه

این برنامه از یک کتابخانه ساده برای تشخیص چهره و نمایش عینک بر روی چهره استفاده می کند. ابتدا باید کتابخانه های مورد نیاز را وارد کنید:

				
					
import cv2
import dlib

مرحله سوم : تعریف توابع

سپس دو تابع را تعریف می کنیم. تابع اول برای تشخیص چهره ها استفاده می شود:

				
					
def detect_faces(image):
    face_detector = dlib.get_frontal_face_detector()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_detector(gray)
    return faces

از تابع dlib.get_frontal_face_detector() برای تشخیص چهره در تصویر استفاده می کنیم. تصویر ورودی را به تصویر خاکستری تبدیل می کنیم و سپس تشخیص چهره ها را انجام می دهیم. نتیجهٔ تشخیص چهره ها به عنوان یک لیست از مستطیل ها برگردانده می شود.

تابع دوم هم برای قرار دادن عینک بر روی چهره استفاده می شود:

				
					
def draw_glasses(image, face):
    left_eye = (face.left(), face.top() + face.height() // 3)
    right_eye = (face.right(), face.top() + face.height() // 3)

    glasses = cv2.imread('glasses.png', cv2.IMREAD_UNCHANGED)
    eyewidth = int(abs(right_eye[0] - left_eye[0]) * 1.2)
    glasses = cv2.resize(glasses, (eyewidth, glasses.shape[0]))

    x1 = left_eye[0] - eyewidth // 4
    x2 = right_eye[0] + eyewidth // 4
    y1 = left_eye[1] - eyewidth // 12
    y2 = y1 + glasses.shape[0]

    for c in range(3):
        image[y1:y2, x1:x2, c] = (1.0 - glasses[:, :, 3] / 255.0) * image[y1:y2, x1:x2, c] + \
                                  (glasses[:, :, c] / 255.0) * image[y1:y2, x1:x2, c]

    return image

مرحله چهارم: محسابه مختصات چشم و قرار دادن عینک

ابتدا مختصات دو چشم روی صورت را محاسبه می کنیم. سپس تصویر عینک را بارگیری می کنیم. اندازهٔ عینک را بر اساس فاصلهٔ بین دو چشم محاسبه می کنیم و سپس تصویر عینک را به اندازهٔ مناسب تغییر اندازه می دهیم.

سپس، مختصات برای قرار دادن عینک روی صورت را محاسبه می کنیم. در اینجا، یک برهمکنش بین تصویر اصلی و تصویر عینک انجام می دهیم تا نرمال کردن آن را انجام دهیم و سپس عینک را روی تصویر اصلی قرار می دهیم.

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

				
					
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()

    faces = detect_faces(frame)

    for face in faces:
        frame = draw_glasses(frame, face)

    cv2.imshow('Frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

در نهایت، وقتی که از حلقه خارج می شویم، منابع را آزاد می کنیم و پنجره ها را ببندیم.

 

مواردی که باید مورد توجه قرار گیرند:

1- برای تشخیص چهره از کدگذاری هاگ استفاده می کنیم که تغییرات شدیدی در تصویر می کند. بنابراین، ممکن است نتایج بهینه نباشد.

2- تصویر عینک glasses.png باید در همان پوشه وجود داشته باشد.

3- این برنامه یک مثال ساده برای استفاده از تشخیص چهره و نمایش عینک بر روی صورت ها است. شما می توانید با تغییرات بیشتر و استفاده از روش های پیشرفته تر، برنامه را بهبود دهید.

کد نهایی

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

				
					
import cv2
import dlib

# تشخیص چهره
def detect_faces(image):
    face_detector = dlib.get_frontal_face_detector()
    # تبدیل تصویر به کدگذاری هاگ
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = face_detector(gray)
    return faces

# رسم عینک بر روی چهره
def draw_glasses(image, face):
    # محاسبه مختصات روی صورت
    left_eye = (face.left(), face.top() + face.height() // 3)
    right_eye = (face.right(), face.top() + face.height() // 3)

    # بارگیری تصویر عینک
    glasses = cv2.imread('glasses.png', cv2.IMREAD_UNCHANGED)

    # تغییر اندازهٔ عینک بر اساس مختصات دو چشم
    eyewidth = int(abs(right_eye[0] - left_eye[0]) * 1.2)
    glasses = cv2.resize(glasses, (eyewidth, glasses.shape[0]))

    # محاسبه مختصات برای قرار دادن عینک بر روی صورت
    x1 = left_eye[0] - eyewidth // 4
    x2 = right_eye[0] + eyewidth // 4
    y1 = left_eye[1] - eyewidth // 12
    y2 = y1 + glasses.shape[0]

    # قرار دادن عینک بر روی تصویر اصلی
    for c in range(3):
        image[y1:y2, x1:x2, c] = (1.0 - glasses[:, :, 3] / 255.0) * image[y1:y2, x1:x2, c] + \
                                  (glasses[:, :, c] / 255.0) * image[y1:y2, x1:x2, c]

    return image


# اتصال به دوربین وبکم
cap = cv2.VideoCapture(0)

while True:
    # خواندن ویدیو از دوربین
    ret, frame = cap.read()

    # تشخیص چهره‌ها در فریم
    faces = detect_faces(frame)

    # رسم عینک بر روی صورت ها
    for face in faces:
        frame = draw_glasses(frame, face)

    # نمایش تصویر در پنجره
    cv2.imshow('Frame', frame)

    # برای خروج از حلقه به مقدار 'q' کلیدی را بزنید
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# آزادسازی منابع
cap.release()
cv2.destroyAllWindows()

برای این کد، شما نیاز به تصویر عینکی با پسوند PNG با پس زمینه‌ای شفاف (transparent) خواهید داشت.

این تصویر را در سرور یا هارد کامپیوتر شخصی خود قرار دهید و نام آن را glasses.png قرار دهید.

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

برای خروج از برنامه، میتوانید کلید q را فشار دهید.