خواندن و ذخیره سازی ورودی های ویدئو

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Aug 26, 2020

خواندن، نوشتن و نمایش ویدئو

در این بخش، ما در مورد فیلم ها در OpenCV صحبت می کنیم. یک ویدیو در واقع دنباله ای از تصاویر است که به سرعت در حال حرکت هستند. بنابراین، سوال واضح این است که تصاویر چگونه سریع حرکت می کنند. اندازه گیری سرعت انتقال تصاوير توسط یک متریک به نام فریم در ثانیه (fps) داده می شود. بنابراین، fps یک اندازه از تعداد تصاویر منحصر به فرد متوالی که هر ثانیه نمایش داده می شود را ارائه می دهد. بنابراین، هنگامی که کسی می گوید که ویدئو دارای مقدار fps 40 است، به این معنی است که 40 تصویر در هر ثانیه نمایش داده می شود. و یا می توان گفت که، پس از هر 25 میلی ثانیه، یک تصویر جدید لود می شود. ما اغلب با فیلم های زیادی در حال کار و برخورد در زمینه دید کامپیوتر هستیم. در این بخش، ما درباره عملیات اساسی مربوط به فیلم ها در OpenCV صحبت می کنیم، یعنی خواندن و نوشتن. خوشبختانه OpenCV یک رابط کاربری بسیار ساده برای انجام این عملیات فراهم کرده است.

 

خواندن ویدئو

در OpenCV، یک ویدیو را می توان با استفاده از یک دوربین متصل به کامپیوتر یا با خواندن یک فایل ویدئویی خواند. اولین قدم برای خواندن یک فایل ویدئویی، ایجاد یک شی VideoCapture است. استدلال آن می تواند یا شاخص دستگاه یا نام فایل ویدئویی باشد که باید خوانده شود. در بیشتر موارد، تنها یک دوربین به سیستم وصل شده است. بنابراین، عدد 0 جایگاه اولی دستگاه خواهد بود و OpenCV از دوربین متصل به کامپیوتر استفاده می کند. هنگامی که بیش از یک دوربین به کامپیوتر متصل است، می توانیم دوربین دوم را با جایگذاری عدد 1 و یا، دوربین سوم با عبور جایگذاری عدد 2 و غیره را انتخاب کنیم.

#ceating video capture object to get a video input
cap = cv2.VideoCapture('video.mp4')

پس از ایجاد شی VideoCapture، می توانیم تصویر را فریم بر ثانیه بگیریم.

 

نمایش ویدئو

پس از خواندن یک فایل ویدئویی، می توانیم ویدئو را فریم با فریم نمایش دهیم. یک فریم از یک ویدیو به سادگی یک تصویر است و ما هر فریم را همانطور که تصاویر را نمایش می دهیم به اجرا در می آوریم، یعنی ما از تابع imshow () استفاده می کنیم. همانطور که در مورد یک تصویر، از تابع waitKey () بعد از imshow () برای مکث هر فریم در ویدیو استفاده می کنیم. در مورد یک تصویر، ما '0' را به تابع waitKey () منتقل میکنیم، اما برای پخش یک ویدیو، باید یک عدد بزرگتر از '0' را به تابع waitKey () منتقل کنیم. این به این دلیل است که «0» فریم را در ویدیو برای مدت زمان نامحدودی متوقف می کند و در یک ویدیو که برای هر فریم نیاز است و برای اینکه تصاویر ما در حدود هر 25 میلی ثانیه پخش می شود می بایست عددی بزرگتر از 0 را در نظر بگیریم تا به حد مورد نظر برسد. این عدد برابر با زمان در میلی ثانیه است که ما می خواهیم هر فریم نمایش داده شود. در حالی که خواندن فریم ها از یک وب کم، با استفاده از waitKey (1) مناسب است زیرا نرخ فریم نمایش توسط نرخ فریم وب کم محدود می شود، حتی اگر یک delay of 1 ms در waitKey مشخص کنیم. در موارد نادر، هنگامی که پخش باید با نرخ فریم خاصی باشد، ممکن است بخواهیم تأخیر بیش از 1 میلی ثانیه باشد. نمونه کد زیر نحوه خواندن یک فایل را از داخل دایرکتوری کد به شما نشان میدهد.

 #قطعه کد برای خواندن فایل ویدئویی
# اضافه کردن دو کتابخانه پردازش تصویر
import cv2
import numpy as np

# ساخت یک شیء برای گرفتن تصویر و ذخیره در یک متغیر
# اگر ورودی شما در کامپیوتر و لپتاپ توسط دوربین وب 
# کم است به جای اسم فایل عدد 0 را وارد نمایید
# توجه کنید این کد برای رزبری پای هم مناسب است در صورتی که از دوربین با رابط  ای تو سی استفاده نکنید
cap = cv2.VideoCapture('chaplin.mp4')

# چک کن اگر دوربین به درستی در حال فعالیت است
if (cap.isOpened()== False): 
  print("Error opening video stream or file")

#تصاویر را بخوان و نمایش بده تا به اتمام برسد و یا توقف شود

while(cap.isOpened()):
  # ذخیره و بافر تصاویر فریم به فریم
  ret, frame = cap.read()
  if ret == True:

    # نمایش تصاویر دریافتی
    cv2.imshow('Frame',frame)
    #توقف در صورت فشردن کلید ESC
    if cv2.waitKey(25) & 0xFF == 27:
      break

    # شکستن حلقه تکرار خواندن تصاویر
    else: 
      break

# وقت عملیات به پایان رسید ویدئو را رها می کند
#capture object
cap.release()

# بستن تمام فریم و پنجره نمایشگر
cv2.destroyAllWindows()

 

ذخیره و نوشتن ویدئو

بعد از اینکه کار ما با گرفتن و پردازش فریم ویدیو انجام شد، قدم بعدی که ما می خواهیم انجام دهیم این است که ویدیو را ذخیره کنیم. برای تصاویر، ساده است. ما فقط باید از cv2.imwrite () استفاده کنیم. اما برای فیلم ها، ما باید کمی سخت تر کار کنیم. ما باید یک شی VideoWriter ایجاد کنیم. ابتدا باید نام فایل خروجی را با فرمت آن (مثلا: output.avi) مشخص کنیم. سپس، ما باید کد چهارگانه و تعداد فریم در ثانیه (FPS) را مشخص کنیم. در نهایت، اندازه فریم (رزولوشن) باید منتقل شود. FourCC یک کد 4 بایت است که برای مشخص کردن کدک ویدیو مورد استفاده قرار می گیرد. لیست کدهای موجود را می توانید در fourcc.org پیدا کنید. بسیاری از کدهای FOURCC وجود دارد، اما در این پست ما تنها با MJPG کار می کنیم. توجه: فقط تعداد کمی از کدهای FourCC که در بالا ذکر شده بر روی سیستم شما بر اساس در دسترس بودن کدک های موجود در سیستم شما کار خواهند کرد. گاهی اوقات، حتی زمانی که کدک خاصی در دسترس است، OpenCV ممکن است قادر به استفاده از آن نباشد. MJPG انتخاب امن است. نمونه کد زیر نحوه عملکرد ذخیره ویدئو با opencv را نمایش خواهد داد. نمونه پیشرفته تر کد همراه با سایز و انتخاب کدک:

# اضافه کردن کتابخانه های پردازش تصویر
import cv2
import numpy as np

# ساخت شیء برای گرفتن تصاویر وب کم
cap = cv2.VideoCapture(0)

# چک کردن برای اینکه دوربین به درستی فعال شده
if (cap.isOpened() == False): 
  print("Unable to read camera feed")    

#گرفتن سایز تصویر و تبدیل به اینتجر
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

#ایجاد یک فایل خروجی با مشخص کردن کدک و سایز
out = cv2.VideoWriter('outpy.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height))
#گرفتن و خواندن تصاویر ورودی از وب کم تا زمان قطع و یا اتمام
while(True):
  ret, frame = cap.read()

  if ret == True:
    
    # ریختن فریم های خروجی در فایل
    out.write(frame)

    # نمایش تصاویر دریافتی از وب کم
    cv2.imshow('frame',frame)
   # برای قطع عملیات فشردن ESC
    if cv2.waitKey(1) & 0xFF == 27:
      break

  # شکستن حلقه
  else:
    break  

# وقتی کار به اتمام رسید قطع ضبط و گرفتن خروجی
cap.release()
out.release()

#بستن تمام پنجره ها و خروج
cv2.destroyAllWindows()

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
captcha
0دیدگاه