KLT光流跟踪特征点对

前言

本篇所述为KLT光流跟踪两个视频中匹配特征点对的具体实现。=> 源码见Github openCV版本:4.5.5

函数详解

1. 特征提取

(1) SIFT特征提取调用方式
sift=cv2.SIFT_create()   # ORB_create()
kp,d=sift.detectAndCompute(frame_gray, None)

OpenCV-Python Tutorials-Feature Detection and Description

关于匹配后的下标决定说明 kp1的索引由DMatch对象属性为queryIdx决定

(2) 角点检测

角点:某一点在任意方向的一个微小变动都会引起灰度很大的变化。
在这里插入图片描述
角点检测算法分类:

  • 基于灰度图像的角点检测
    基于梯度、基于模板、基于模板梯度组合
  • 基于二值图像的角点检测
  • 基于轮廓曲线的角点检测

基于模板的方法主要考虑像素邻域点的灰度变化 ,即图像亮度的变化。将与邻点亮度对比足够大的点定义为角点。常见的基于模板的角点检测算法有 Kitchen-Rosenfeld角点检测算法Harris角点检测算法KLT角点检测算法SUSAN角点检测算法

Harris角点检测

cv2.cornerHarris()

Shi-Tomasi角点检测

(Harris角点检测的进阶版)

cv2.goodFeaturesToTrack()

void cv::goodFeaturesToTrack(
		cv::InputArray image,    // 输入图像(CV_8UC1 CV_32FC1)
		cv::OutputArray corners, // 输出角点vector
		int maxCorners,          // 最大角点数目
		double qualityLevel,     // 质量水平系数(小于1.0的正数,一般在0.01-0.1之间)
		double minDistance,      // 最小距离,小于此距离的点忽略
		// 以下为可选参数
		cv::InputArray mask = noArray(), //指定感兴趣区域。 mask=0的点忽略
		int blockSize = 3,       // 使用的邻域数:计算协方差矩阵时的窗口大小
		bool useHarrisDetector = false,   // false ='Shi Tomasi metric'
		double k = 0.04         // Harris角点检测时使用
	);

// 常用如下参数:
void cv::goodFeaturesToTrack(image,corner,
                     		500,     // 最多检测到的角点数
                     		0.01,    // 阈值系数
                     		10);     // 角点间的最小距离

在这里插入图片描述
角点特征检测之一(cornerHarris、Shi-Tomasi、FAST)

注意:角点无法直接用来做特征匹配,做特征匹配都是需要描述子的

参考:
cv2.GFTTDetector_create将角点作为特征点进行特征匹配

【Shi-Tomasi角点检测+SIFT特征匹配】返回值需要进行一个转换

(3) 棋盘内角点检测
# size是内格点数,输出有序,按行展开
st1,corner1=cv2.findChessboardCorners(frame1gray,(9,6),None) # <class 'numpy.ndarray'>

当检测到了给定size的角点,st才会返回非0值

更详细的函数说明:角点检测与FindChessboardCorners函数

2. 特征匹配

python 3+opencv3.4 – 特征匹配

Python OpenCV 特征点检测与匹配

关于不是很熟的只适用于SIFT/SURF的FLANN匹配 & 一个很好的学习openCV的博客

(1) Harris角点匹配
基于PCV库
角点特征匹配

从0计算响应值并进行匹配

函数说明&完整实现(删除静止点)

KLT-Tracking

lk_params=dict(winSize=(15,15),
                maxLevel=2,
                criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

tk2,st,err=cv2.calcOpticalFlowPyrLK(frame2gray,frame_nxgray2,track_points2,None,**lk_params)

python-openCV官方文档对于该函数的详解

KLT里的默认是Shi-Tomasi 角点检测,也可以换成fast cv2.FastFeatureDetector() ,参考:光流算法学习

KLT视频匹配跟踪几个要点

1. 判断静止点  前后两帧特征点位置微小?

知乎链- 静止点&回溯判断

类的写法&直接写法

2. 判断被遮挡点  st==0

3. 判断是否跟踪正确  环回检测?

4. 判断匹配是否正确  RANSAC?

Sift KLT

注意提取特征点的 类型和数据转换-Github

C++版本实现

遇到的BUG

  1. 特征点检测方法换成sift的过程中,注意特征点形式的转换过程中的数据形式dtype转换
    error: (-215:Assertion failed) (npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function

  2. YOLOv3载入权重报错  (opencv版本不同引起的输出格式不同)
    output_layers=[layer_names[i[0]-1] for i in net.getUnconnectedOutLayers()] IndexError: invalid index to scalar variable.

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于KLT(Kannade-Lucas-Tomasi)特征点算法的LK(Lucas-Kanade)金字塔FPGA实现是一种用于计算图像中的点的运动向量的方法。该方法可以用于目标跟踪、图像稳定等应用。 该实现利用FPGA(现场可编程门阵列)的并行处理能力和低延迟特性,使其具备高效处理实时图像的能力。FPGA的硬件资源可以用于在每个像素点上执行LK算法的计算,以计算像素点的运动向量。这样可以实现对整个图像的并行处理,提高了计算效率。 LK算法基于连续假设,利用图像灰度的变化来计算像素点的运动向量。为了处理不同尺度上的运动分量,该实现采用了金字塔结构。金字塔中的每一层都是原始图像的降采样版本,用于处理不同尺度下的运动。 KLT特征点算法用于检测图像中的角点,这些角点具有丰富的信息,并且在图像中具有较高的重复性。KLT算法通过计算这些角点的运动向量来估计整个图像的运动。 在FPGA实现中,KLT特征点的提取和LK计算是交替进行的。首先,KLT算法在每个金字塔层上检测角点,并保存其位置信息。然后,利用LK算法使用金字塔结构计算这些角点的运动向量。计算结果可以在FPGA的输出端口进行实时输出,或者保存在缓存中用于后续的处理。 总之,基于KLT特征点的LK金字塔FPGA实现是一种高效且实时的图像处理方法。它可以广泛应用于目标跟踪、图像稳定和其他需要计算图像中点的运动向量的场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值