目录
一、视频读写
'''
一、视频读写
1、创建读取视频的对象
cap = cv.VideoCapture(filepath)
参数:
filepath:视频文件路径
2、视频的属性信息
2.1获取视频的某些属性
retval = cap.get(propId)
参数:
propId:从0到18的数字,每个数字表示视频的属性
常用的属性:
0:cv2.CAP_PROP_POS_MSEC 视频文件的当前位置(ms)
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_PROP_FRAME_COUNT 视频文件的帧
2.2修改视频的属性信息
cap.set(propId, value)
参数:
propid:属性的索引
value:修改之后的属性
3、判断图像是否读取成功
isornot = cap.isOpened()
读取成功则返回true,读取失败则返回False
4、获取视频的一帧图像
ret, frame = cap.read()
参数:
ret:若获取图像成功返回True,获取失败则返回False
Frame:获取到的某一帧的图像
5、调用cv.imshow()显示图像,在显示图像的时候使用cv.waitkey()设置适当的持续时间,如果太低视频会播放的特别快,如果太高就会播放的特别慢,通常情况下我们设置25ms
6、最后调用cap.realease()将视频释放掉
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pylab import mpl
cap = cv.VideoCapture('bosui.MP4')
# 判断是否读取成功
while(cap.isOpened()):
# 获取每一帧的图像
ret, frame = cap.read()
# 获取成功显示图像
if ret == True:
cv.imshow('frame',frame)
# 每一帧间隔为25ms
if cv.waitKey(25) & 0xFF == ord('q'):
break
# 释放视频图像
cap.release()
cv.destroyAllWindows()
二、保存视频
'''
二、保存视频
1、创建视频写入的对象
out = cv2.VideoWriter(fliename, fourcc, fps, frameSize)
参数:
fliename:视频保存的位置
fourcc:指定视频编解码器的4字节代码
fps:帧率
frameSize:帧大小
设置视频的编解码器,如下图
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)
利用cap.read()获取视频图像中的每一帧图像,并用out.write()将某一帧图像写入视频中
'''
三、图像追踪
'''
三、图像追踪
如何在一个视频当中使用meanshift算法来追踪一个运动的物体呢?
大致流程如下:
1、首先在图像上选定一个目标区域
2、计算选定区域的直方图分布,一般是HSV色彩空间的直方图
3、对下一帧图像b同样计算直方图分布
4、计算图像b中与选定区域直方图分布最为相似的区域,使用meanshift算法将选定区域沿着最为相似的部分进行移动,直到找到最相似的区域,
便完成了在图像b中的目标追踪
5、重复3到4的过程,就完成整个视频的目标追踪
API:cv.meanShift(probImage, window, criteria)
参数:
probImage: ROI区域,即目标的直方图的反射投影
Window:初始搜索窗口,就是定义ROI的rect
criteria:确定窗口搜索停止准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等
实现meanshift的主要流程是:
1、读取视频文件:cv.videoCapture()
2、感兴趣区域设置:获取第一帧图像,并设置目标区域,即感兴趣的区域
3、计算直方图:计算感兴趣区域的HSV直方图,并进行归一化
4、目标追踪:设置窗口搜索停止条件,直方图反向投影,进行目标追踪,并在目标位置绘制矩形框
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pylab import mpl
cap = cv.VideoCapture('bosui.MP4')
# 获取第一帧图像,并指定目标位置
ret, frame = cap.read()
# 目标位置(行,高,列,宽)
r, h, c, w = 600, 150, 800, 208
track_window = (c, r, w, h)
# 指定目标的感兴趣区域
roi = frame[r: r+h, c:c+w]
# 计算直方图
# 转换色彩空间(HSV)
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
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追踪
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)
if cv.waitKey(60) & 0xFF ==ord('q'):
break
else:
break
cap.release()
cv.destroyAllWindows()
四、Camshift
'''
四、Camshift
首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的额位置和大小更新搜索窗口
将
# 进行meanshift追踪
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)
改为:
# 进行camshift追踪
ret, track_window = cv.CamShift(dst, track_window, term_cirt)
# 检测追踪结果
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame, [pts], True, 255, 2)
'''
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pylab import mpl
cap = cv.VideoCapture('bosui.MP4')
# 获取第一帧图像,并指定目标位置
ret, frame = cap.read()
# 目标位置(行,高,列,宽)
r, h, c, w = 600, 150, 800, 208
track_window = (c, r, w, h)
# 指定目标的感兴趣区域
roi = frame[r: r+h, c:c+w]
# 计算直方图
# 转换色彩空间(HSV)
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
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追踪
ret, track_window = cv.CamShift(dst, track_window, term_crit)
# 检测追踪结果
pts = cv.boxPoints(ret)
pts = np.intp(pts)
img2 = cv.polylines(frame, [pts], True, 255, 2)
if cv.waitKey(60) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv.destroyAllWindows()