آشکارسازهای احساسات در بسیاری از صنایع مورد استفاده قرار می گیرند، یکی از آنها صنعت رسانه است که برای شرکت ها مهم است که واکنش عمومی به محصولات خود را تشخیص دهند . در این مقاله آموزش پایتون قصد داریم با استفاده از OpenCV یک ردیاب لبخند بسازیم که ویدیو زنده را از وب کم دریافت می کند. آشکارساز لبخند که میخواهیم پیادهسازی کنیم، یک آشکارساز خام خواهد بود، طبیعتا راههای بهتر و پیشرفته تری برای پیادهسازی آن وجود دارد.
مرحله 1: اول از همه، باید کتابخانه OpenCV را ایمپورت کنیم:
import cv2
مرحله 2: کاسکادهای مورد نظر را اضافه کنید. Haar-cascades طبقهبندیکنندههایی هستند که برای شناسایی ویژگیها (در این مورد چهره) با قرار دادن الگوهای از پیش تعریفشده بر روی بخشهای صورت استفاده میشوند و به عنوان فایلهای XML استفاده میشوند. در این برنامه ما از haar-cascades صورت، چشم و لبخند استفاده می کنیم که پس از دانلود باید در پوشه پروژه قرار گیرند. تمام کاسکادهای Haar مورد نیاز را می توانید در اینجا پیدا کنید.
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_eye.xml')
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_smile.xml')
برای مشاهده مطالب دیگر آموزش پایتون و openCv کلیک کنید
مرحله 3: در این مرحله میخواهیم عملکرد اصلی را بسازیم که تشخیص لبخند را انجام میدهد. فید زنده که از وب کم/دستگاه ویدیویی می آید فریم به فریم پردازش می شود. ما تصویر مقیاس خاکستری را پردازش می کنیم، زیرا آبشارهای haar بهتر روی آنها کار می کنند. برای تشخیص چهره از کد زیر استفاده می کنیم:
def detect(gray, frame):
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), ((x + w), (y + h)), (255, 0, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
smiles = smile_cascade.detectMultiScale(roi_gray, 1.8, 20)
for (sx, sy, sw, sh) in smiles:
cv2.rectangle(roi_color, (sx, sy), ((sx + sw), (sy + sh)), (0, 0, 255), 2)
return frame
- که در آن 1.3 ضریب مقیاس و 5 تعداد نزدیکترین همسایگان است. ما میتوانیم این عوامل را مطابق با راحتی/نتایج خود برای بهبود آشکارساز خود تنظیم کنیم.
- اکنون برای هر چهره بعدی که شناسایی می شود، باید لبخند را بررسی کنیم.
def detect(gray, frame):
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), ((x + w), (y + h)), (255, 0, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
smiles = smile_cascade.detectMultiScale(roi_gray, 1.8, 20)
for (sx, sy, sw, sh) in smiles:
cv2.rectangle(roi_color, (sx, sy), ((sx + sw), (sy + sh)), (0, 0, 255), 2)
return frame
توضیحات – داده های چهره به صورت چند مختصات ذخیره می شوند. در اینجا x و y مختصات گوشه سمت چپ بالای قاب چهره، w و h عرض و ارتفاع فریم را مشخص می کنند. تابع cv2.rectangle در چارچوب آرگومانها، مختصات سمت چپ بالا، مختصات پایین سمت راست، کد RGB برای مستطیل (که در داخل آن وجه شناسایی شده است) و ضخامت مستطیل را میگیرد. roi_gray ناحیه مورد نظر چهره را مشخص می کند و roi_color همین کار را برای فریم اصلی انجام می دهد. در خط 7، تشخیص لبخند را با استفاده از آبشار اعمال می کنیم. مرحله 4: تابع اصلی را در این مرحله تعریف می کنیم. پس از اجرا، عملکرد را می توان با فشار دادن کلید “q” خاتمه داد.
video_capture = cv2.VideoCapture(0)
while video_capture.isOpened():
# Captures video_capture frame by frame
_, frame = video_capture.read()
# To capture image in monochrome
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# calls the detect() function
canvas = detect(gray, frame)
# Displays the result on camera feed
cv2.imshow('Video', canvas)
# The control breaks once q key is pressed
if cv2.waitKey(1) & 0xff == ord('q'):
break
# Release the capture once all the processing is done.
video_capture.release()
cv2.destroyAllWindows()
دیدگاهتان را بنویسید