opencv-python计算视频光流

光流基本概念

光流表示的是相邻两帧图像中每个像素的运动速度和运动方向。具体:光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

opencv光流算子

参考链接

光流法大全(DeepFlow、DenseFlow、DisFlow、FbFlow、PCAFlow、SimpleFlow、TV_L1)

视频光流计算demo

import os
import cv2
import flow_vis
import numpy as np
from tqdm import tqdm


def compute_flow(prev, curr, bound=15):

    '''Farneback optical flow'''
    # flow = cv2.calcOpticalFlowFarneback(prev=prev, next=curr, flow=None, pyr_scale=0.5, levels=5,winsize=15, iterations=3, poly_n=5, poly_sigma=1.1, flags=cv2.OPTFLOW_FARNEBACK_GAUSSIAN)

    ''' TVL1 optical flow(需安装opencv_contrib)'''
    TVL1 = cv2.optflow.DualTVL1OpticalFlow_create()
    flow = TVL1.calc(prev, curr, None)

    ''' deepflow optical flow (需安装opencv_contrib)'''
    # inst = cv2.optflow.createOptFlow_DeepFlow()
    # flow = inst.calc(prev, curr, None)

    ''' sparse to dense flow optical flow (需安装opencv_contrib)'''
    # flow = cv2.optflow.calcOpticalFlowSparseToDense(prev, curr)

    ''' pca flow optical flow (需安装opencv_contrib)'''
    # inst = cv2.optflow.createOptFlow_PCAFlow()
    # flow = inst.calc(prev, curr, None)

    ''' DIS optical flow '''
    # dis = cv2.DISOpticalFlow_create(2)
    # flow = dis.calc(prev, curr, None)

    return flow


def video2flow(video_path:str, flow_path:str):
    ''' 读取视频,获取视频基本信息 '''
    videoCapture = cv2.VideoCapture(video_path)
    if not videoCapture.isOpened():  # 若视频文件读取失败,读取下一段视频
        print('视频打开失败!!!')
        print(video_path)
        return False
    total_frames = int(videoCapture.get(cv2.CAP_PROP_FRAME_COUNT))  # 获取视频总帧数
    # fourcc = int(videoCapture.get(cv2.CAP_PROP_FOURCC))  # 原生不支持h264编码
    fps = videoCapture.get(cv2.CAP_PROP_FPS)  # 获取视频帧率
    w = int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取图像宽度
    h = int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取图像高度

    '''光流视频 写入设置 '''
    # fourcc = cv2.VideoWriter_fourcc(*'MJPG')  # avi格式
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # MP4格式
    video_flow = cv2.VideoWriter(flow_path, fourcc, fps, frameSize=(w, h), isColor=True)

    ''' 计算光流并保存 '''
    success, prev = videoCapture.read()
    total_frames -= 1
    if not success:
        print('视频首帧读取失败')
        return False

    pbar = tqdm(total=total_frames)
    while total_frames:
        success, curr = videoCapture.read()
        if success:
            prev_gray = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
            curr_gray = cv2.cvtColor(curr, cv2.COLOR_BGR2GRAY)
            tmp_flow = compute_flow(prev_gray, curr_gray)
            rgb = flow_vis.flow_to_color(tmp_flow, convert_to_bgr=False)
            video_flow.write(rgb.astype(np.uint8))
            prev = curr

            # cv2.imshow('frame', flow_xy.astype(np.uint8))
            # cv2.waitKey(0)=='q'
        else:
            print('某中间帧读取失败,光流视频生成失败')
            return False
        pbar.update(1)
        total_frames -= 1

    videoCapture.release()
    video_flow.release()
    cv2.destroyAllWindows()

    return True


if __name__=='__main__':
    video_path = './forest.mp4'
    flow_path = './forest_flow.mp4'
    print(video2flow(video_path, flow_path))

其中demo中flow_vis使用的光流调色板(Color wheel)如下,颜色代表光流方向,颜色深度代表光流速度
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/360949.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

仰暮计划|“那时候在生产队下面,集体干活,吃大锅饭,由队里分粮食,吃不饱饭是常事,队里分的粮食就那么点,想要吃饱真的太难了”

希望未来的中国越来越好,大家的生活也越来越好 老人是1955年在河南省洛阳市洛宁县的一个小山村里出生的,前半辈子为了生活,为了孩子而打拼,虽然经历了不少的苦难,但后半辈子也算是苦尽甘来,生活美满。现在就…

【MATLAB源码-第130期】基于matlab的BPSK-ZF迫零均衡,对比均衡前后的误码率曲线以及理论曲线。

操作环境: MATLAB 2022a 1、算法描述 信道均衡是通信系统中的一项关键技术,其主要目的是减少或消除由于信道特性导致的信号失真。在数字通信中,尤其是在无线通信系统中,由于多径传播等原因,接收到的信号会受到严重的…

浅析云性能监控的重要性及核心功能

随着企业日益依赖云计算服务,云性能监控变得至关重要。云性能监控是一种实时监测、分析和报告云基础设施及应用程序性能的方法。本文将深入探讨云性能监控的目的、重要性以及其核心功能,以帮助企业更好地理解和实施这一关键的运维实践。 一、云性能监控的…

[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

MongoDB安装以及卸载,通过Navicat 15 for MongoDB连接MongoDB

查询id: docker ps [rootlocalhost ~]# docker stop c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rm c7a8c4ac9346 c7a8c4ac9346 [rootlocalhost ~]# docker rmi mongo sudo docker pull mongo:4.4 sudo docker images 卸载旧的 sudo docker stop mong…

Django4.2(DRF)+Vue3 读写分离项目部署上线

文章目录 1 前端2 后端2.1 修改 settings.py 文件关于静态文件2.2 关于用户上传的文件图片 3 Nginx4 镜像制作4.1 nginx4.3 Django镜像4.3.1 构建 5 docker-compose 文件内容 1 前端 进入前端项目的根目录,运行如下命令进行构建 npm run build构建完成后&#xff…

Apple Vision Pro 评测:这款顶尖头显仅是对未来的初步探索

原文:Apple Vision Pro Review: The Best Headset Yet Is Just a Glimpse of the Future 作者:Joanna Stern 戴上 Apple Vision Pro 混合现实头显整整近 24 小时后,有几件事让我颇感意外: 我居然没感到恶心。我竟然高效完成了大…

云纱网签约百望云,联手打造数字化产业闭环

近日,百望云签约广东云纱数字科技有限公司,共建数字化发票管理系统,赋能产业链上下游供应商的协同交易与运营,助力企业实现数字化四流合一交易,打造数字化产业闭环。 云纱网是广东云纱数字科技有限公司依托于深厚的产业…

利用牛顿方法求解非线性方程(MatLab)

一、算法原理 1. 牛顿方法的算法原理 牛顿方法(Newton’s Method),也称为牛顿-拉弗森方法,是一种用于数值求解非线性方程的迭代方法。其基本思想是通过不断迭代来逼近方程的根,具体原理如下: 输入&#…

STM32——DMA

STM32——DMA 1.DMA介绍 什么是DMA? DMA(Direct Memory Access,直接存储器访问) 提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU,在这个时间中&…

移动端设计规范 - 文字使用规范

这是一篇关于移动端产品界面设计时,文字大小的使用规范,前端人员如果能了解一点的话,在实际开发中和设计沟通时,节省沟通成本,也能提高设计落地开发时的还原度。 关于 在做移动端产品设计时,有时候使用文字…

fpmarkets实例讲解止损,控制风险如此简单

止损和止盈是交易者在交易时都需要了解的两个基本设置,在上篇文章fpmarkets澳福和各位投资者分享 了止盈如何工作,今天我们继续实例讲解止损,在交易中控制不必要的风险。 止损单是基本交易订单之一。如果市场走向与预期相反,它会限…

[机器学习]LFM梯度下降算法

一.LFM梯度下降算法 2.代码实现 # 0. 引入依赖 import numpy as np import pandas as pd# 1. 数据准备 # 评分矩阵R R np.array([[4,0,2,0,1],[0,2,3,0,0],[1,0,2,4,0],[5,0,0,3,1],[0,0,1,5,1],[0,3,2,4,1],]) # 二维数组小技巧:取行数R.shape[0]和len(R)&#x…

【SPIE独立出版|长春理工大学主办】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

DSCC 2024已通过SPIE出版社审核,ISSN号已确定:ISSN: 0277-786X,往届均已见刊EI检索! 2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024) 2024 4th International Conference on Digital Signal and…

Windows Server 2025 Azure Arc 介绍

Azure Arc 是一个扩展 Azure 平台的桥梁,可帮助你构建可灵活地跨数据中心、边缘和多云环境运行的应用程序和服务。使用一致的开发、操作和安全模型来开发云原生应用程序。 Azure Arc 可在新的和现有的硬件、虚拟化和 Kubernetes 平台、物联网设备和集成系统上运行。…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先,你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来,你需要将Flutter…

【项目管理】整合管理

一、管理基础 1、项目整合管理由项目经理负责,项目经理负责整合所有其他知识领域的成果,并掌握项目总体情况。项目整合管理的责任不能被授权或转移,项目经理必须对整个项目承担最终责任。整合是项目经理的一项关键技能。执行项目整合时项目经…

西门子WINCC触摸屏的Audit功能:追溯生产数据与用户操作行为

1为什么要用Audit功能? 在许多工业领域,生产数据的可追溯性及其文档记录变得愈加重要,如医药行业、食品饮料以及相关的机械工程行业。与书面文档相比,以电子形式存储生产数据具有许多优点,如采集和记录数据更方便&…

【HarmonyOS】鸿蒙开发之页面路由——第2.4章

页面路由: 应用程序中实现不同页面之间的跳转和数据传递。 Router有两种页面跳转模式 1.router.pushUrl() 目标耶不会被替换当前页,而是压入页面栈,可以使用router.back()返回当前页 2.router.replaceUrl() 目标替换当前页,当前页会被销毁并…
最新文章