نمایش عینک به صورت زنده از طریق وبکم، فرایندی است که به کاربران اجازه میدهد تا از طریق دوربین وبکم خود، عینک مورد نظر خود را روی صورت خود نمایش دهند. این فناوری میتواند در زمینههای مختلف از جمله خرید آنلاین عینک، نمایش مدلهای جدید عینک برای مشتریان، تبلیغات تعاملی و حتی در صنعت بازیهای ویدئویی استفاده شود. با استفاده از این فناوری، کاربران قادر خواهند بود تا عینک مد نظر خود را بر روی صورت خود زنده مشاهده کرده و قبل از خرید به آن اطمینان حاصل کنند.
با استفاده از این روش، مشکلاتی مانند ناسازگاری طرح عینک با صورت فرد، مشکل در اندازهگیری دقیق عینک و حتی نگرانی از خرید نادرست عینک از طریق اینترنت، به حداقل میرسد. همچنین، این روش به فروشندگان عینک این امکان را میدهد تا مدلهای مختلفی را برای مشتریان خود به نمایش بگذارند و تجربه خرید آنلاین را برای آنها بهبود بخشند.
برای تشخیص چهره و قرار دادن عینک بر روی صورت با استفاده از دوربین وبکم در پایتون، میتوانید از کتابخانهٔ 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 را فشار دهید.