شروع به کار با ویدیو
اهداف
- یادگیری خواندن و نوشتن و ذخیره ویدیو.
- یادگیری گرفتن تصویر از دوربین و ذخیره آن به صورت ویدیو.
- یادگیری توابع
cv.VideoCapture()
وcv.VideoWriter()
دریافت ویدیو از دوربین
ما معمولا با گرفتن تصاویر از یک جریان ویدیو کار داریم.این کتابخانه یک محیط ساده برای اینکار فراهم کرده.بیاید شروع کنیم.
میخواهیم جریان تصویر رو از دوربین ریافت کنیم و اون رو به صورت یک ویدیو شدتی(سفید و سیاه) نشان دهیم
برای گرفتن ویدیو نیاز داریم یک آبجکت VideoCapture
بسازیم.
ورودی های آن میتواند نام فایل یا ایندکس وسیله گیرنده ویدیو باشد.
ایندکس یک وسیله گیرنده مانند دوربین فقط عددی است که به آن وسیله تخصیص داده شده.
معمولا به لپتاپ یا کامپیوتر ما یک وسیله وصل است به همین دلیل من اینجا عدد 0 (یا1) رو وارد میکنم.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# Our operations on the frame come here
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# Display the resulting frame
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
# When everything done, release the capture
cap.release()
cv.destroyAllWindows()
cap.read
مقادیر True
یا False
رو بر میگردوند که نشون دهنده اینه که آیا فریم ها به درستی خوانده میشوند یا خیر.
با این مقدار برگشتی میتونید بفهمید به آخر ویدیو رسیدهاید یا خیر.
بعضی مواقع ممکن است cap
گیرنده ویدیو رو به اجرا در نیاورده باشد.
شما میتوانید با استفاده از cap.isOpened()
این موضوع رو چک کنید . این تابع مقادیر True
یا False
رو بر میگردوند.
اگر False
رو برگدوند میتواند با استفاده از cap.open()
گیرنده رو به اجرا درآورید.
همچنین شما به میتوانید به بعضی از ویژگی های ویدیو توسط تابع cap.get(n)
دسترسی داشته باشید که n عددی است از 0 تا 18 و
هر عدد به یک ویژگی ارتباط دارد.
اطلاعات کامل آن توسط تابع ()cv::VideoCapture::get
قابل مشاهده است.
همچنین بعضی از این مقادیر توسط تابع cap.set(n, value)
قابل تغییر هستند. value مقدار دلخواهی شما است که میخواهد ویژگی مربوط به n آن را تغییر دهید.
به عنوان مثال میتوانیم ارتفاع و عرض فریم رو با دستور cap.get(cv.CAP_PROP_FRAME_WIDTH)
و cap.get(cv.CAP_PROP_FRAME_HEIGHT)
مشاهده کنیم.
درحالت پیشفرض مقدار 640x480
داده میشود.
اما میخواهم این مقدار را به 320x240
تغییر دهم. برای این کار از دستور ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320)
و ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)
استفاده میکنم.
- اگر خطا دریافت میکنید مطمئن شوید دوربین دستگاه به درستی کار میکند.
پخش ویدیو از یک فایل
پخش کردن ویدیو مانند گرفتن ویدیو است با این تغییر که به جای شماره دستگاه دریافت کنند باید نام فایل رو وارد کنید.
همچنین هنگام پخش ویدیو از مقدار مناسبی برای cv.waitKey()
استفاده کنید.
اگر کوچک باشد ویدیو خیلی سریع پخش میشود و اگر بزرگ باشید ویدیو خیلی کند پخش میشود
عدد 25 برای حالت عادی مناسب است.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('vtest.avi')
while cap.isOpened():
ret, frame = cap.read()
# if frame is read correctly ret is True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
- مطمئن شوید که
ffmpeg
یاgstreamer
به درستی روی سیستم شما نصب شده باشد , درغیر اینصورت در کارکردن با این کتابخانه به مشکل خواهید خورد.
ذخیره ویدیو
خب تا اینجا ما ویدیو رو گرفتیم و فریم به فریم پردازش روی اون انجام دادیم و حالا میخواهیم اون رو ذخیره کنیم.
برای عکس ها خیلی راحت است و از دستور ()cv.imwrite
استفاده میکنیم.
اما برای ویدیو یکم بیشتر کار داریم.
در اینجا یک آبجکت VideoWriter
میسازیم. باید نام فایل خروجی را مشخص کنیم.
سپس باید کدک FourCC
رو مشخص کنیم.
سپس باید FPS
و اندازه هر فریم رو تنظیم کنیم.
درآخر باید isColor
رو تنظیم کنیم. اگر True
باشد انتظار یک فیلم رنگی و اگر False
باشد انتظار یک ویدیو سفید و سیاه رو داریم.
FourCC
یک مقدار 4 بایتی است که برای مشخص کردن کدک ویدیو به کار میرود. لیست کدک های موجود در fourcc.org است.
FourCC
توسط cv.VideoWriter_fourcc('M’,'J','P','G')
یا cv.VideoWriter_fourcc(*'MJPG')
برای mjpg
استفاده میشود.
کد زیر هر فریم رو دریافت میکنید و اون رو از عمودی به افقی تغییر میدهد و ذخیره میکند.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
frame = cv.flip(frame, 0)
# write the flipped frame
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
# Release everything if job is finished
cap.release()
out.release()
cv.destroyAllWindows()