利用光流法计算人体运动的速度与方向

光流的计算(Lucas–Kanade method) Lucas-Kanade 方法假设光流在一个较小的局部区域内是保持不变的,然后采用最小二乘的方法来计算每一个点的光流。 对于每一个像素点,其光流(速度)可以这样表示: 对于这个表示,我们可以这样理解:我们已经假设了在一个像素的周围的一个小的窗口内的所有像素点的光流大小是相同的。而两帧图像之间的变化,就是t方向的梯度值,可以理解为当前像素点沿着光流方向运动而得到的,所以我们可以得到上边的 阅读详情

利用光流法计算人体运动的速度与方向

1.方向的计算
首先计算图像各个象素的光流(opencv LK),然后建立4*4窗口对X,Y方向分别做统计求和,
然后求得 atan(yy/xx)作为光流方向,即为运动的方向.
 

2.速度的计算
利用帧差分得到运动图像,然后建立4*4窗口对图像进行统计求和,求和值作为权重,表示速度的比例.
即运动区域白色(255)面积越大,速度越大.


3.结果
大部分运动方向计算正确,少部分有错误,还需要改进算法.(利用统计?)

 

4.代码:

WW_RETURN HumanMotion::ImgOpticalFlow(IplImage *pre_grey,IplImage *grey)
/*************************************************
  Function:
  Description:  光流法计算运动速度与方向      
  Date:   2006-6-14
  Author:  
  Input:                       
  Output:        
  Return:        
  Others:         
*************************************************/
{

 IplImage *velx = cvCreateImage( cvSize(grey->width ,grey->height),IPL_DEPTH_32F, 1 );
 IplImage *vely = cvCreateImage( cvSize(grey->width ,grey->height),IPL_DEPTH_32F, 1 );

 velx->origin =  vely->origin = grey->origin;
 CvSize winSize = cvSize(5,5);
 cvCalcOpticalFlowLK( prev_grey, grey, winSize, velx, vely );
 
 cvAbsDiff( grey,prev_grey, abs_img );
 cvThreshold( abs_img, abs_img, 29, 255, CV_THRESH_BINARY); 

 CvScalar xc,yc; 
 for(int y =0 ;y<velx->height; y++)
  for(int x =0;x<velx->width;x++ )
  {
   xc = cvGetAt(velx,y,x);
   yc = cvGetAt(vely,y,x);

   
   float x_shift= (float)xc.val[0];
   float y_shift= (float)yc.val[0];
   const int winsize=5;  //计算光流的窗口大小


   if((x%(winsize*2)==0) && (y%(winsize*2)==0) )
   {

    if(x_shift!=0 || y_shift!=0)
    {
     
     if(x>winsize && y>winsize && x <(velx->width-winsize) && y<(velx->height-winsize) )
     {

      cvSetImageROI( velx, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));
      CvScalar total_x = cvSum(velx);
      float xx = (float)total_x.val[0];
      cvResetImageROI(velx);

      cvSetImageROI( vely, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));
      CvScalar total_y = cvSum(vely);
      float yy = (float)total_y.val[0];
      cvResetImageROI(vely);
      
      cvSetImageROI( abs_img, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));
      CvScalar total_speed = cvSum(abs_img);
      float ss = (float)total_speed.val[0]/(4*winsize*winsize)/255;
      cvResetImageROI(abs_img);

      const double ZERO = 0.000001;
      const double pi = 3.1415926;
      double alpha_angle;

      if(xx<ZERO && xx>-ZERO)
       alpha_angle = pi/2;
      else
       alpha_angle = abs(atan(yy/xx));
      
      if(xx<0 && yy>0) alpha_angle = pi - alpha_angle ;
      if(xx<0 && yy<0) alpha_angle = pi + alpha_angle ;
      if(xx>0 && yy<0) alpha_angle = 2*pi - alpha_angle ;


      
      CvScalar line_color;
      float scale_factor = ss*100;
      line_color = CV_RGB(255,0,0);
      CvPoint pt1,pt2;
      pt1.x = x;
      pt1.y = y;
      pt2.x = static_cast<int>(x + scale_factor*cos(alpha_angle));
      pt2.y = static_cast<int>(y + scale_factor*sin(alpha_angle));

      cvLine( image, pt1, pt2 , line_color, 1, CV_AA, 0 );
      CvPoint p;
      p.x = (int) (pt2.x + 6 * cos(alpha_angle - pi / 4*3));
      p.y = (int) (pt2.y + 6 * sin(alpha_angle - pi / 4*3));
      cvLine( image, p, pt2, line_color, 1, CV_AA, 0 );
      p.x = (int) (pt2.x + 6 * cos(alpha_angle + pi / 4*3));
      p.y = (int) (pt2.y + 6 * sin(alpha_angle + pi / 4*3));
      cvLine( image, p, pt2, line_color, 1, CV_AA, 0 );

      /*
      line_color = CV_RGB(255,255,0);
      pt1.x = x-winsize;
      pt1.y = y-winsize;
      pt2.x = x+winsize;
      pt2.y = y+winsize;
      cvRectangle(image, pt1,pt2,line_color,1,CV_AA,0);
      */

     }
    }
   }
  }


 cvShowImage( "Contour", abs_img);
 cvShowImage( "Contour2", vely);

 cvReleaseImage(&velx);
 cvReleaseImage(&vely);
 cvWaitKey(20);
 
 return WW_OK;

}

 

人体运动检测与跟踪 人体运动检测是指在输入视频图像中却东运动人体的位置、尺度大小和姿态的过程、 人体跟踪是指在视频图像序列中确定各帧间的人体彼此对应关系的过程。 可以采用 低通滤波去噪、背景差分、形态学图像处理、区域连通性分析等一系列的处理方法,将运动物体从视频图像中提取出来,然后采用人 阅读详情

相关推荐

基于Transformer和图卷积网络的时空人体运动预测网络

本文主要介绍了基于Transformer和图卷积网络的时空人体运动预测网络。首先,文章详细阐述了Transformer模型的原理和优点,指出其通过自注意力机制实现序列数据的建模和处理,能够捕捉长距离依赖关系。然后,文章介绍了图卷积网络的基本概念和应用场景,强调其通过邻居节点信息聚合实现空间特征的提取和融合。接着,文章详细设计了时空人体运动预测网络的总体架构,包括基于Transformer的时间特征提取模块、基于图卷积的空间特征融合模块以及时空特征联合预测模块。

babyai996的博客 1479

算法分析:光流测速和视觉里程计

两种已经比较成熟的视觉感知系统:光流测速模块和视觉里程计。   光流测速模块顾名思义,只能测速度。通常一个光流测速模块由一个相机、一个惯性测量元件、一个超声波模块构成,它的主要原理是计算机视觉技术中于1981年被发展出来的“光流追踪”算法。 “光流”的概念最早在1950年代由心理学家和生物学家提出,指的是一个观察者和他在观察的事物发生相对运动时,这些事物在他眼前成的像会产生“运动的模式”,人脑...

通哈膨胀哈哈哈 的博客 3157

光流运动估计教程

让我们从对光流的高层次理解开始。光流是对象在序列的连续帧之间的运动,由对象和相机之间的相对运动引起。光流问题可以表示为:光流问题在连续帧之间,我们可以将图像强度 (I) 表示为空间 (x,y) 和时间 (t) 的函数。换句话说,如果我们获取第一张图像 I(x,y,t) 并在 t 时间内将其像素移动 (dx,dy),我们将获得新图像 I(x+dx,y+dy,t+dt) )。首先,我们假设物体的像素强度在连续帧之间是恒定的。光流的恒定强度假设其次,我们采用RHS的泰勒级数近似,并去除常用项。

如果想成为中心,那么就到中心去吧。 1298

光流算法简述

光流(optical flow),字面意思描述的是图像中像素强度的流动。光流法的目的是根据图像中像素点的灰度值强度变化估计出物体移动速度与方向。 光流 光流的假设 首先,光流估计指的是利用时间上相邻的两帧图像内像素强度的变化来计算点的运动。原理决定了这种方法是建立在一系列假设上的。 前后两帧中点的位移不大 灰度不变假设,这要求外界光强保持恒定 空间相关性,每个点的运动和邻近的点类似 好像这么多假设有些不靠谱,但是其实光流的输入图像一般时间间隔极小,这使得这么短的时间内,位移,光照强度等都变化极

sky的博客 2720

基于transformer和图卷积网络的人体运动预测时空网络

实验结果表明,与以往的预测方法相比,所提出的预测方法预测误差更小,预测运动更平滑。本工作提出的时空网络(STTG-Net)利用其内部的T-transformer和S-GCN两个模块对人体骨骼关节的时空依赖进行建模,预测修正模块可以通过融合减少累积误差将当前预测帧与上一帧的预测信息相结合,以更好地完成人体运动预测的任务。此外,大多数方法都是对时间关系进行建模,忽略了关节的空间相关性,而 GCN 可以专门处理非欧几里德类型的数据,并且可以通过定义在时间连接运动上的图来捕获人体关节的时间和空间依赖性树。

babyai996的博客 4527

基于Matlab计步:使用加速度传感器算法

我们首先使用Arduino开发板和ADXL335传感器获取了加速度数据,然后对其进行预处理,并最终计算出步数。通过这种方式,我们可以使用Matlab来创建一个准确的步数计算器,以实现跟踪健康和健身目标的目的。请注意,将芯片引脚连接到模拟输入引脚(A0,A1和A2)是很重要的,因为这将允许我们读取传感器的模拟输出信号。本文将讨论基于Matlab的计步算法,并使用加速度传感器作为算法的输入。我们将解释如何使用加速度传感器获取数据,以及如何使用Matlab对该数据进行处理以计算步数。步骤2: 数据预处理。

2301_78484069的博客 589

基于单片机人体反应速度测试仪设计

*单片机设计介绍,基于单片机人体反应速度测试仪设计。

2201_75940997的博客 1611

50、三维人体运动轨迹测量

本文详细介绍了三维人体运动轨迹测量的原理和技术手段,包括全向相机系统、多视角相机系统以及三维重建过程。同时探讨了数据分析方法如光流计算、运动分割和参数提取,并结合体育训练、康复治疗和动画制作等应用场景展示了其实际价值。文章还分析了优化策略、典型案例及未来发展方向,为读者提供全面的技术洞察。

nnn11的博客 130

计算机视觉算法中的人体动作识别(Human Action Recognition)

人类的动作是一种非常重要的信息来源,它能传达出人们的意图、情感和行为。计算机视觉领域中的人体动作识别(Human Action Recognition)旨在从图像或视频中自动识别和解释人体的运动模式和行为。人体动作识别是计算机视觉领域中的一个重要研究方向,具有广泛的应用价值。未来,随着技术的发展,我们可以期待更准确、高效的人体动作识别算法,为人们提供更好的服务和体验。此外,在虚拟现实领域,人体动作识别可以用于实时追踪用户的动作,实现更真实的交互体验。它可以通过关节点的检测和跟踪来提取人体的姿势信息。

牛肉胡辣汤 6178

数字人体建模:运动学与静力学的深入探索

本文探讨了数字人体建模中运动学和静力学的原理和方法,重点关注了运动生成的三种主要方法的比较研究,以及局部与全局雅可比矩阵在五点模型中的应用。文中还详细分析了人体结构系统的基本概念、运动范围(ROM)和力量范围(ROS)的概念,以及关节舒适区的确定。通过对人体运动系统的概述,突出了双关节肌肉的作用,并探讨了如何通过数学方法创建逼真的数字人运动。

weixin_28840811的博客 912

MATLAB人类行走仿真-human.zip

MATLAB人类行走仿真-human.zip 本帖最后由 jiaerse 于 2015-7-1 20:59 编辑 一个用MATLAB写的人类行走仿真程序,可以通过界面上的滚动条来调整人的行走姿态,运行压缩包里面的m文件即可。压缩包human是将该程序生成的.exe文件。

基于人体运动轨迹分析的摔倒检测

【免费】人体关键点提取:通过深度学习模型(如YOLOv8、OpenPose等)提取人体的关键点运动轨迹计算:跟踪每个关键点的运动轨迹,计算每个时刻的速度和加速度摔倒判定:摔倒时,人体的运动轨迹通常资源-优快云文库。人体在站立、走动、摔倒等行为中,会表现出不同的运动轨迹。摔倒时,人体的运动轨迹通常具有急剧的变化,可以通过分析人体的运动轨迹来进行摔倒检测。

matlab_python22的博客 479

从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术

本文详细解析了EC11旋转编码器与ESP32的PWM控制技术,探讨了如何将机械旋转动作转换为精确的数字信号控制。通过硬件连接、信号处理和软件优化等实践技巧,开发者可以构建高效的人机交互系统,适用于智能照明、电机控制等多种应用场景。

android的专栏 782

【运动跟踪】基于matlab惯性传感器的运动跟踪方法(上肢人体运动)【含Matlab源码 7255期】

惯性传感器的运动跟踪方法(上肢人体运动) 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1610

Diffusion Model原理详解

Diffusion Model(扩散模型 )对标的是生成对抗网络(GAN),本文将用通俗的语言和公式为大家介绍Diffusion Model,并且结合公式为大家梳理Diffusion Model的代码。

weixin_42620109的博客 6098

【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读

半波整流是一种利用二极管的单向导通特性,将交流电转换为直流电的基础电路。它通过“切除”交流电的半个周期,仅保留另外半个周期来实现整流。1 开关电源超快学习思路点击跳转1.1开关电源的原理、结构和实物入门篇-超简单解读点击跳转1.2开关电源的EMI输入电路-超简单解读点击跳转倍压整流适用于需要高电压、小电流的特殊场合,通过电容充放电实现电压倍增。

2301_81299416的博客 2924

【论文阅读】基于光流的快速人体姿态估计

文献:周文俊,郑新波,卿粼波,熊文诗,吴晓红.基于光流的快速人体姿态估计.计算机系统应用,2018,27(12):109–115.http://www.c-s-a.org.cn/1003-3254/6665.html 目录 一、研究目的及意义 二、研究方法 1、方法概述 2、视频帧姿态相关性分析 3、基于光流的快速人体姿态估计框架 4、算法改进 (1)自适应关键帧检测算法 (2)关键点局部融合优化 三、实验 1、实验设置 2、实验结果 (1)定性比较 (2)定量比较 四...

屿十_ 1977

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港

卫星监测“America”级#两#栖#攻#击#舰#(LHA-6)出港 前脚刚走,后脚又来,山姆大叔又来刷存在感,2020年7月28日,USS Ronald Reagan流窜在我国东海海区被卫星拍了下来: 2020年8月1日,最新卫星图像显示USS Ronald Reagan已经返回母港日本横须贺:距离其出港(2020年6月8日)已经过去了快两个月 然而事情并没有到此结束,“America”级#两#栖#攻#击#舰#(LHA-6)选择在 “八.一” 这个特殊的日子前后出港颇具挑衅的味道。 根据2020年

qq_46071146的博客 1564

人体力学-线速度与角速度

刚体定轴转动:刚体运动时,体内有一直线始终固定不动,其作各点都绕此直线作圆周运动。   角速度:表示刚体转动的快慢程度。        符号:ω,单位:rad/s( 弧度/秒)   转 速:用每分钟的转数来表示转动的快慢。        符号:n ,单位:r/min     角速度与转速两者的换算关系:     ω=2πn/60(rad/s)=30πn/30(rad/s)   线速度:作圆周运动的...

深未来技术 4171

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统,一款基于ThinkPHP+Layui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用品、汽配汽修、生鲜农贸、手机通讯、数码家电、医药用品、制造业、信息技术服务行业等。提供全部无加密服务端和前端源代码,独立部署,不受限制。

u011092458的博客 788

SAP Joule for Consultants 与 Joule for Developers 全面解读

SAP推出面向不同用户群体的Joule AI助手:开发者版(Joule for Developers)专注于编码提效,嵌入开发工具链辅助生成、重构和测试代码;顾问版(Joule for Consultants)聚焦业务场景,集成SAP云应用知识库,为咨询项目提供方案设计、差距分析和实施指引。两者共享AI底座但功能侧重点不同:开发者版优化技术开发流程,顾问版加速项目交付周期。典型应用场景包括制造业云转型方案制定和ABAP代码迁移,分别展示了两版本在业务决策支持和技术实施中的价值。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 538

【运动跟踪】惯性传感器的运动跟踪方法(上肢人体运动)【含Matlab源码 7255期】

惯性传感器的运动跟踪方法(上肢人体运动) 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1482

Anaconda数据报错:Fatal error in launcher: Unable to create process using ‘“E:\Anaconda\python.exe“ “D:\

里面的pip.exe程序出现了问题,我这里直接删除,重新安装解决,上面已经手动删除pip.exe删除pip.exe,重新安装pip.exe用下面命令: 测试是否成功成功解决

Deng872347348的博客 1270
上一篇: 使用directshow代替opencv的vfw的源代码
下一篇: camera calibration 摄像头标定 代码整理(2007-2-6 修正)
hardVB
博客等级 码龄26年 257粉丝 58原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值