使用Python撰寫儲存影片格式實在是再簡單不過了. 要儲存成video影片, 一樣使用OpenCV即可. 首先取得要儲存的編號格式.
video_code = cv2.VideoWriter_fourcc(*'XVID')
上述格式有如下幾種, 以mp42檔案最小
cv2.VideoWriter_fourcc('M','J','P','G') = motion-jpeg codec cv2.VideoWriter_fourcc('P','I','M','1') = MPEG-1 codec cv2.VideoWriter_fourcc('M', 'P', '4', '2') = MPEG-4.2 codec cv2.VideoWriter_fourcc('D', 'I', 'V', '3') = MPEG-4.3 codec cv2.VideoWriter_fourcc('D', 'I', 'V', 'X') = MPEG-4 codec cv2.VideoWriter_fourcc('U', '2', '6', '3') = H263 codec cv2.VideoWriter_fourcc('I', '2', '6', '3') = H263I codec cv2.VideoWriter_fourcc('F', 'L', 'V', '1') = FLV1 codec
請注意, ubuntu目前能用的是 *’mp4v’ , 而且請注意, 只能用小寫, 不能用大寫
再來使用 cv2.VideoWriter()設定輸出格式
1. 儲存的路徑 : videos/cam_1.mp4
2. fps(Frame per second) : 此處設定為20, 此數可為小數, 比如 29.97. 經測試, 20即足夠
3. 解析度使用tuple (1920,1080)
output = cv2.VideoWriter('videos/cam_1.mp4', video_code, 20.0, (1920,1080))
最後將每一幅圖片寫入output即可
output.write(frame)
完整代碼
import cv2 import os cam = cv2.VideoCapture(0) cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) video_code = cv2.VideoWriter_fourcc(*'XVID') video_path='videos' if not os.path.isdir(video_path): os.mkdir(video_path) output = cv2.VideoWriter(f"{video_path}/cam_1.mp4", video_code, 7.0, (1920,1080)) while(True): ret,frame = cam.read() cv2.imshow("Mahal WebCam video", frame) output.write(frame) if 0xFF & cv2.waitKey(5) == 27: break cam.release() output.release() cv2.destroyAllWindows()
坑洞
fps : 是告知播放器一秒要放映幾張的意思, 比如30fps, 是告知播放器一秒要放映30張. 但如果檔案裏並沒有這麼多張, 播放器還是拼命抓取, 就會造成影片快速播放的現像.
所以fps是要以實際sdcard存放的時間為主, 樹莓派每秒約7張
聲音錄製
目前尚未有單一library可以同時錄製影像及聲音. OpenCV只能錄製Video, 沒有Audio的錄製功能. 若要錄製聲音, 必需使用 pyaudio套件完成.
而且這二者必需使用不同執行緒完成
錄製完後, 再使用ffmpeg套件將二個檔合併成一個影像檔
todo
參考
https://stackoverflow.com/questions/14140495/how-to-capture-a-video-and-audio-in-python-from-a-camera-or-webcam
車輛偵測
a-chien.blogspot.com/2017/02/pythonopencv.html
motion 縮時攝影
blog.gtwang.org/iot/raspberry-pi/raspberry-pi-time-lapse-using-motion-and-webcam/
todo