点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:opencv学堂

稀疏光流跟踪(KLT)详解

在视频移动对象跟踪中,稀疏光流跟踪是一种经典的对象跟踪算法,可以绘制运动对象的跟踪轨迹与运行方向,是一种简单、实时高效的跟踪算法,这个算法最早是有Bruce D. Lucas and Takeo Kanade两位作者提出来的,所以又被称为KLT。KLT算法工作有三个假设前提条件:

  • 亮度恒定

  • 短距离移动

  • 空间一致性

亮度恒定

对象中任意像素点p(x,y)亮度值,在t-1时候的值,在t时刻移动(u, v)之后亮度值保持不变

空间一致性

假设对像素点p(x, y)来说,周围的像素点都保持相同的移动距离(u, v) 假设窗口大小为5x5,则对于25个窗口内的像素点来说,就会如下等式成立:

得到下面的过约束等式,根据最小二乘可以求解(u, v):

这样我们就得到了KLT光流等式与该窗口的的Hessian矩阵

空间尺度不变性

通过建立每一帧的图像金字塔,实现尺度空间窗口目标对象搜索

OpenCV中KLT演示代码实现

OpenCV中KLT算法API及其参数解释如下:

void cv::calcOpticalFlowPyrLK(
InputArray     prevImg, // 前一帧图像
InputArray     nextImg, // 后一帧图像
InputArray     prevPts, // 前一帧的稀疏光流点
InputOutputArray     nextPts, // 后一帧光流点
OutputArray     status, // 输出状态,1 表示正常该点保留,否则丢弃
OutputArray     err, // 表示错误
Size winSize = Size(21, 21), // 光流法对象窗口大小
int maxLevel = 3, // 金字塔层数,0表示只检测当前图像,不构建金字塔图像
TermCriteria     criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01), // 窗口搜索时候停止条件
int flags = 0, // 操作标志
double     minEigThreshold = 1e-4 // 最小特征值响应,低于最小值不做处理
)

特征点检测与绘制的代码实现如下:

// detect first frame and find corners in it
Mat old_frame, old_gray;
capture.read(old_frame);
cvtColor(old_frame, old_gray, COLOR_BGR2GRAY);
goodFeaturesToTrack(old_gray, featurePoints, maxCorners, qualityLevel, minDistance, Mat(), blockSize, useHarrisDetector, k);

特征点绘制

void draw_goodFeatures(Mat &image, vector<Point2f> goodFeatures) {for (size_t t = 0; t < goodFeatures.size(); t++) {circle(image, goodFeatures[t], 2, Scalar(0, 255, 0), 2, 8, 0);}
}

KLT跟踪代码如下

TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, 0.01);
double derivlambda = 0.5;
int flags = 0;bool ret = capture.read(frame);
if (!ret) break;
imshow("frame", frame);
roi.x = 0;
frame.copyTo(result(roi));
cvtColor(frame, gray, COLOR_BGR2GRAY);// calculate optical flow
calcOpticalFlowPyrLK(old_gray, gray, pts[0], pts[1], status, err, Size(31, 31), 3, criteria, derivlambda, flags);

特征点状态检查与匹配的代码如下

size_t i, k;
for (i = k = 0; i < pts[1].size(); i++)
{// 距离与状态测量double dist = abs(pts[0][i].x - pts[1][i].x) + abs(pts[0][i].y - pts[1][i].y);if (status[i] && dist > 2) {pts[0][k] = pts[0][i];initPoints[k] = initPoints[i];pts[1][k++] = pts[1][i];circle(frame, pts[1][i], 3, Scalar(0, 255, 0), -1, 8);}
}
// resize 有用特征点
pts[1].resize(k);
pts[0].resize(k);
initPoints.resize(k);

绘制跟踪轨迹的代码如下

// 绘制跟踪轨迹
draw_lines(frame, initPoints, pts[1]);

该方法实现如下:

void draw_lines(Mat &image, vector<Point2f> pt1, vector<Point2f> pt2) {if (color_lut.size() < pt1.size()) {for (size_t t = 0; t < pt1.size(); t++) {color_lut.push_back(Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));}}for (size_t t = 0; t < pt1.size(); t++) {line(image, pt1[t], pt2[t], color_lut[t], 2, 8, 0);}
}

运行效果

左侧是视频的原始每一帧、右侧视频是每一帧中KLT算法实时轨迹绘制

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

干货 | OpenCV中KLT光流跟踪原理详解与代码演示相关推荐

  1. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  2. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  3. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  4. 手机摄影中多摄融合理论详解与代码实战

    转载AI Studio项目链接https://aistudio.baidu.com/aistudio/projectdetail/3465839 手机摄影中多摄融合理论详解与代码实战 前言   从20 ...

  5. 冒泡排序原理详解及代码实现

    1.冒泡排序数组排序常用的一种方式,为什么要叫冒泡排序呢?这还要从它的原理说起. 2.代码实现(低效版) 3.原理详解:冒泡排序最基本的思想就是从左到右依次判断相邻的两个数的大小关系,如果前面的数大于 ...

  6. OpenCV中直方图反向投影算法详解与实现

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自:opencv学堂 一:直方图交叉 OpenCV中直方图反向 ...

  7. Java中Unsafe类的原理详解与使用案例

    点击关注公众号,利用碎片时间学习 1 概述 本文基于JDK1.8. Unsafe类位于rt.jar包,Unsafe类提供了硬件级别的原子操作,类中的方法都是native方法,它们使用JNI的方式访问本 ...

  8. golang goroutine实现_golang中的Mutex设计原理详解(一)

    Mutex系列是根据我对晁岳攀老师的<Go 并发编程实战课>的吸收和理解整理而成,如有偏差,欢迎指正~ 目标 本系列除了希望彻底学习和了解 golang 中 sync.Mutex 的原理和 ...

  9. 干货 | MTCNN实时人脸检测网络详解与代码演示

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 MTCNN模型概述 多任务卷积神经网络 ...

最新文章

  1. Fedora 提出统一流程,弃用上千 Python 2 软件包更可控
  2. 学习新技术的10个建议
  3. 【自动驾驶】10.百度Apollo平台 事件通信机制
  4. Could not find *.apk!解决办法
  5. 中医科学院院士团队解析丹参纯合基因组和新基因簇在丹参酮合成中的作用
  6. php模板技术 实例
  7. java实现生产者消费者问题
  8. 编程练习赛11B 物品价值(装压dp)
  9. python version 3_VIM设置python3支持和检测python version
  10. c++ primer plus第六版英文版,有需要的小伙伴自取哦
  11. 重庆理工大学计算机转专业,2020年重庆理工大学转专业,大一新生转专业和入学考试...
  12. SSL 域名证书 安装指引
  13. 部署MooseFS分布式文件系统
  14. vscode报Could not find a declaration file for module ‘three/examples/jsm/libs/stats.module.js‘
  15. nowcoder 79F 小H和圣诞树 换根 DP + 根号分治
  16. 流水灯循环点亮c语言程序,流水灯来回点亮程序(汇编和C)
  17. Word list 3
  18. ar1220e-s虚拟服务器,华为路由器AR1220E-S和华为AP3010 FIT模式与openportal对接教程
  19. Mac m1 配置OpenCV (C++)
  20. linux合并优盘分区工具,mhddfs虚拟存储工具:Linux分区合并利器

热门文章

  1. Python3破冰人工智能,你需要掌握一些数学方法
  2. Tensorflow框架是如何支持分布式训练的?
  3. FPGA技术的未来发展:谁与AI平分秋色
  4. AI一分钟|阿里AI鉴黄师或将取代人类;特斯拉私有化空头潜在利润超10亿美元
  5. 为什么AI的翻译水平还远不能和人类相比?
  6. 【AAAI Oral】利用深度增强学习自动解数学题,准确率提升15%
  7. 怼完Sophia怼深度学习!细数完大神Yann LeCun 这些年怼过的N件事,原来顶级高手是这样怼人的...
  8. SpringBoot静态获取 bean的三种方式,你学会了吗?
  9. 收藏:存储知识全面总结
  10. OpenAI数十亿代码训出Codex:能将英语翻译成代码,给四句话就能写个神经网络...