【OpenCV】(十九)光流估计

opencv学习(十九)之均值滤波blur 从本篇开始采用opencv3.2版本进行编译!!!均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值。其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围的其他邻域像素点,去掉像素本身,将其邻域像素点相加然后取平均值即为该像素点的新的像素值,这就是均值滤波的本质。官方给出的kernel模板如下: opencv提供了blur函数实现均值滤波操作,其原型 阅读详情

系列内容:OpenCV概述与环境配置,OpenCV基础知识和绘制图形,图像的算数与位运算,图像视频的加载和显示,图像基本变换,滤波器,形态学,图像轮廓,图像直方图,车辆统计项目,特征检测和匹配,图像查找和拼接,虚拟计算器项目,信用卡识别项目,图像的分割与修复,人脸检测与车牌识别,目标追踪,答题卡识别判卷与文档ocr扫描识别,光流估计

光流,顾名思义,光的流动。比如人感受到的夜空中划过的流星。在计算机视觉中,定义图像中对象的移动,这个移动可以是相机移动或者物体移动引起的。具体是指,视频图像的一帧中的代表同一对象(物体)像素点移动到下一帧的移动量,使用二维向量表示。

光流如图19.1所示:

19.1-光流

根据是否选取图像稀疏点进行光流估计,可以将光流估计分为稀疏光流和稠密光流。

OpenCV中提供了光流估计的接口,包括稀疏光流估计算法cv2.calcOpticalFlowPyrLK(),和稠密光流估计cv2.calcOpticalFlowFarneback()。其中稀疏光流估计算法为Lucas-Kanade算法,该算法为1981年由Lucas和Kanade两位科学家提出的,最为经典也较容易理解的算法。

传统算法 Lucas-Kanade

为了将光流估计进行建模,Lucas-Kanade做了三个重要的假设:

  • (1)亮度恒定:同一点随着时间的变化,其亮度不会发生改变。
  • (2)小运动:随着时间的变化不会引起位置的剧烈变化,只有小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。
  • (3)空间一致:一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。因为光流法基本方程约束只有一个,而求x,y方向的速度,有两个未知变量。所以需要连立n多个方程求解。

传统算法 Lucas-Kanade如图19.2所示:

19.2-传统算法 Lucas-Kanade

约束方程:

I(x, y, t) = I(x + dx, y + dy, t + dt) \\ = I(x, y, t) + \frac{\partial I}{\partial x} dx + \frac{\partial I}{\partial y} dy + \frac{\partial I}{\partial t} dt \\ I_x dx + I_y dy + I_t dt = 0

I_x u + I_y v = -I_t \Longrightarrow \begin{bmatrix} I_x & I_y \end{bmatrix} \cdot \begin{bmatrix} u \\ v \end{bmatrix} = -I_t

矩阵表示,如图19.3所示:

19.3-矩阵表示

最小二乘法,如图19.4所示:

19.4-最小二乘法

cv2.calcOpticalFlowPyrLK()

参数:

  • prevImage:前一帧图像
  • nextImage:当前帧图像
  • prevPts:待跟踪的特征点向量
  • winSize:搜索窗口的大小
  • maxLevel:最大的金字塔层数

返回:

  • nextPts:输出跟踪特征点向量
  • status:特征点是否找到,找到的状态为1,未找到的状态为0

示例代码:

import numpy as np
import cv2
#读取视频
cap=cv2.VideoCapture('./vehicles.mp4')
#读第一帧图片
ret,old_frame=cap.read()
#变成黑白
old_gray=cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)
#检测角点
feature_params=dict(
    maxCorners=100,
    qualityLevel=0.3,
    minDistance=7
)
p0=cv2.goodFeaturesToTrack(old_gray,mask=None,**feature_params)

#创建一个mask
mask=np.zeros_like(old_frame)

#随机颜色
color=np.random.randint(0,255,(100,3))

while True:
    ret,frame=cap.read()
    if frame is None:
        break
    gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    #光流估计
    p1,st,err=cv2.calcOpticalFlowPyrLK(old_gray,gray,p0,None,winSize=(15,15),maxLevel=2)

    #哪些特征点找到,哪些未找到
    good_new=p1[st==1]
    good_old=p0[st==1]

    #绘制轨迹
    for i, (new,old) in enumerate(zip(good_new,good_old)):
        a,b=new.ravel()
        c,d=old.ravel()
        a,b,c,d = int(a),int(b),int(c),int(d)
        mask=cv2.line(mask,(a,b),(c,d),color[i].tolist(),2)
        frame=cv2.circle(frame,(a,b),5,color[i].tolist(),-1)

    img=cv2.add(frame,mask)

    cv2.imshow('frame',img)
    key=cv2.waitKey(150)
    if key==27:
        break

    #更新
    old_gray=gray.copy()
    p0=good_new.reshape(-1,1,2)

cv2.destroyAllWindows()
cap.release()

运行结果:

车辆光流,如图19.5所示:

19.5-车辆光流

本系列完

第三十九节:视频处理-光流法 (Lucas-Kanade, Dense) 本文深入探讨了计算机视觉中的光流法,特别是OpenCV库中的Lucas-Kanade稀疏光流和Dense光流两种算法。文章首先介绍了光流的基本概念和三大核心假设,然后详细解析了Lucas-Kanade算法的原理和OpenCV实现,包括特征点检测、光流计算和性能优化策略。接着,文章探讨了Dense光流的特点、Farneback算法的核心步骤及其代码实现,并提供了参数调优指南。最后,文章对比了两种光流算法的性能和应用场景,提出了混合使用策略,并讨论了光流法面临的挑战和未来发展方向。 阅读详情

相关推荐

OpenCV入门(十九)快速学会OpenCV 18 圆环检测

霍夫变换除了用来检测直线外,也能用来检测其他几何对象。实际上,只要是能够用一个参数方程表示的对象,都适合用霍夫变换来检测。用霍夫圆变换来检测图像中的圆,与使用霍夫直线变换检测直线的原理类似。在霍夫圆变换中,需要考虑圆半径和圆心(x坐标、y坐标)共3个参数。在OpenCV中,采用的策略是两轮筛选。第1轮筛选找出可能存在圆的位置(圆心);第2轮再根据第1轮的结果筛选出半径大小。

小幽余生不加糖 3439

opencv c++摄像头光流_(三十九)稠密光流----Farneback

时间为友,记录点滴。我们在洋洋洒洒介绍过KLT时,有提到:在光流方程中,有两个未知数,一个方程,两个未知数,初中生都知道是没办法求解的。但是这可难不倒Bruce D. Lucas 和Takeo Kanade,他们提出来稀疏光流跟踪算法。其实有个概念隐含在原理中,为什么称KLT为稀疏光流跟踪算法?这一切都可以从稀疏矩阵说起。什么是稀疏矩阵?在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非...

weixin_39750854的博客 883

opencv for android(十九):使用opencv扫描解析二维码

效果如图: opencv for android(十九):使用opencv扫描解析二维码 opencv for android(十八):使用opencv实时人脸马赛克 opencv for android(十七):使用opencv的dnn模块加载caffe模型进行人脸识别 opencv for android(十六):opencv在android上的录制avi格式的视频 opencv for android(十五):opencv的边缘检测,膨胀与腐蚀的应用:车牌识别(2) opencv for

qq_28548825的博客 1269

【转载】OpenCV-Python系列之稀疏光流(五十九)

之前介绍的两种算法对于视频中的跟踪而言仍然有一定的局限性。这次我们来讨论一种光流估计的方法用于进行目标跟踪。 光流是物体或者摄像头的运动导致的两个连续帧之间的图像对象的视觉运动的模式。它是一个向量场,每个向量是一个位移矢量,显示了从第一帧到第二帧的点的移动,如图: 它显示了一个球在5个连续帧里的移动。箭头显示了它的位移矢量。光流在很多领域有应用: ·移动构建 ·视频压缩 ·视频稳定 光流在很多假设下有效: 1.物体像素强度在连续帧之间不变化 2.邻居像素有相似运动 考虑第一帧里的一个像素I(x

weixin_44237705的博客 941

OpenCV入门(二十九)快速学会OpenCV 28 K均值聚类

当我们要预测的是一个离散值时,做的工作就是“分类”。例如,要预测一个孩子能否成为优秀的运动员,其实就是要将他分到“好苗子”(能成为优秀的运动员)或“普通孩子”(不能成为优秀运动员)的类别。当我们要预测的是一个连续值时,做的工作就是“回归”。例如,预测一个孩子将来成为运动员的指数,计算得到的是0.99或者0.36之类的数值。机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个“簇(cluster)”。这些自动形成的簇,可能对应着不同的潜在概念,例如“篮球苗子”、“长跑苗子”。

小幽余生不加糖 1421

【OpenCV】第十九章: 视频操作入门

一、读取视频 二、保存视频

因为热爱所以坚持 3700

稀疏光流python_【原创】OpenCV-Python系列之稀疏光流(五十九)

OpenCV-Python系列之稀疏光流之前介绍的两种算法对于视频中的跟踪而言仍然有一定的局限性。这次我们来讨论一种光流估计的方法用于进行目标跟踪。光流是物体或者摄像头的运动导致的两个连续帧之间的图像对象的视觉运动的模式。它是一个向量场,每个向量是一个位移矢量,显示了从第一帧到第二帧的点的移动,如图:它显示了一个球在5个连续帧里的移动。箭头显示了它的位移矢量。光流在很多领域有应用:·移动构建·视频...

weixin_40004057的博客 420

​基于stm32的智能空气加湿器设计(含源代码和Proteus仿真)

课程设计分享

LoongSTUDIO的博客 2929

OpenCV图像处理

图像处理

lzh的博客 2338

Python+OpenCV实战:雨天车牌识别准确率提升300%的5个关键技巧

本文针对雨天车牌识别准确率骤降的难题,分享了五个基于Python和OpenCV的实战技巧。通过暗通道先验去雾、雨纹抑制、光照不变量颜色空间转换、多尺度自适应阈值分割以及融合传统特征与轻量级深度学习的混合识别策略,系统性地提升了算法在恶劣天气下的鲁棒性。这些方法能有效解决图像模糊、对比度低、字符断裂粘连等问题,为智能交通等实际应用提供可靠解决方案。

k8l9m0n的博客 716

海思Hi3061M MCU:为高速吹风筒市场注入智能动力

此外,海思还提供了丰富的软件开发工具和生态环境组件,帮助开发者快速实现复杂功能。高速吹风筒因其高效的风力和快速的干燥效果,近年来在市场上越来越受欢迎。然而,传统的高速吹风筒在性能、噪音和使用寿命等方面仍有改进的空间。凭借其高性能、低功耗、低噪声和易用的开发工具,为高速吹风筒市场带来了全新的解决方案。这不仅提高了用户的使用体验,还延长了电机的使用寿命。这不仅减少了电机的电磁噪声,还提高了电机的运行效率。还支持风机顺逆风启动适配多种电阻范围的电机,进一步提高了吹风筒的适用性和灵活性。

2401_83448585的博客 2016

《opencv实用探索·十九》光流法检测运动目标

qualityLevel:一般情况下设置0.01,较小的 qualityLevel 值会选择图像中质量较高的角点,即灰度梯度变化较为显著的地方。较大的 qualityLevel 值会放宽对角点质量的要求,接受更多的角点,即使它们的质量不太高。然而,它的性能可能受到场景中运动的复杂性、遮挡、图像噪声等因素的影响,因此在特定应用中需要仔细考虑其局限性。在光流法的实现中,有几种不同的方法,其中最常见的是Lucas-Kanade方法和Horn-Schunck方法。这意味着在相邻帧中,同一物体的灰度值应该是相似的。

cs1395293598的博客 1879

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6412

opencv学习(三十九)之反向投影calcBackProject()

1.概述反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式,简单来讲,反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征。反向投影在某一位置的值就是原图对应位置像素值在原图像中的总数目。2.反向投影原理原理采用OpenCV docs介绍!使用肤色直方图来解释反向投影的工作原理。假设我们已经获得一个肤色直方图(Hue-Staturation),旁边的直方图就

烟雨博客 2万+

Amesim基础篇-热仿真常用模型库-Thermal Hydraulic /Resistance

流体库、管路库在热管理中是必备模块,如动力电池液冷循环系统均需要Thermal Hydraulic /Resistance库的元件建模。

2201_75375391的博客 5669

STC89C52RC单片机原理图详解

左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里。74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I/O口扩展。由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时,

m0_50562428的博客 6万+

OpenCV学习(十九) :图像的矩:moments(),HuMoments()

OpenCV学习(十九) :轮廓的特征矩:moments() 参考博客: 图像的矩特征 【图像算法】图像特征:几何不变矩–Hu矩 如何理解概率论的“矩”? 1、图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(数据描述量)来描述整个图像,这组数据月简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰,图像识别技术的发展中,不断有新的描述图像特征提出,而图像不变矩就是其中...

Leon_Chen的博客 1万+

低功耗 AI 人体存在检测系统:智能照明与安防的高效解决方案

低功耗 AI 人体存在检测系统通过 “ESP32-C3 主控 + HX7110 AI 模块” 的硬件组合,搭配双重检测算法与深度睡眠机制,既解决了传统检测方案的误报问题,又满足了长时间低功耗运行需求。系统接线简单、代码可直接移植,可快速集成到智能照明、安防监控等物联网设备中,具备广泛的应用前景。

weixin_42300449的博客 226

(openCV 十九)轮廓Contours形状拟合

什么是轮廓? 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同 的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。 • 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理 或者 Canny 边界检测。 • 查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图 像的话,你应该将原始图像存储到其他变量中。 • 在 OpenCV 中,查找轮...

niuniu0243111006的博客 9864

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦! 前文参考: 《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建 《OpenCv视觉之眼》Python图像

qq_42451251的博客 3196

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OpenCV2学习笔记(十九):Kalman滤波算法

在视频跟踪处理中,预测目标运动轨迹是一项基本任务。目标运动状态估计的目的有三个:一是对目标过去的状态进行平滑;二是对目标现在的运动状态进行滤波;三是对目标未来的运动状态进行预测。物体的运动状态一般包括目标位置、速度、加速度等。著名的Kalman滤波技术就是其中一种,这是一种线性系统估计技术。而OpenCV中自带了kalman滤波的代码和例程。

liyuefeilong的专栏 9878

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

opencv实战项目二十九:GrabCut分割人像

在数字图像处理领域,人像分割是一项极具挑战性的任务,它旨在从复杂背景中准确提取出人物图像。随着技术的不断发展,人像分割技术在许多领域都展现出了广泛的应用前景,如摄影后期处理、视频监控、虚拟现实等。在这其中,GrabCut 算法作为一种高效、精确的图像分割方法,备受关注。本文将带你深入了解 GrabCut 算法,探讨如何利用它来实现人像的精确分割,让你在处理图像时能够轻松应对复杂背景,为创作和科研带来更多可能性。

HanWenKing的博客 2549

OpenCV C++案例实战十九《制作电子相册查看器》

OpenCV C++案例实战十九《制作电子相册查看器》前言一、图片读取二、图片展示三、键盘控制四、效果显示五、源码总结 前言 本文将使用OpenCV C++ 制作电子相册查看器。类似于win10系统的“照片”功能。接下来就具体来看看是如何一步步的实现吧。 一、图片读取 我们想要一张张的查看文件夹下的图片,第一步就得读取将该文件夹下的所有图片。 如上图所示,为我创建的文件夹,该文件夹下有14张图片。接下来我们就编写代码读取该文件夹下的所有图片。将读取到的图片存储在images容器。 //读取文件夹下所有

Zero___Chen的博客 4300

Opencv(十九) : 图形轮廓特征查找

Opencv机器视觉中图像轮廓特征查找的内容

Mrliu__的博客 1799

OpenCV(四十九):GrabCut

GrabCut 使用一个能量函数 E 来量化分割的好坏。这个能量函数由两部分组成:数据项(Data Term)和平滑项(Smoothness Term)。数据项(Unary Term):表示单个像素属于前景或背景的概率。基于颜色分布模型,如果一个像素的颜色更接近前景模型,则其属于前景的能量较低。平滑项(Binary Term):表示相邻像素的标签一致性。如果两个相邻像素颜色相似但标签不同,则会增加能量惩罚,以鼓励平滑的边界。数学上,能量函数定义为:α:每个像素的标签(0 为背景,1 为前景)。

www_dong的博客 815
上一篇: 【OpenCV】(十八)答题卡识别判卷与文档ocr扫描识别
下一篇: 【leetcode】(一)认识复杂度和简单排序算法
Cccp.123
博客等级 码龄3年 5粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值