Shi-Tomasi角点检测及光流法追踪——复现VINS前端视觉数据处理

    “万顷湖天碧,一星飞鹭白。”——(唐)皮日休《秋江晓望》

    最近自己写代码复现了一下VINS的前端视觉数据处理的过程,主要是对图像检测Shi-Tomasi特征点,之后使用光流法进行追踪,再使用RANSAC算法计算基础矩阵将匹配的异常值剔除。闲言少叙,直接进入代码环节。

实验基础

    首先是图像数据的读取,为了适应之后的特征点提取的函数,这里直接读入灰度图像。而彩色图像只用于匹配结果的可视化。

    img1 = cv::imread(first_img_path, cv::IMREAD_GRAYSCALE);//读入灰度图像
    img2 = cv::imread(second_img_path, cv::IMREAD_GRAYSCALE);
    img1_ = cv::imread(first_img_path);//读入彩色图像
    img2_ = cv::imread(second_img_path);

    之后便是Shi-Tomasi角点的提取了,使用cv::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角点检测时使用
	);

     第一个参数是输入图像(8位或32位单通道图)。第二个参数是检测到的所有角点,类型为vector或数组,由实际给定的参数类型而定。如果是vector,那么它应该是一个包含cv::Point2f的vector对象;如果类型是cv::Mat,那么它的每一行对应一个角点,点的x、y位置分别是两列。第三个参数用于限定检测到的点数的最大值。第四个参数表示检测到的角点的质量水平(通常是0.10到0.01之间的数值,不能大于1.0)。第五个参数用于区分相邻两个角点的最小距离(小于这个距离得点将进行合并)。第六个参数是mask,如果指定,它的维度必须和输入图像一致,且在mask值为0处不进行角点检测。第七个参数是blockSize,表示在计算角点时参与运算的区域大小,常用值为3,但是如果图像的分辨率较高则可以考虑使用较大一点的值。第八个参数用于指定角点检测的方法,如果是true则使用Harris角点检测,false则使用Shi Tomasi算法。第九个参数是在使用Harris算法时使用,最好使用默认值0.04。

    特征点提取完毕之后就可以对特征点进行光流法追踪了,使用cv::calcOpticalFlowPyrLK()函数。具体的调用形式如下:

void cv::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 
);

    第一个参数输入第一张图片,8bit,单通道或3通道。第二个参数为第二张图片,类型和大小需要和第一张相同。第三个参数是需要被追踪的2D特征点矢量,坐标必须为单精度。第四个参数是输出的单精度特征点坐标矢量。第五个参数为输出的状态矢量,追踪成功为1,反之为0。第六个参数是误差向量。第七个参数为每一级金字塔的搜索窗。第八个参数代表金字塔建造级别,0-不使用(仅适用原始图像),1-原始图像加1级金字塔。最后的几个参数我也不太懂,一般默认即可。

     使用RANSAC算法计算基础矩阵,剔除异常值。使用cv::findFundamentalMat()函数。具体调用形式如下:

cv::Mat cv::findFundamentalMat( InputArray points1, 
                                InputArray points2,
                                int method = FM_RANSAC,
                                double param1 = 3., 
                                double param2 = 0.99,
                                OutputArray mask = noArray() 
);

     第一个参数

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值