هدف
در این قسمت از آموزش کار با ویدئو در OpenCV-Python یاد میگیرید که :
ویدیو را بخوانید، ویدیو را نمایش داده و ویدئو را ذخیره کنید.
از دوربین عکس بگیرید و آن را نمایش دهید.
شما این توابع را یاد خواهید گرفت : ()cv2.VideoCapture()، cv2.VideoWriter
Capture کردن ویدئو از دوربین
اول از همه بایستی ویدئو را با دوربین Capture کنیم. OpenCV یک رابط کاربری بسیار ساده برای این کار فراهم می کند. بیایید تصویری از دوربین بگیریم (من از وب کم داخلی لپ تاپ خود استفاده می کنم) و اونو تبدیل به یک فیلم سیاه و سفید می کنم و نمایشش میدم. فقط یک کار ساده برای شروع.
برای Capture کردن یک ویدئو ، شما باید یک شی VideoCapture ایجاد کنید. آرگومان ورودی آن می تواند یا شماره دوربین (از 0 الی آخر) یا نام یک فایل ویدئویی باشد. به طور معمول یک دوربین به سیستم وصل خواهد بود (همانطور که در مورد من هست). بنابراین من به سادگی با وارد کردن 0 (یا -1) تصویر دوربین را Capture میکنم. شما می توانید دوربین دوم با وارد کردن 1 و غیره را انتخاب کنید. بعد، می توانید فریم به فریم تصاویر را دریافت کنید. اما در نهایت فراموش نکنید که Capture را آزاد کنید.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
()cap.read یک بول (True / False) را باز می کند و در متغیر ret می ریزد. اگر فریم درست خوانده شود، درست خواهد بود. بنابراین با بررسی این مقدار بازگشتی می توانید پایان ویدیو را بررسی کنید. همچنین فریم جاری را در متغیر frame می ریزد.
Cap گاهی اوقات ممکن است عملیات capture کردن را راه اندازی نکرده باشد. در این صورت، خطا می دهد. شما می توانید با روش ()cap.isOpened چک کنید که آیا capture کردن راه اندازی شده یا نه. اگر True باشد، همه چیز درست است. در غیر این صورت آن را با استفاده از ()cap.open باز کنید.
شما همچنین می توانید به برخی از ویژگی های ویدئو با استفاده از روش (cap.get(propId که در آن propId عددی است از 0 تا 18 ، دسترسی پیدا کنید. هر عدد یک مشخصه ویدئویی (اگر برای آن ویدیو استفاده می شود) مشخص می کند. جزئیات کامل را می توانید اینجا را ببینید Property Identifier برخی از این مقادیر را می توان با استفاده از (cap.set(propId, value اصلاح کرد. value مقدار جدیدی است که می خواهید وارد کنید.
برای مثال، من میتونم عرض و ارتفاع فریم ویدیو خودم را با (cap.get(3 و (cap.get(4 بررسی کنم. .خروجی این کد برای من اندازه فریم ویدیو یعنی 640*480 خواهد بود. اما من می خوام که آن را به 320*240 تغییر دهم. تنها کاری که لازمه بکنم اینه : (ret = cap.set(3,320 و (ret = cap.set(4,240
[alert style=”warning”]
نکته : اگر خطایی دریافت کردید مطمئن شوید که دوربین شما درست نصب شده و کار می کند . برای این کار از برنامه های مشاهده وب کم استفاده کنید مثلا manyCam در ویندوز و cheese در لینوکس .
[/alert]
پخش ویدئو از فایل
دقیقا مثل دریافت ویدیو از دوربین است، فقط به جای شماره دستگاه نام فایل (در پوشه مسیر جاری) ویدئویی یا آدرس کامل آن را وارد می کنیم. همچنین در هنگام نمایش فریم، از زمان مناسب برای تنظیم سرعت پخش ویدیو استفاده می کنیم ()cv2.waitKey . اگر کم باشد، ویدیو بسیار سریع خواهد بود و اگر زیاد، ویدیو کند خواهد شد (با این روش می توانید ویدیوها را در حالت آرام نمایش دهید).
import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
[alert style=”warning”]
نکته : اطمینان حاصل کنید که نسخه مناسب ffmpeg یا gstreamer نصب شده است. گاهی اوقات مشکلات زیادی برای کار با ویدئو به دلیل نصب اشتباه ffmpeg / gstreamer بوجود می آید.
[/alert]
ذخیره کردن ویدیو
تا الان ما یک ویدیو را capture کردیم ، فریم به فریم پردازش کردیم و نمایش دادیم حالا می خواهیم این ویدیو را ذخیره کنیم. برای تصاویر، کار بسیار ساده بود، فقط از ()cv2.imwrite استفاده می کردیم. برای ویدیو ها یکمی بیشتر کار میبره .
اول یک شی VideoWriter ایجاد میکنیم. ما باید نام فایل خروجی (مثلا: output.avi) را مشخص کنیم. سپس باید کد FourCC را مشخص کنیم (جزئیات در پاراگراف بعدی). سپس تعداد فریم ها در ثانیه (fps) و اندازه فریم باید منتقل شود. و آخرین آیتم پرچم isColor است. اگر درست باشد، انکدر فرمت رنگی را انتقال می دهد، در غیر اینصورت با فریم سیاه و سفید کار می کند.
FourCC یک کد 4 بایتی است که برای مشخص کردن کدک ویدیو. لیست کدهای موجود را می توانید در fourcc.org بیابید. بستگی به پلتفرمتون داره.
کد زیر تصویر را از دوربین وب کم Capture میکند بعد هر فریم را به صورت عمودی می چرخاند و در نهایت در مسیر جاری در فایل output.avi ذخیره می کند .
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
قسمت قبلی : آموزش کار با تصاویر در OpenCV-Python
قسمت بعدی : توابع طراحی در Opencv-Python
Comments (18)
سلام
من میخوام صدای ویدئو هم پخش بشه همراهش
و اینکه رنگی باشه
چه کنم؟!
از ffpyplayer میتونین استفاده کنین
import cv2
import numpy as np
#ffpyplayer for playing audio
from ffpyplayer.player import MediaPlayer
video_path=”../L1/images/Godwin.mp4″
def PlayVideo(video_path):
video=cv2.VideoCapture(video_path)
player = MediaPlayer(video_path)
while True:
grabbed, frame=video.read()
audio_frame, val = player.get_frame()
if not grabbed:
print(“End of video”)
break
if cv2.waitKey(28) & 0xFF == ord(“q”):
break
cv2.imshow(“Video”, frame)
if val != ‘eof’ and audio_frame is not None:
#audio
img, t = audio_frame
video.release()
cv2.destroyAllWindows()
PlayVideo(video_path)
میشه بگید دوربین های تحت شبکه چطور راه اندازی میشن؟من ip adress وportدوربین و میدم اما نمیتونه تصاویر رو دریافت کنه…جیکارکنم
با سلام من می خواهم فریم های فایل ویدیویی ام را که بصورت تصویر جداسازی کردیم ذخیره کنم یعنی مثلا برای یک ویدیو که 200 تا فریم به دست می آیند آن 200 تصویر را در یک جایی ذخیره کنم برای این چه کار باید بکنم؟ با تشکر
از متد imwrite() درون حلقه تکرار استفاده کنین برای مثال به شکل زیر
cv2.imwrite(filename, img)
اصولش به این صورته :
stream = cv2.VideoCapture(‘protocol://IP:port/1’)
و ارگ یوزر پس داشته باشه به این صورت :
stream = cv2.VideoCapture(‘protocol://username:password@IP:port/1’)
پروتوکل ها یا http هستند یا rstp
برای مثال پرتوکل rstp با یوزر و پسورد:
capture = cv2.VideoCapture(‘rtsp://username:password@192.168.1.64/1’)
سلام
اگه بخایم تصویر فریم ویدیو را به چند بخش تقسیم کنیم یا اینکه یک قسمت خاص از فریم را جدا کنیم تا روی اونها پردازش انجام بدیم
از چه دستوری باید استفاده کنیم؟
به راحتی از numpy استفاده کنین
crop_img = img[y1:y2, x1:x2]
اگه بخوایم کپچر رو در یک فایل ذخیره کنیم باید از چه دستوری استفاده بشه؟؟؟
با سلام خسته نباشید خدمت جنابعالی و تشکر بابت اطلاعات مفید شما.
شبه کدی که کاوش رویداد بر اساس فیلم های وب که از طریق بهینه سازی مشارکتی با ترکیب اطلاعات تشخیص شباهت بصری نادرست و اطلاعات متنی پراکنده را نشون بده میونیین به بنده بگین
ممنونم از جنابعالی.
قسمت آخر مطلب رو ببینید نوشته که چطور میشه در فایل ذخیره کرد
out = cv2.VideoWriter(‘output.avi’,fourcc, 20.0, (640,480))
سلام وقت بخیر
اگه بخوام دوتا ویدئو توی یک فریم نمایش داده بشه مثلا کنار هم اما در حالت عادی دوتا پنجره متفاوت باز میشه و نمی خوام اونجوری بشه
اگه راهنمایی بفرمائید ممنون میشم/
سلام وقت بخیر میتونی دوتا تصویر رو قبل از نمایش باهم ترکیب کنین ،با دستور زیر:
combinedImage= np.concatenate((img1, img2), axis=1)
سلام چطور میشه هر دو دقیقه یک عکس از دوربین لپ تاپ گرفت.
با تشکر
import cv2
videoCaptureObject = cv2.VideoCapture(0)
result = True
while(result):
ret,frame = videoCaptureObject.read()
cv2.imwrite(“NewPicture.jpg”,frame)
result = False
videoCaptureObject.release()
cv2.destroyAllWindows()
سلام
توی حلقه while میتونید یک شمارنده بزارین و هر بار یک عدد بهش اضافه کنید ، حالا با یه if هر زمانی که میخواید میتونید یه عکس بگیرید مثلا وقتی شمارنده به 2880 برسه (هر فریم اگر 24 ثانیه باشه 120 ثانیه میشه 2880) فقط یادتون نره که به این عدد که رسید توی if مقدارش رو 0 کنید
من کد پخش ویدیو از داخل خود سیستم نه به صورت زنده از کمرا رو میخام پخش کنم ارور میده نمیدونم چرا
اسم ویدیو رو هم در کد به اسم ویدیو حودم تغییر دادم
PS C:\Users\Administrator> & “C:/Program Files/Python311/python.exe” “c:/Users/Administrator/Desktop/New folder (7)/New Text Document.py”
[ERROR:0@0.049] global D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap.cpp (166) cv::VideoCapture::open VIDEOIO(CV_IMAGES): raised OpenCV exception:
OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can’t find starting number (in the name of file): vtest.avi in function ‘cv::icvExtractPattern’
این ارور رو میده چیکار کنم
با یه فرمت فایل دیگه امتحان کنید