آموزش مقدماتی opencv(قسمت دوم)
خواندن تصاویر از ویدئو یا وبکم
()cv2.waitkey
قبل از شروع این قسمت بیاین تابع ()cv2.waitkey را بیشتر بررسی کنیم .شما در پست قبلی یادگرفتید چگونه یک عکس را لود کنید و نمایش بدهید؛ یک بار دیگر یک عکس را نمایش دهید و در انتها یکی از دکمه های کیبورد را فشار دهید ؛ چه اتفاقی افتاد؟ همانطور که مشاهده کردید تصویر بسته شد .
وقتی شما کلیدی رو فشار می دهید ؛ مقدار عددی آن کلید در تابع ()cv2.waitKey ذخیره می شود.(هر دکمه کیبورد عدد خاص خودش را دارد.) برای اینکه این موضوع را ببینید ()cv2.waitKey را در متغیری بریزید بعد آن متغیر را print کنید.
مثلا در مثال زیر من ()cv2.waitKey را در متغیر k ذخیره کردم و الان هر کلیدی را فشار دهم مقدار عدی آن print می شود .
import cv2 img=cv2.imread("E:\viraai-opencv\opencv.png",1) cv2.imshow("image",img) k=cv2.waitKey(0) cv2.destroyAllWindows() print(k)
اگر بخواهیم تصویر ما با دکمه خاصی بسته شود میتوانیم با استفاده از نکات بالا ،که مقدار عددی کلید فشرده شده در ()cv2.waitkey ذخیره می شود شرط بگذاریم.
بدست آوردن مقدار کلید
حال برای بدست آوردن مقدار کلید فشرده دو حالت داریم.
- حالت اول: اینکه ()cv2.waitkey را در متغیری بریزیم و سپس print کنیم.
- حالت دوم:میتوان از تابع ()ord استفاده کرد؛ که کلیدی مد نظرمان را به صورت استرینگ به تابع می دهیم و آن مقدار عددی کلید را به ما بر می گرداند.
print(ord("q")))
اگر این خط کد را اجرا کنید؛ همان طور که انتظار داشتیم مقدار عددی q را بر می گرداند.
هدف اصلی ما در این آموزش گرفتن تصاویر از وبکم یا ویدئو است ؛ و نشان دادن آن ها فریم به فریم است. در گام اول از تابع ()cv2.VideoCapture استفاده می کنیم.
ورودی ()cv2.VideoCapture:
- ویدیو:مسیر این ویدیو را می نویسیم.
- وبکم:شماره وبکمی که قرار است تصاویر از آن خوانده شوند؛ مثلا وبکم خود لپ تاپ شماره 0 و وبکمی دیگری که خودتان به سیستمتان اضافه کردید شماره 1.
تابع () cv2.VideoCapture را در یک متغیر میریزیم؛ که این متغیر در حلقه فریم به فریم توسط تابع () read خوانده شوند.
cap = cv2.VideoCapture(0)
تابع ()read دوتا خروجی بر می گرداند:
- خروجی اول:نوع این متغیر بولین است(False or True) و به ما می گوید که آیا تصویر گرفته شده از وبکم یا ویدئو سالم است یا نه.
- خروجی دوم:فریمی از فیلم است.
پس ما باید دوتا متغیر برای این تابع در نظر بگیریم.
ret, frame = cap.read()
دو حالت برای پایان دادن حلقه بی نهایتمان داریم:
- حالت اول:اگر ورودی ما فیلم است؛ بلاخره این فیلم تمام می شود و حلقه خودش به پایان می رسد.البته اگر بخواهیم فیلم را خودمان متوقف کنیم از حالت دوم استفاده می کنیم.
- حالت دوم:در این حالت که می خواهیم به صورت دستی نمایش دادن را متوقف کنیم ؛ نیاز داریم شرطی بگذاریم که اگر کلمه مورد نظرمان فشرده شد، حلقه پایان یابد.
while True: ret, frame = cap.read() if not ret: print("Can't receive frame (stream end?). Exiting ...") break cv2.imshow('frame', frame) if cv2.waitKey(1) == ord('q'): break
همان طور که میدانید عدد در پرانتز ()cv2.waitKey به معنی است که؛ هر فریم در چه مدت زمانی نشان داده شود و هر چه این مدت زمان کمتر باشد؛ تصویر سریع تر عوض می شود و از cpu بیشتر استفاده می شود ؛بنابراین ما برای استفاده از نهایت قدرت cpu یک می ذاریم.
گام اخر برای رسیدن به هدفمان نوشتن کد های زیر است:
cap.release() cv.destroyAllWindows()
()cap.release این دستور را می ذاریم که مطمئن شویم فیلم گرفتن متوقف شده است.
برای بستن تمامی پنجره ها هم از() cv.destroyAllWindows استفاده می کنیم.
دیدگاهتان را بنویسید