# 打开终端输入,没有装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毫秒即可。
# 获取相机/视频的各种属性–常见函数
"""
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就没有问题了。