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) 角点检测

角点:某一点在任意方向的一个微小变动都会引起灰度很大的变化。
KLT光流跟踪特征点对_第1张图片
角点检测算法分类:

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

基于模板的方法主要考虑像素邻域点的灰度变化 ,即图像亮度的变化。将与邻点亮度对比足够大的点定义为角点。常见的基于模板的角点检测算法有 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);     // 角点间的最小距离

KLT光流跟踪特征点对_第2张图片
角点特征检测之一(cornerHarris、Shi-Tomasi、FAST)

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

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

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

(3) 棋盘内角点检测

# size是内格点数,输出有序,按行展开
st1,corner1=cv2.findChessboardCorners(frame1gray,(9,6),None) # 

当检测到了给定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.

你可能感兴趣的:(图像处理,图像处理)