运动物体检测——光流法

运动物体检测——光流法(摄像机固定) 前面的一篇文章谈了高斯背景模型在运动物体检测中的应用。本文主要讨论另一种方法——光流法。与高斯背景模型的方法不同,光流法可以用于摄像机固定和摄像机运动的情形,但本文只就摄像机固定的情况进行讨论,即不涉及摄像机运动预测问题。光流法的介绍在空间中,运动可以用运动场描述。而在一个图像平面上,物体的运动往往是通过图像序列中不同图象灰度分布的不同体现的。从而,空间中的运动场转移到图像上就表示为光流场 阅读详情

前面的一篇文章谈了高斯背景模型在运动物体检测中的应用。本文主要讨论另一种方法——光流法。与高斯背景模型的方法不同,光流法可以用于摄像机固定和摄像机运动的情形,但本文只就摄像机固定的情况进行讨论,即不涉及摄像机运动预测问题。

光流法的介绍

在空间中,运动可以用运动场描述。而在一个图像平面上,物体的运动往往是通过图像序列中不同图象灰度分布的不同体现的。从而,空间中的运动场转移到图像上就表示为光流场,光流场反映了图像上每一点灰度的变化趋势。

光流可以看作带有灰度的像素点在图像平面运动产生的瞬时速度场。下面我们推导光流方程:

假设E(x,y,t)为(x,y)点在时刻t的灰度(照度)。设t+dt时刻该点运动到(x+dx,y+dy)点,他的照度为E(x+dx,y+dy,t+dt)。我们认为,由于对应同一个点,所以

E(x,y,t) = E(x+dx,y+dy,t+dt)   —— 光流约束方程

将上式右边做泰勒展开,并令dt->0,则得到:Exu+Eyv+Et = 0,其中:

Ex = dE/dx   Ey = dE/dy   Et = dE/dt   u = dx/dt   v = dy/dt

上面的Ex,Ey,Et的计算都很简单,用离散的差分代替导数就可以了。光流法的主要任务就是通过求解光流约束方程求出u,v。但是由于只有一个方程,所以这是个病态问题。所以人们提出了各种其他的约束方程以联立求解。但是由于我们用于摄像机固定的这一特定情况,所以问题可以大大简化。

摄像机固定的情形

在摄像机固定的情形下,运动物体的检测其实就是分离前景和背景的问题。我们知道对于背景,理想情况下,其光流应当为0,只有前景才有光流。所以我们并不要求通过求解光流约束方程求出u,v。我么只要求出亮度梯度方向的速率就可以了,即求出sqrt(u*u+v*v)。

而由光流约束方程可以很容易求到梯度方向的光流速率为 V = abs(Et/sqrt(Ex*Ex+Ey*Ey))。这样我们设定一个阈值T。

V(x,y) > T 则(x,y)是前景 ,反之是背景

C++实现

在实现摄像机固定情况的光流法时,需要有两帧连续的图像,下面的算法针对RGB24格式的图像计算光流:

void calculate(unsigned char* buf)
 {
  int Ex,Ey,Et;
  int gray1,gray2;
  int u;
  int i,j;
  memset(opticalflow,0,width*height*sizeof(int));
  memset(output,255,size);
  for(i=2;i<height-2;i++){
   for(j=2;j<width-2;j++){
    gray1 = int(((int)(buf[(i*width+j)*3])
     +(int)(buf[(i*width+j)*3+1])
     +(int)(buf[(i*width+j)*3+2]))*1.0/3);
    gray2 = int(((int)(prevframe[(i*width+j)*3])
     +(int)(prevframe[(i*width+j)*3+1])
     +(int)(prevframe[(i*width+j)*3+2]))*1.0/3);
    Et = gray1 - gray2;
    gray2 = int(((int)(buf[(i*width+j+1)*3])
     +(int)(buf[(i*width+j+1)*3+1])
     +(int)(buf[(i*width+j+1)*3+2]))*1.0/3);
    Ex = gray2 - gray1;
    gray2 = int(((int)(buf[((i+1)*width+j)*3])
     +(int)(buf[((i+1)*width+j)*3+1])
     +(int)(buf[((i+1)*width+j)*3+2]))*1.0/3);
    Ey = gray2 - gray1;
    Ex = ((int)(Ex/10))*10;
    Ey = ((int)(Ey/10))*10;
    Et = ((int)(Et/10))*10;
    u = (int)((Et*10.0)/(sqrt((Ex*Ex+Ey*Ey)*1.0))+0.1);
    opticalflow[i*width+j] = u;
    if(abs(u)>10){
     output[(i*width+j)*3] = 0;
     output[(i*width+j)*3+1] = 0;
     output[(i*width+j)*3+2] = 0;
    }
   }
  }
  memcpy(prevframe,buf,size);
 }


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/xlvector/archive/2006/01/27/589380.aspx

OpenCV 使用光流法检测物体运动 阅读详情

相关推荐

c++实现Horn-Schunck光流法

在每次迭代中,我们首先计算光流向量场的梯度,然后使用Horn-Schunck光流法的公式来更新光流向量场。最后,我们将光流向量场缩放回原始尺寸,并绘制出光流向量场。Horn-Schunck光流法是一种光流计算方法,用于计算图像序列中像素的运动信息。该算法的主要思想是最小化光流向量场和其梯度的平方之和,以获得平滑的光流场。在上述代码中,我们首先读取两张相邻的图片,然后对它们进行缩放,并计算其梯度。接着,我们初始化光流向量场,并使用迭代方法来计算光流向量场。

走向CTO的路上... 432

c++学习【7】光流法

如果一行中的单词数目不符合预期,或者某个单词中包含空格、制表符等空白字符,就会导致读取出错。是C++标准库中的一个输入流类,它可以将字符串作为输入流进行处理。当使用istringstream对象的输入流运算符>>来解析字符串时,默认情况下它会以空格为分隔符。在C++中,通常用于表示输入文件流对象,用于从文件中读取数据。我们可以这样使用,从标准输入流中读取三个整型数值,并分别存储到变量x、y、z中。对象,它被用来打开和读取associate.txt文件。将字符串解析为整型数值,并将其存储在变量x、y、z中。

m0_46973820的博客 786

摄像头实时运动物体检测:光流法的原理与实践

光流法通过分析图像序列中像素点的变化,来推断场景中物体的运动。数学上,光流被视为一种由强度值在时间上连续变化所产生的二维速度场。OpenCV由Intel于1999年启动,并在2000年第一次公开发布。其最初的目标是提供一个由算法构成的库,这些算法可以执行实时计算机视觉任务。随着时间的推移,OpenCV逐渐成为一个庞大且活跃的社区项目,支持各种平台和编程语言。

weixin_42348783的博客 1212

C++实现LK光流法/计算稀疏光流

自行实现LK光流计算,实现了对指定视频(三通道彩色)计算稀疏光流并显示在图像上。主要包括的自编函数有:RGB2GRAY (),将彩色图转为灰度图。ScharrConvolution (),使用Scharr算子求XY方向梯度。getR(),获得角点响应值R,用于获取最优角点。NMS(),非极大值抑制。myCompare(),自定义排序函数。getBestCorner(),根据R值由大到小对坐标进行排序,获取前n个R值最大的坐标,若整体不足n个则全部返回。

StevenHat的博客 1297

光流法C++源代码

光流法C++源代码

光流法代码

通过光流法计算运动目标的运动轨迹,可以有效检测运动目标。

光流法 运动物体检测【中文解释】

光流法 运动物体检测 #include #include "cv.h" #include "cxcore.h" #include "highgui.h" static const double pi = 3.14159265358979323846; inline static double square(int a) { return a * a; } /*该函数目的:给i

有思想的鱼 6156

全志 T527_Android13 编译 [ 避坑必看 ]

Swap 概念: Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行。当输入编译命令make -j16 的时候,会有如下提示,这是官方建议通过减少编译线程来解决编译时消耗内存过大的问题。Android 13 系统的编译流程,编译一共分为两部分:内核编译与 Android 编译。

公众号:嵌入式分享 2111

通过光流法检测运动物体,得到图像运动场

物体在运动的时候之所以能被人眼发现,就是因为当物体运动时,会在人的视网膜上形成一系列的连续变化的图像,这些变化信息在不同时间,不断的流过眼睛视网膜,就好像一种光流过一样,故称之为光流。根据图像前景和背景的运动,检测视频的变化,空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。是相应的3D运动,其与运动场的关系是: 其中,M是一个2*3的矩阵.

fpga/matlab/simulink算法仿真工程 1233

【Dify精讲】第2章:后端服务架构深度剖析

Dify后端采用Flask应用工厂模式实现模块化开发,通过蓝图架构将API分为控制台、Web应用和服务接口三大模块。其设计亮点包括:1) 应用工厂模式支持多环境配置和独立测试;2) 蓝图分层管理实现API模块化,各模块职责清晰;3) 严格遵循RESTful原则设计API接口;4) 使用Flask-RESTful扩展简化API开发。这种架构既保持了Flask的灵活性,又实现了企业级应用的可维护性,是Flask项目架构的优秀实践案例。

wiyi9891的专栏 2126

波束形成算法:LCMV实现(MATLAB)

阵列信号处理,波束成形,

weixin_43601588的博客 1万+

光流法 运动物体检测[Eng]

// OpticalFlow.cpp : Defines the entry point for the console application. // /* --Sparse Optical Flow Demo Program-- * Written by David Stavens (dstavens@robotics.stanford.edu) */ #include #include

有思想的鱼 2481

Qt6安装保姆级教程:从国内镜像下载到配置避坑指南(附清华/中科大源)

本文提供详细的Qt6安装与配置指南,重点介绍如何利用清华大学、中国科学技术大学等国内镜像源解决下载速度慢的问题。内容涵盖在线安装器获取、组件选择策略、环境变量配置以及常见编译与部署问题的排查方法,旨在帮助国内开发者高效、顺畅地完成Qt6开发环境搭建。

weixin_29281915的博客 633

光流法图像分析

% 光流法检测运动物体的基本原理是:给图像中的每一个像素点赋予一个速度矢量,这就形成了一个图像运动场, % 在运动的一个特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可由投影关系得到,根据各个像素点的速度矢量特征, % 可以对图像进行动态分析。如果图像中没有运动物体,则光流矢量在整个图像区域是连续变化的。 % 当图像中有运动物体时,目标和图像背景存在相对运动,运动物体所形成的速度矢量必然和邻域背景速度矢量不同,从而检测出运动物体及位置。 % 采用光流法进行运动物体检测的问题主要在于大多数...

IT技术猿猴的博客 2518

京东前端200道面试题及参考答案(中)

前端优化是“提升用户体验、降低资源消耗”的核心手段,需围绕“用户感知的性能指标”(如页面加载速度、交互流畅度)展开,覆盖加载优化、渲染优化、代码优化、网络优化、缓存优化、性能监控六大维度,每个维度下有具体可落地的措施,同时需结合项目实际场景(如单页应用、电商首页)选择优化方案。分页组件需通过props接收“数据总量、当前页、每页条数”等基础信息,通过emit触发“页码切换、每页条数变化”的回调(供父组件请求对应页数据),同时定义默认值确保兼容性。核心Props与Emit设计<template>

大模型大数据攻城狮的专栏 588

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

m0_71589036的博客 85
上一篇: 运动物体分割 —— 高斯背景模型
下一篇: 二值形态学——膨胀,腐蚀
jackfirst86
博客等级 码龄18年 28粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值