视频读取与显示
保存视频
MeanShift视频追踪
CamiShift视频追踪
# 视频读取与显示
import cv2 as cv
# 创建读取视频的对象
# cap = cv2.VideoCapture(filepath)
# filepath: 视频文件路径
cap = cv.VideoCapture('video/1.mp4')
# 判断图像是否读取成功
# isornot = cap.isOpened()
# 若读取成功则返回true,否则返回false
while (cap.isOpened()):
# 获取视频的一帧图像
# ret, frame = cap.read()
# ret: 若获取成功返回true,获取失败,返回false
# frame: 获取到的某一帧的图像
ret, frame = cap.read()
# 获取成功显示图像
# 调用cv2.imshow()显示图像,在显示图像时使用cv2.waitkey()设置适当的持续时间,如果太低视频会播放地非常快,如果太高,视频会播放地非常慢,通常设置为25ms
if ret == True:
cv.imshow('frame', frame)
# 每一帧间隔为25ms
if cv.waitKey(25) & 0xFF == ord('q'):
break
# 释放视频
# cap.release()
cap.release()
cv.destroyAllWindows()
运行结果
# 保存视频
import cv2 as cv
# 读取视频
cap = cv.VideoCapture("video/1.mp4")
# 获取视频的某些属性
# retval = cap.get(propId)
# propId: 从0到18的数字,每个数字表示视频的属性
# 0: cv2.CAP_PROP_POS_MSEC 视频文件当前位置
# 1: cv2.CAP_PROP_POS_FRAMES 从0开始索引帧,帧位置
# 2: cv2.CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(0表示开始,1表示结束)
# 3: cv2.CAP_PROP_FRAME_WIDTH 视频流的帧宽度
# 4: cv2.CAP_PROP_FRAME_HEIGHT 视频流的帧高度
# 5: cv2.CAP_PROP_FPS 帧率
# 6: cv2.CAP_PROP_FOURCC 编解码器四字符代码
# 7: cv2.CAP_FRAME_COUNT 视频文件的帧
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# 创建视频写入的对象
# out = cv2.VideoWriter(filename, fourcc,fps, frameSize)
# filename: 视频保存的位置
# fourcc: 指定视频编解码器的4字节代码
# fps: 帧率
# frameSize: 帧大小
out = cv.VideoWriter('video/out.mp4', cv.VideoWriter_fourcc('M', 'P', '4', 'V'), 10, (frame_width, frame_height))
while (True):
# 获取视频中的每一帧图像
ret, frame = cap.read()
if ret == True:
# 将每一帧图像写入到输出文件中
out.write(frame)
else:
break
# 释放资源
cap.release()
out.release()
cv.destroyAllWindows()
# 设置视频的编解码器
# retval = cv2.VideoWriter_fourcc(c1, c2, c3, c4)
# c1, c2, c3, c4: 是视频编解码器的4字节代码,在fourcc.org中找到可用代码列表,与平台紧密相关,常用的有:
# 在Windows中: DIVX(.avi)
# 在OS中: MJPG(.mp4), DIVX(.avi), X264(.mkv)
运行结果
# MeanShift视频追踪算法
import cv2 as cv
# 读取视频
cap = cv.VideoCapture("video/1.mp4")
# 获取第一帧图像,并指定目标位置
ret, frame = cap.read()
# 目标位置
r, h, c, w = 500, 1000, 1000, 300
track_window = (c, r, w, h)
# 指定目标的感兴趣区域
roi = frame[r:r+h, c:c+w]
# 计算直方图
# 转换颜色区间
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 去除低亮度的值
# mask = cv.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
# 计算直方图
roi_hist = cv.calcHist([hsv_roi], [0], None, [180], [0, 180])
# 归一化
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
# 目标追踪
# 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
while(True):
# 获取每一帧图像
ret, frame = cap.read()
if ret == True:
# 计算直方图的反向投影
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 进行MeanShift追踪
# cv.meanShif(probImage, window, criteria)
# problmage: ROI区域,即目标的直方图的反向投影
# window: 初始化搜索窗口,就是定义ROI的rect
# criteria: 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等
ret, track_window = cv.meanShift(dst, track_window, term_crit)
# 将追踪位置绘制在视频上,并进行显示
x, y, w, h = track_window
img2 = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
cv.imshow('frame', img2)
# 60s一帧,按q退出
if cv.waitKey(60) & 0xFF == ord('q'):
break
# 资源释放
cap.release()
cv.destroyAllWindows()
运行结果
# CamShift视频追踪算法
# CamShift算法又称连续自适应MeanShift算法
# CamShift算法首先应用MeanShift,一旦MeanShift收敛,它就会更新窗口大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口
import cv2 as cv
import numpy as np
# 读取视频
cap = cv.VideoCapture("video/1.mp4")
# 获取第一帧图像,并指定目标位置
ret, frame = cap.read()
# 目标位置
r, h, c, w = 500, 1000, 1000, 300
track_window = (c, r, w, h)
# 指定目标的感兴趣区域
roi = frame[r:r+h, c:c+w]
# 计算直方图
# 转换颜色区间
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 去除低亮度的值
# mask = cv.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
# 计算直方图
roi_hist = cv.calcHist([hsv_roi], [0], None, [180], [0, 180])
# 归一化
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
# 目标追踪
# 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
while(True):
# 获取每一帧图像
ret, frame = cap.read()
if ret == True:
# 计算直方图的反向投影
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 进行CamShift追踪
# cv.CamShif(probImage, window, criteria)
# problmage: ROI区域,即目标的直方图的反向投影
# window: 初始化搜索窗口,就是定义ROI的rect
# criteria: 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等
ret, track_window = cv.CamShift(dst, track_window, term_crit)
# 将追踪的位置绘制在视频上,并进行显示
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame, [pts], True, 222, 2)
cv.imshow('frame', img2)
# 60s一帧,按q退出
if cv.waitKey(60) & 0xFF == ord('q'):
break
# 资源释放
cap.release()
cv.destroyAllWindows()
运行结果
【OpenCV】(一)图像基础处理
【OpenCV】(二)图像几何变换
【OpenCV】(三)图像形态学操作
【OpenCV】(四)图像平滑操作
【OpenCV】(五)图像直方图操作
【OpenCV】(六)图像边缘检测
【OpenCV】(七)图像模板匹配和霍夫变换
【OpenCV】(八)Harris和Shi—tomas图像角点检测
【OpenCV】(九)视频读写与视频追踪