运动物体检测——光流法(摄像机固定)

2023-11-30 05:32

本文主要是介绍运动物体检测——光流法(摄像机固定),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 转自http://blog.csdn.net/xlvector/article/details/589380

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

光流法的介绍

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

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

假设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://www.chinasem.cn/article/435815

相关文章

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组