视频(图片)的读入—分帧—预处理Opencv
一、对图片的读取操作
通过cv2.imread()对图片进行读取,创建图片窗口,然后关闭。
1. import cv2
2. #读取图片文件的位置
3. image = cv2.imread('.\\Python baby.jpg')
4. #创建一个新的窗口
5. cv2.namedWindow("Image")
6. cv2.imshow("Image", image)
7.
8. cv2.waitKey(0)
9. cv2.destroyAllWindows()
二、对视频的读取及分帧操作
Opencv对视频文件的操作,可以通过cv2.VideoCapture(‘文件路径’)来读取,通过如果cv2.VideoCapture(0)则为通过摄像头进行采集。通过cap.read()函数将视频进行实时分帧处理,返回ret布尔值,反馈视频是否读到结尾,如果不是结尾且正确则返回True,如果已经读取到结尾返回False;
1. import cv2
2. #从指定路径读取视频,如果cv2.VideoCapture(0),从摄像头上读取
3. cap = cv2.VideoCapture('.\\input-video_3.mp4')
4.
5. ret = True
6.
7. #while(cap.isOpened()):
8. while(ret):
9. #按帧读取视频,
10. #返回ret布尔值,如果正确则返回True。
11. # 如果读取到文件末尾,则返回False。
12. # frame是每一帧的图像,是三维矩阵。
13. ret,frame = cap.read()
14. #播放视频
15. if ret == True:
16. #视频播放窗口的名称和当前帧
17. cv2.imshow('image', frame)
18. #每一帧的播放时间,毫秒,可根据显示速率调整
19. k = cv2.waitKey(20)
20. #中途停止按q键退出,播放完成任意键
21. if (k & 0xff == ord('q')):
22. cap.release()
23. cv2.destroyAllWindows()
24. break
25. #释放和销毁窗口
26. cap.release()
27. cv2.waitKey(0)
28. cv2.destroyAllWindows()
三、通过os对视频进行读取和分帧处理
如果有外部参数,则将未处理的视频的图像的路径通过sys.argv传递进来;如果没有则使用自定义的"freeway_clip.mp4"文件,使用VideoFileClip()函数将输入的视频文件进行切片分帧处理,将切出来的帧传给clip参数,进过process_an_image函数处理结束后,使用write_videofile对视频输出文件进行每帧的叠加处理。
# 图像视频流处理
if len(sys.argv) > 1:
video_path = sys.argv[1]
video_name = os.path.split(video_path)[1]
else:
#video_path = os.path.join('.\input_video','video_2.mp4')
video_path = "freeway_clip.mp4"
video_name = 'freeway_clip.mp4'
print('1')
try:
output = os.path.join('output_video','output_'+video_name)
#将输入视频切成帧
clip = VideoFileClip(video_path)
print('2')
#帧的输出结果
out_clip = clip.fl_image(process_an_image)
print('3')
#将输出帧进行叠加
out_clip.write_videofile(output, audio=False)
except:
print('can not detect lane!')