شروع به کار با ویدیو

اهداف

  • یادگیری خواندن و نوشتن و ذخیره ویدیو.
  • یادگیری گرفتن تصویر از دوربین و ذخیره آن به صورت ویدیو.
  • یادگیری توابع 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()