因为研究方向问题需要先视频处理,方便后面进行检测等,这里记录下常用的,方便以后
测试所用的视频:https://media.w3.org/2010/05/sintel/trailer.mp4
VideoCapture中get和set函数常用的参数如下,值得注意的是在opencv2版本中需要按下面加上CV_前缀,但是在opencv3中是不需要CV_前缀的,下面19个参数依次对应整数0-18
cv2.waitKey( int delay)
当delay≤0,程序暂停,直到键盘按键才继续运行,同时返回按键的ASCII值;如果delay>0,则等待delay毫秒后继续运行。
因此我们可以用过waitKey函数来实现播放视频中途暂停或退出,例如输入q来退出播放:if cv2.waitKey(10) & 0xFF == ord('q'):
测试代码:
# coding: utf-8
import numpy as np
import cv2
import shutil
import os
print ("the opencv version: {}".format(cv2.__version__))
save_path = "./save_each_frames"
if(os.path.exists(save_path)):
shutil.rmtree(save_path)
os.mkdir(save_path)
#cap = cv2.VideoCapture("./trailer.mp4")
cap = cv2.VideoCapture()
cap.open("./trailer.mp4")
if cap.isOpened() != True:
os._exit(-1)
#get the total numbers of frame
totalFrameNumber = cap.get(cv2.CAP_PROP_FRAME_COUNT)
print ("the number of frames is {}".format(totalFrameNumber))
#set the start frame to read the video
frameToStart = 1
cap.set(cv2.CAP_PROP_POS_FRAMES, frameToStart);
#get the frame rate
rate = cap.get(cv2.CAP_PROP_FPS)
print ("the frame rate is {} fps".format(rate))
# get each frames and save
frame_num = 0
while True:
ret, frame = cap.read()
if ret != True:
break
img_path = os.path.join(save_path, str(frame_num)+".jpg")
cv2.imwrite(img_path,frame)
frame_num = frame_num + 1
# wait 10 ms and if get 'q' from keyboard break the circle
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
测试结果:
利用ffmpeg,我们可以实现视频转图片跟图片传视频的功能:
视频转图片命令:
ffmpeg -i clipname -vf fps=framerate -qscale:v 2 "imagename%04d.jpg"
上述指令将一个视频按照固定的频率生成图片。
将一批图片合并为一个视频命令:
ffmpeg -f image2 -i imagename%04d.jpg -vcodec libx264 -crf 15 -pix_fmt yuv420p output_filename.mp4
可以在最后加入音频文件合并到视频中