Python-OpenCV 读取和保存视频和解决保存失败的原因分析

一、安装OpenCV

# 打开终端输入,没有装pip的话装上pip

pip install opencv-contrib-python

# 打开Python交互环境,打印opencv版本

import cv2

print(cv2.__version__)

二、读取和保存视频


# coding=utf8

import cv2

# 1、用摄像头捕获视频
# cap = cv.VideoCapture(0)  # 0表示笔记本电脑的内置摄像头,1或者其他可以选择其他摄像头。
#
# while True:
#     # Capture frame-by-frame
#     ret, frame = cap.read()
#
#     # Our operation on the frame come here
#     gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # 视频转换为灰度视频
#
#     # Display the resulting frame
#     cv.imshow('frame', gray)
#     if cv.waitKey(0) & 0xFF == ord('q'):
#         break
#
# # when everything done, release the capture
# cap.release()
# cv.destroyAllWindows()

 

# 2、保存视频

# 采用本地视频测试
path = "videos/ceshi.mp4"
cap = cv2.VideoCapture(path)

# 获取视频的有关参数
w = int(cap.get(3))  # 获取视频的width
h = int(cap.get(4))  # 获取视频的height
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('videos/localvideo.avi', fourcc, 15.0, (w, h))

# 定义视频编码,创建视频输出对象
# fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 保存视频的编码
# 设置帧频率fps=20.0,存储的视频大小为1280*720,具体看输入视频的大小,不然会报错。
# out = cv2.VideoWriter('videos/output.mp4', fourcc, 20.0, (1280, 720))

# 等价于

# 视频的宽度    width = int(reader.get(cv2.CAP_PROP_FRAME_WIDTH))    

# 视频的高度    height = int(reader.get(cv2.CAP_PROP_FRAME_HEIGHT))    

# 视频的帧率    fps = reader.get(cv2.CAP_PROP_FPS)    

# 视频的编码    fourcc = int(reader.get(cv2.CAP_PROP_FOURCC))

# 定义视频输出writer = cv2.VideoWriter("videos/output.mp4", fourcc, fps, (width, height))


# while cap.isOpened():
#     ret, frame = cap.read()
#     if ret == True:
#         frame = cv.flip(frame, 1)  # 图像翻转:0 垂直翻转;1 水平翻转; -1 水平垂直翻转
#
#         # write the flipped frame
#         out.write(frame)
#
#         cv.imshow('frame', frame)
#         if cv.waitKey(1) & 0xFF == ord('q'):
#             break
#     else:
#         break
#
# # release everything if job is finished
# cap.release()
# out.release()
# cv.destroyAllWindows()

 

# 3、从摄像头中获取视频
# cap = cv.VideoCapture(0)
# while True:
#     ret, frame = cap.read()                       # 读取帧
#     gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # 灰度化展示
#     cv.imshow('frame', gray)
#     if cv.waitKey(1) & 0xFF == ord('q'):          # 按‘q’退出
#         break
#
# 释放资源并关闭窗口
# cap.release()
# cv.destroyAllWindows()

 

# 4、从文件中播放视频
# import cv2
# cap = cv2.VideoCapture('output.avi')
# while cap.isOpened():
#     ret, frame = cap.read()
#     cv2.imshow('frame', frame)
#     if cv2.waitKey(25) & 0xFF == ord('q'):
#         break
# cap.release()
# cv2.destroyAllWindows()

# cv2.waitKey():
# 在显示帧时,选择适当的cv2.waitKey()时间,如果该值太小,视频会非常快,
# 如果它太大,视频会很慢(这可以用来慢动作显示视频)。 正常情况下,25毫秒即可。

 

三、OpenCV获取相机/视频的各种属性

# 获取相机/视频的各种属性–常见函数
"""
retval = cv2.VideoCapture.get(propId)   #打开视频文件或者相机设备进行视频捕获。
propId 常见取值如下:【从0开始】

cv2.CAP_PROP_POS_MSEC:     视频文件的当前位置(ms)
cv2.CAP_PROP_POS_FRAMES:   从0开始索引帧,帧位置。
cv2.CAP_PROP_POS_AVI_RATIO:视频文件的相对位置(0表示开始,1表示结束)
cv2.CAP_PROP_FRAME_WIDTH:  视频流的帧宽度。
cv2.CAP_PROP_FRAME_HEIGHT: 视频流的帧高度。
cv2.CAP_PROP_FPS:          帧率
cv2.CAP_PROP_FOURCC:       编解码器四字符代码
cv2.CAP_PROP_FRAME_COUNT:  视频文件的帧数
cv2.CAP_PROP_FORMAT:       retrieve()返回的Mat对象的格式。
cv2.CAP_PROP_MODE:         后端专用的值,指示当前捕获模式
cv2.CAP_PROP_BRIGHTNESS:图像的亮度,仅适用于支持的相机
cv2.CAP_PROP_CONTRAST:  图像对比度,仅适用于相机
cv2.CAP_PROP_SATURATION:图像饱和度,仅适用于相机
cv2.CAP_PROP_HUE:       图像色调,仅适用于相机
cv2.CAP_PROP_GAIN:      图像增益,仅适用于支持的相机
cv2.CAP_PROP_EXPOSURE:    曝光,仅适用于支持的相机
cv2.CAP_PROP_CONVERT_RGB:布尔标志,指示是否应将图像转换为RGB。
"""

四、视频保存失败的原因

多数是因为编码或者视频的宽度和写入的frame宽度不同,导致写入失败。因此,最好使用输入视频的编码(fourcc),视频的宽度也要设置对。不知道处理后的图片的大小,那就打印下图片的大小就行了,保存视频时,视频的大小要和图片的大小一致。

python-opencv写视频几个步骤:
fourcc = cv2.VideoWriter_fourcc(*‘DIVX’)
out = cv2.VideoWriter(‘D:/GestureVideo/’+video_name, fourcc, 10, (640, 480))
out.write(frame)
out.release()

bug1:代码生成exe文件后运行,保存的视频是0kb
网上说的opencv的dll文件放在exe同一目录,试了没用。
将编码器从DIVX改成MJPG解决了问题,不知道为何。


bug2:代码生成exe文件后运行,保存的视频不是0kb,但是打开时提示视频损坏
没有正确release(直接关闭dos窗口)。


bug3:视频文件无法读取,显示只有6kb
视频文件大小设置出了问题,可以先去查看读取的视频的属性,看它的宽和高,再设置w、h就没有问题了。

你可能感兴趣的:(计算机视觉)