python3抓取图片视频_Python opencv提取视频中的图片
#-*- coding: utf-8 -*-
importosimport cv2 ##加載OpenCV模塊
def video2frames(pathIn='',
pathOut='',
only_output_video_info=False,
extract_time_points=None,
initial_extract_time=0,
end_extract_time=None,
extract_time_interval= -1,
output_prefix= 'frame',
jpg_quality= 100,
isColor=True):'''pathIn:視頻的路徑,比如:F:\python_tutorials\test.mp4
pathOut:設定提取的圖片保存在哪個文件夾下,比如:F:\python_tutorials\frames1\。如果該文件夾不存在,函數將自動創建它
only_output_video_info:如果為True,只輸出視頻信息(長度、幀數和幀率),不提取圖片
extract_time_points:提取的時間點,單位為秒,為元組數據,比如,(2, 3, 5)表示只提取視頻第2秒, 第3秒,第5秒圖片
initial_extract_time:提取的起始時刻,單位為秒,默認為0(即從視頻最開始提取)
end_extract_time:提取的終止時刻,單位為秒,默認為None(即視頻終點)
extract_time_interval:提取的時間間隔,單位為秒,默認為-1(即輸出時間范圍內的所有幀)
output_prefix:圖片的前綴名,默認為frame,圖片的名稱將為frame_000001.jpg、frame_000002.jpg、frame_000003.jpg......
jpg_quality:設置圖片質量,范圍為0到100,默認為100(質量最佳)
isColor:如果為False,輸出的將是黑白圖片'''cap= cv2.VideoCapture(pathIn) ##打開視頻文件
n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) ##視頻的幀數
fps = cap.get(cv2.CAP_PROP_FPS) ##視頻的幀率
dur = n_frames/fps ##視頻的時間
##如果only_output_video_info=True, 只輸出視頻信息,不提取圖片
ifonly_output_video_info:print('only output the video information (without extract frames)::::::')print("Duration of the video: {} seconds".format(dur))print("Number of frames: {}".format(n_frames))print("Frames per second (FPS): {}".format(fps))##提取特定時間點圖片
elif extract_time_points is notNone:if max(extract_time_points) > dur: ##判斷時間點是否符合要求
raise NameError('the max time point is larger than the video duration....')try:
os.mkdir(pathOut)exceptOSError:passsuccess=True
count=0while success and count
cap.set(cv2.CAP_PROP_POS_MSEC, (1000*extract_time_points[count]))
success,image=cap.read()ifsuccess:if notisColor:
image= cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ##轉化為黑白圖片
print('Write a new frame: {}, {}th'.format(success, count+1))
cv2.imwrite(os.path.join(pathOut,"{}_{:06d}.jpg".format(output_prefix, count+1)), image, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality]) #save frame as JPEG file
count = count + 1
else:##判斷起始時間、終止時間參數是否符合要求
if initial_extract_time >dur:raise NameError('initial extract time is larger than the video duration....')if end_extract_time is notNone:if end_extract_time >dur:raise NameError('end extract time is larger than the video duration....')if initial_extract_time >end_extract_time:raise NameError('end extract time is less than the initial extract time....')##時間范圍內的每幀圖片都輸出
if extract_time_interval == -1:if initial_extract_time >0:
cap.set(cv2.CAP_PROP_POS_MSEC, (1000*initial_extract_time))try:
os.mkdir(pathOut)exceptOSError:pass
print('Converting a video into frames......')if end_extract_time is notNone:
N= (end_extract_time - initial_extract_time)*fps + 1success=True
count=0while success and count
success,image=cap.read()ifsuccess:if notisColor:
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)print('Write a new frame: {}, {}/{}'.format(success, count+1, n_frames))
cv2.imwrite(os.path.join(pathOut,"{}_{:06d}.jpg".format(output_prefix, count+1)), image, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality]) #save frame as JPEG file
count = count + 1
else:
success=True
count=0whilesuccess:
success,image=cap.read()ifsuccess:if notisColor:
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)print('Write a new frame: {}, {}/{}'.format(success, count+1, n_frames))
cv2.imwrite(os.path.join(pathOut,"{}_{:06d}.jpg".format(output_prefix, count+1)), image, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality]) #save frame as JPEG file
count = count + 1
##判斷提取時間間隔設置是否符合要求
elif extract_time_interval > 0 and extract_time_interval < 1/fps:raise NameError('extract_time_interval is less than the frame time interval....')elif extract_time_interval > (n_frames/fps):raise NameError('extract_time_interval is larger than the duration of the video....')##時間范圍內每隔一段時間輸出一張圖片
else:try:
os.mkdir(pathOut)exceptOSError:pass
print('Converting a video into frames......')if end_extract_time is notNone:
N= (end_extract_time - initial_extract_time)/extract_time_interval + 1success=True
count=0while success and count
cap.set(cv2.CAP_PROP_POS_MSEC, (1000*initial_extract_time+count*1000*extract_time_interval))
success,image=cap.read()ifsuccess:if notisColor:
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)print('Write a new frame: {}, {}th'.format(success, count+1))
cv2.imwrite(os.path.join(pathOut,"{}_{:06d}.jpg".format(output_prefix, count+1)), image, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality]) #save frame as JPEG file
count = count + 1
else:
success=True
count=0whilesuccess:
cap.set(cv2.CAP_PROP_POS_MSEC, (1000*initial_extract_time+count*1000*extract_time_interval))
success,image=cap.read()ifsuccess:if notisColor:
image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)print('Write a new frame: {}, {}th'.format(success, count+1))
cv2.imwrite(os.path.join(pathOut,"{}_{:06d}.jpg".format(output_prefix, count+1)), image, [int(cv2.IMWRITE_JPEG_QUALITY), jpg_quality]) #save frame as JPEG file
count = count + 1
##### 測試
pathIn = 'test.mp4'video2frames(pathIn, only_output_video_info=True)
pathOut= './frames1/'video2frames(pathIn, pathOut)
pathOut= './frames2'video2frames(pathIn, pathOut, extract_time_points=(1, 2, 5))
pathOut= './frames3'video2frames(pathIn, pathOut,
initial_extract_time=1,
end_extract_time=3,
extract_time_interval= 0.5)
pathOut= './frames4/'video2frames(pathIn, pathOut, extract_time_points=(0.3, 2), isColor =False)
pathOut= './frames5/'video2frames(pathIn, pathOut, extract_time_points=(0.3, 2), jpg_quality=50)
總結
以上是生活随笔為你收集整理的python3抓取图片视频_Python opencv提取视频中的图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 又拍云php表单,又拍云的表单api提交
- 下一篇: 300php是多少人民币,GV300S登