运动估计之光流估计LK

2023-11-07 10:30
文章标签 估计 运动 之光流 lk

本文主要是介绍运动估计之光流估计LK,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目的:完成图像点的跟踪

概念:如下面两帧图像I和J,存在像素点的移动,即上一帧I中蓝色像素点d在下一帧J中,其位置会有些轻微的变动,则该变动即为位移向量,也就是像素点的光流。

而要计算光流,需满足以下三个前提条件:

1.相邻帧之间的亮度恒定

2.相邻视频帧的取帧时间连续,或者相邻帧之间物体的运动比较“微小”

3.保持空间一致性,也就是同一子像素的像素点具有相同的运动

推导略

其中函数:

void calcOpticalFlowPyrLK(InputArray prevImg, InputArray nextImg, InputArray prevPts, InputOutputArray nextPts, OutputArray status, OutputArray err, Size winSize=Size(21,21), int maxLevel=3, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), int flags=0, double minEigThreshold=1e-4 )

1.prevImg:第一帧图像

2.nextImg:第二帧图像

3.prevPts:第一帧图像中所有特征点向量

4.nextPts: 第二帧图像中所有特征点向量

5.status:输出状态量,若相应点光流被发现,向量的每个元素被设置为1,否则,被设置为0

其他参数一般设为默认值,可参考:openCV

代码:

#include "opencv2/opencv.hpp"using namespace cv;
using namespace std;void main()
{char *fn = "C:\\mywork\\workspace\\opencv\\sources\\samples\\data\\vtest.avi";VideoCapture cap;//该类对视频进行读取操作以及调用摄像头Mat source, result, gray, lastGray;  // gray, lastGray对应本帧和上一帧灰度图vector<Point2f> points[2], temp;  // 对应上一帧和本帧的特征点,上一帧时是定的,本帧是预测结果vector<uchar> status; // 每一个特征点检测状态vector<float> err; // 每一个特征点计算误差cap.open(fn);// 打开一个视频文件或打开一个摄像头if (!cap.isOpened())// 判断视频读取或者摄像头调用是否成功,成功则返回true{cout << "无法打开视频源或视频文件" << endl;return;}for (;;){cap >> source;if (source.empty())break;cvtColor(source, gray, COLOR_BGR2GRAY);//转为灰度图,供后面使用if (points[0].size() < 10) // 若点数太少,则重新检测特征点{//1._image = gray:上面cvtColor转换来的单通道灰度图//2._corners = points[0]:保存检测出的角点//3.maxCorners = 200:角点数目最大值,若实际检测的角点超过此值,则只返回前//                  maxCorners个强角点//4.qualityLevel = 0.01: 角点的品质因子//5.minDistance = 20:对初选出的角点而言,若在其周围minDistance范围内存在其他//更强角点,则将此角点删除。//6.mask = Mat() 若指定,它的维度必须和输入图像一致,且在mask值为0处不进行// 角点检测//7. blockSize = 3:表示在计算角点时参与运算的区域大小,常用值为3,若图像分辨率// 高则使用较大一点的值//8. useHarrisDetector: 为True表示使用Harris角点检测,为False表示Shi Tomasi检测// 但Harris角点检测存在很多缺陷,其角点是像素级别的,速度较慢,// 而goodFeaturesToTrack不仅支持Harris角点检测,也支持Shi Tomasi算法角点检测,// 该函数也是像素级别的,在实际使用中可能并不满足要求,若要获取更精细的角点坐标,	// 则可使用cornerSubPix()进一步细化处理,也就是精度达到亚像素级别。goodFeaturesToTrack(gray, points[0], 200, 0.01, 20, Mat(), 3, false, 0.04);}if (lastGray.empty()) //若上一帧为空{gray.copyTo(lastGray);//将本帧灰度图复制到上一帧灰度图矩阵中}//1.prevImg = lastGray:第一帧图像,上一帧图像//2.nextImg = gray:第二帧图像,当前图像//3.prevPts = points[0]:第一帧图像中所有特征点向量,上一帧图像中所有特征点向量//4.nextPts = points[1]: 第二帧图像中所有特征点向量,本帧图像中所有特征点向量//5.status:输出状态量,若相应点光流被发现,向量的每个元素被设置为1,否则,被设置为0//其他参数一般设为默认值calcOpticalFlowPyrLK(lastGray, gray, points[0], points[1], status, err);int counter = 0;for (int i = 0; i < points[1].size(); i++){double dist = norm(points[1][i] - points[0][i]); //求向量差的范数也就是长度if (status[i] && dist >= 2.0 && dist <= 20.0) // 将2.0到20.0范围内的特征点存储起来{points[0][counter] = points[0][i];points[1][counter++] = points[1][i];}}points[0].resize(counter); //根据给定的counter添加或删除元素points[1].resize(counter);source.copyTo(result); //将source图像矩阵拷贝到result中for (int i = 0; i < points[1].size(); i++){//result 要绘制线段的图像// points[0][i] 线段的起点// points[1][i] 线段的终点// Scalar(0,0,0xff) 线段的颜色 分别对应BGRline(result, points[0][i], points[1][i], Scalar(0,0,0xff));//result 为源图像指针//points[1][i] 为画圆的圆心坐标// 3为圆的半径// Scalar(0, 0xff, 0) 为BGR 颜色circle(result, points[1][i], 3, Scalar(0, 0xff, 0));}swap(points[0], points[1]); //交换矩阵swap(lastGray, gray); //交换矩阵imshow("视频源", source);imshow("结果", result);char key = waitKey(100); if (key == 27)break;}waitKey(0);
}

运行结果:

这篇关于运动估计之光流估计LK的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/363019

相关文章

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

数据集 Ubody人体smplx三维建模mesh-姿态估计 >> DataBall

Ubody开源人体三维源数据集-smplx-三维建模-姿态估计 UBody:一个连接全身网格恢复和真实生活场景的上半身数据集,旨在拟合全身网格恢复任务与现实场景之间的差距。 UBody包含来自多人的现实场景的1051k张高质量图像,这些图像拥有2D全身关键点、3D SMPLX模型。 UBody由国际数字经济学院(IDEA)提供。 (UBody was used for mesh r

运动耳机哪个牌子的质量好?五款口碑绝佳机型安利!

​喜欢户外活动的你,肯定是个有格调的人。想象一下,如果在户外的时候,能戴上一款耳机,不仅跟环境搭,还能让你享受到超棒的音乐,那感觉得多爽!开放式耳机就是为这个目的设计的,它不塞耳朵,戴着更舒服,音质也棒,让你在户外能更好地感受到周围自然的声音。这耳机现在超受欢迎,作为一个既爱户外又爱数码的发烧友,我自己也试过不少款,它们真的给我的户外探险加了不少分。接下来,我会跟大家分享这些耳机的亮点,帮你挑出自

生命在于运动

程序员和设计师大部分时间都坐在电脑前。有效的锻炼有助于他们更好地工作。 传统的: 当坐在电脑桌前的时候 脚触地。双手在肘部弯曲。打字时手应搁在桌子上。键盘和鼠标应在触手可及的地方。显示屏应在视线水平上,不高不低。光线最好应来自上方。即光线应该从天花板上照下来。每隔20分钟远眺。可降低眼睛长时间盯着近距离物体产生的疲劳。鼠标和手差不多大小。使用全尺寸符合人体工学的键盘。我个人比较喜欢Mi

国内领先线上运动平台:如何借助AI技术实现业务腾飞与用户体验升级

&nbsp;“ 从智能训练到身体分析,再到辅助判决,AI技术正以惊人的速度渗透进体育和健身领域,为运动员和健身爱好者提供了前所未有的个性化体验。 ” AI,运动的智能伴侣 在巴黎奥运会上,AI技术的运用成为了焦点。它不仅为运动员提供了精准的训练指导,还通过对运动员身体状况的实时分析,帮助他们避免潜在的运动伤害,提升竞技状态。 同时,AI在辅助判决上的应用,确保了比赛的公平与

IMU腕带评估轮椅用户运动健康

近期,美国的研究团队利用惯性测量单元(IMU)和机器学习来准确评估手动轮椅使用者的运动健康状况,这在康复训练和慢性病管理领域具有广阔的应用前景。 研究小组将运用高性能的IMU传感器固定到轮椅使用者佩戴的手腕带上,用来监测并记录轮椅推进过程中的运动数据。实验设置了不同强度的六分钟推力测试,结果证实仅使用IMU传感器就能准确捕捉到轮椅使用者的速度、距离和节奏变化,为心血管健康评估提供

论文速读|基于手臂约束的轮腿机器人运动操控课程学习

项目地址:Arm-Constrained Curriculum Learning for Loco-Manipulation of the Wheel-Legged Robot 本文提出了一种用于轮腿机器人局部操控的强化学习框架,使它们能够在高度动态的情况下执行一系列复杂的操作任务。通过引入臂约束网络和奖励感知课程学习方法,解决了引入机械臂带来的稳定性、安全性和效率挑战。仿真和真实机器人实验

跑步用耳机哪款好?这五款运动骨传导耳机健身人士都说好!

在无线耳机市场持续繁荣的今天,入耳式耳机以其卓越的音质体验赢得了众多用户的青睐。然而,随着健康意识的提升,长时间佩戴入耳式耳机所带来的健康隐患日益受到关注。正是在这样的背景下,骨传导耳机凭借其独特的非入耳式设计,开启了健康聆听的新篇章。它不仅有效保护了耳道健康,减少了佩戴不适,还确保了用户在享受音乐的同时,能够随时感知外界环境,为日常出行增添一份安全保障。 面对纷繁复杂的骨传导耳机市场,如何挑选

creator物理引擎 /RPG运动类型 /坦克

1 applyForce/ToCenter(). 这个力怎么计算 (牛顿第二定律F=ma) 2 .linearVelocity()是像素/米 (看源码) 3 why到第四帧才有速度 CocosCreator官方文档物理引擎Demo(physics-example,下载链接:https://github.com/2youyou2/physics-example) ----------------