【OpenCV】(九)视频读写与视频追踪

 目录

视频读取与显示

保存视频

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)

 运行结果

【OpenCV】(九)视频读写与视频追踪_第1张图片

MeanShift视频追踪

# 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()

运行结果

CamiShift视频追踪

# 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】(九)视频读写与视频追踪

你可能感兴趣的:(图像处理,opencv,人工智能,计算机视觉,python)