OpenCV学习之视频处理

目录

一、视频读写

二、保存视频

三、图像追踪

四、Camshift


一、视频读写

'''
一、视频读写
    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()

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
非常好的问题!OpenCV 是一个开源的计算机视觉库,提供了许多功能强大的图像和视频处理技术。对于视频处理OpenCV 提供了一些基本的操作,如读取、写入和显示视频,以及一些更高级的功能,如视频分割、运动检测和目标跟踪等。以下是一些常见的视频处理任务和 OpenCV 中相应的函数: 1. 读取视频:使用 `cv2.VideoCapture` 函数来打开视频文件,并使用 `read` 方法逐帧读取视频内容。 2. 写入视频:使用 `cv2.VideoWriter` 函数创建一个视频写入对象,并使用 `write` 方法将每一帧写入视频。 3. 显示视频:使用 `cv2.imshow` 函数在窗口中显示视频帧,并结合 `cv2.waitKey` 函数来控制显示的帧率。 4. 视频分割:可以使用背景减除技术来实现视频分割。OpenCV 中提供了 `cv2.createBackgroundSubtractorMOG2` 和 `cv2.createBackgroundSubtractorKNN` 函数来创建背景减除器,然后通过 `apply` 方法将其应用于每一帧图像。 5. 运动检测:可以通过计算相邻帧之间的差异来进行运动检测。OpenCV 中提供了 `cv2.absdiff` 函数来计算两幅图像的差异,并可通过阈值化和形态学操作来提取感兴趣的运动区域。 6. 目标跟踪:可以使用目标检测算法(如 Haar 特征检测)或机器学习算法(如基于深度学习的目标检测器)来识别和跟踪视频中的特定目标。OpenCV 中提供了 `cv2.CascadeClassifier` 类来实现 Haar 特征检测器,以及一些预训练的深度学习模型供目标检测使用。 这些只是 OpenCV视频处理功能的一小部分,你可以根据具体的需求进一步探索和使用 OpenCV 的其他函数和方法来完成更复杂的视频处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼翻身的路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值