参考:https://blog.csdn.net/gjy095/article/details/9226883?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1

# encoding:utf-8
'''
Lucas-Kanade tracker
====================
Lucas-Kanade sparse optical flow demo. Uses goodFeaturesToTrack
for track initialization and back-tracking for match verification
between frames.
Usage
-----
lk_track.py [<video_source>]
Keys
----
ESC - exit
'''import numpy as np
import cv2
# from common import anorm2, draw_str
from time import clocklk_params = dict(winSize=(15, 15),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))feature_params = dict(maxCorners=500,qualityLevel=0.3,minDistance=7,blockSize=7)class App:def __init__(self, video_src):  # 构造方法,初始化一些参数和视频路径self.track_len = 10self.detect_interval = 5self.tracks = []self.cam = cv2.VideoCapture(video_src)self.frame_idx = 0def run(self):  # 光流运行方法while True:ret, frame = self.cam.read()  # 读取视频帧if ret == True:frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转化为灰度虚图像vis = frame.copy()if len(self.tracks) > 0:  # 检测到角点后进行光流跟踪img0, img1 = self.prev_gray, frame_grayp0 = np.float32([tr[-1] for tr in self.tracks]).reshape(-1, 1, 2)p1, st, err = cv2.calcOpticalFlowPyrLK(img0, img1, p0, None,**lk_params)  # 前一帧的角点和当前帧的图像作为输入来得到角点在当前帧的位置p0r, st, err = cv2.calcOpticalFlowPyrLK(img1, img0, p1, None,**lk_params)  # 当前帧跟踪到的角点及图像和前一帧的图像作为输入来找到前一帧的角点位置d = abs(p0 - p0r).reshape(-1, 2).max(-1)  # 得到角点回溯与前一帧实际角点的位置变化关系good = d < 1  # 判断d内的值是否小于1,大于1跟踪被认为是错误的跟踪点new_tracks = []for tr, (x, y), good_flag in zip(self.tracks, p1.reshape(-1, 2), good):  # 将跟踪正确的点列入成功跟踪点if not good_flag:continuetr.append((x, y))if len(tr) > self.track_len:del tr[0]new_tracks.append(tr)cv2.circle(vis, (x, y), 2, (0, 255, 0), -1)self.tracks = new_trackscv2.polylines(vis, [np.int32(tr) for tr in self.tracks], False,(0, 255, 0))  # 以上一振角点为初始点,当前帧跟踪到的点为终点划线# draw_str(vis, (20, 20), 'track count: %d' % len(self.tracks))if self.frame_idx % self.detect_interval == 0:  # 每5帧检测一次特征点mask = np.zeros_like(frame_gray)  # 初始化和视频大小相同的图像mask[:] = 255  # 将mask赋值255也就是算全部图像的角点for x, y in [np.int32(tr[-1]) for tr in self.tracks]:  # 跟踪的角点画圆cv2.circle(mask, (x, y), 5, 0, -1)p = cv2.goodFeaturesToTrack(frame_gray, mask=mask, **feature_params)  # 像素级别角点检测if p is not None:for x, y in np.float32(p).reshape(-1, 2):self.tracks.append([(x, y)])  # 将检测到的角点放在待跟踪序列中self.frame_idx += 1self.prev_gray = frame_graycv2.imshow('lk_track', vis)ch = 0xFF & cv2.waitKey(1)if ch == 27:breakdef main():import systry:video_src = sys.argv[1]except:video_src = "/Users/wangyitian/OneDrive/论文方向/举重/视频资料(1)/右机位/石智勇z-3-168kg成功 破世纪.avi"print(__doc__)App(video_src).run()cv2.destroyAllWindows()if __name__ == '__main__':main()

参考:https://blog.csdn.net/FireMicrocosm/article/details/48496697?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link

# -*- coding:utf-8 -*-
__author__ = 'Microcosm'import cv2
import numpy as npcap = cv2.VideoCapture("E:/python/Python Project/opencv_showimage/videos/visionface.avi")# 设置 ShiTomasi 角点检测的参数
feature_params = dict( maxCorners=100,qualityLevel=0.3,minDistance=7,blockSize=7 )# 设置 lucas kanade 光流场的参数
# maxLevel 为使用图像金字塔的层数
lk_params = dict( winSize=(15,15),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 产生随机的颜色值
color = np.random.randint(0,255,(100,3))# 获取第一帧,并寻找其中的角点
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)# 创建一个掩膜为了后面绘制角点的光流轨迹
mask = np.zeros_like(old_frame)while(1):ret, frame = cap.read()if ret:frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算能够获取到的角点的新位置p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 选取好的角点,并筛选出旧的角点对应的新的角点good_new = p1[st == 1]good_old = p0[st == 1]# 绘制角点的轨迹for i,(new,old) in enumerate(zip(good_new,good_old)):a,b = new.ravel()c,d = old.ravel()cv2.line(mask, (a,b), (c,d), color[i].tolist(), 2)cv2.circle(frame, (a,b), 5, color[i].tolist(), -1)img = cv2.add(frame, mask)cv2.imshow("frame", img)k = cv2.waitKey(30) & 0xffif k == 27:break# 更新当前帧和当前角点的位置old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)else:breakcv2.destroyAllWindows()
cap.release()


matlab版本
参考:https://blog.csdn.net/sgfmby1994/article/details/68489944?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTdefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2defaultCTRLISTdefault-1.no_search_link
参考:https://blog.csdn.net/SatisfyMyCuriousity/article/details/104703312

matlab代码在链接:https://pan.baidu.com/s/1mlmoPuIDXJS9uP2iSQBT1w 提取码:fvxt

光流跟踪 Lucas-Kanade(LK)算法,用于目标追踪相关推荐

  1. 光流(三)--LK算法改进(金字塔LK)

    LKDemo直接在OpenCV  samples里. 原文: http://blog.csdn.net/u014568921/article/details/46638557 另外一篇:http:// ...

  2. 手撕自动驾驶算法——多目标追踪:imm交互式多模型

    文章目录 基本原理 流程图 公式推导 Mixing Prediction Updates Combination 基本原理 状态估计问题依赖于对象运动模型来预测和更新对象状态.然而,在城市情况下,被跟 ...

  3. 基于yolov5框架实现人流统计(目标检测算法、目标追踪算法以及越界识别功能)+手机获取统计人数

    主要实现的AI算法有:目标检测.目标追踪 主要实现AI算法功能:越界识别功能(主要是获取统计人流量) 平台:基于Aidlux平台 基础库安装: (1)lap安装: 先sudo apt-get upda ...

  4. sitf+LK+pnp 识别、跟踪图片,并求三维旋转角度(四) -----LK光流跟踪

    解释下上篇遗留问题,为什么会用到光流法,因为模型要在手机甚至眼镜端上运行,这就要求速度,和用户体验感,我用sift一次对比的时间大概在200ms,人眼1s差不多在12帧,所以光用sift是达不到1秒1 ...

  5. 【算法分析】Lucas–Kanade光流算法

    (最近再看光流法的应用,发现一篇对算法讲的非常好的文章,转载过来看) 转自:gnuhpc的百草园和三味书屋 作者:gnuhpc@gmail.com 简介:在计算机视觉中,Lucas–Kanade光流算 ...

  6. Lucas–Kanade光流算法

    1. 光流的概念 •空间运动物体在观察成像平面上的像素运动的瞬时速度 2. 光流法的原理 •利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相 ...

  7. 详解OpenCV中的Lucas Kanade稀疏光流单应追踪器

    详解OpenCV中的Lucas Kanade稀疏光流单应追踪器 1. 效果图 2. 源码 参考 这篇博客将详细介绍OpenCV中的Lucas Kanade稀疏光流单应追踪器. 光流是由物体或相机的运动 ...

  8. Lucas Kanade 光流法(来自wiki 百科)

    小伙伴们开始正式玩起了APM的PX4flow,加上课题方向也要用到光流法,因此从哪个角度来说,都是十分必要的. 光流法最常用的是用于机器视觉的跟踪算法,一是可以跟踪目标物体,而是求解目标的运动学参数( ...

  9. Lucas–Kanade算法

     本文转自:http://blog.csdn.net/JustRemind/article/details/23745579 原文地址:http://www.cnblogs.com/gnuhpc/ ...

最新文章

  1. 现实世界的Windows Azure:采访圣地亚哥公共安全小组的技术经理Adrian Gonzalez
  2. NFS配置全新设置常用参数说明
  3. 用SQL删除重复记录的N种方法
  4. PHP调用数据库数据乱码问题
  5. 中国IT人,你们是否从没想过开发一款伟大的产品?
  6. mxnet导入图像数据
  7. python中bd是什么属性_python数据类型及其特有方法
  8. iOS YYText的使用笔记二(YYLabel聊天表情+文字并排)
  9. python求小于n的最大素数_枚举1--求小于n的最大素数
  10. OA多级审批流程表设计方案(干货满满)
  11. C++ 利用管道操作本机命令行命令
  12. OPENWRT-LUCI开发总结-LUCI开发过程中的小技巧
  13. zabbix实现对mysql数据库的监控
  14. java nas smb_FreeNAS 02:深入 SMB 服务使用
  15. 根据身高体重计算某个人的BMI值
  16. python 的StringIO
  17. 作为程序员,你关注哪些国外 IT 网站?
  18. Mac OS X的Spotlight综述
  19. 基于java springboot android 安卓商城源码
  20. sparql查询mysql_SPARQL查询以检索所有对象和属性

热门文章

  1. 使用GitLab来实现IOS项目的持续集成CI
  2. JDK11安装完成后没有jre目录
  3. 剪辑掉图像替换照片_使用动态剪辑过滤HTML图像标题
  4. 欣瑞达一分钟教程,如何接RS232/RS485线
  5. 668. 游戏时间2
  6. 微信小程序开发之路⑩
  7. QT qrand()随机函数不随机?
  8. openwrt下有线网设置详细过程
  9. 整机压力测试_一种服务器整机压力的测试方法
  10. 修改node.js全局依赖包的安装路径