三维重建学习(一)特征提取和追踪

前言

今年大三,7月份来到澳洲国立大学(ANU)留学读双学位,在这的第一个学期就申请了Research and Development Project,有幸能够跟随导师做一个关于3D重建的项目。具体项目是基于一篇ICCV2015的论文《High Quality Structure from Small Motion for Rolling Shutter Cameras》,也就是SfSM,与传统的SfM略有不同,各有优劣。

学习过程很枯燥,大多要靠自己读论文,自己思考,因为这个项目的领域圈子很窄,人数很少,所以基本要靠独立思考。在这把学习的过程分享出来,也当是复习了。

这个项目我目前一直是在用Matlab实现,代码,运行结果,以及测试图片都会附上。

Feature Exaction 特征提取

这里用的特征提取就是很有名的Harris Corner,Matlab中Harris Corner的实现方法很简单,就是一个叫做detectMinEigenFeatures的函数,有兴趣可以看看 MathWorks的官方例子
points = detectMinEigenFeatures(I)
这里变量I即为存储图像的变量,输出的points即为提取的特征点的坐标。坐标储存在一个nx2的矩阵里,即points。
接下来我展示一下特征点提取的具体用法
% Load images
I1 = imread('MilkCart_1.jpg');

% Detect feature points
imagePoints1 = detectMinEigenFeatures(rgb2gray(I1), 'MinQuality', 0.1);

% Visualize detected points
figure
imshow(I1);
title('150 Strongest Corners from the First Image');
hold on
plot(selectStrongest(imagePoints1, 150));
像众多其他函数一样,detectMinEigenFeatures可以有一些其他的参数来对函数进行限制。
-rgb2gray(I) 这一步其实是对原图片进行了处理,最后作为函数参数的图片其实是一张灰度图,这么做是因为detectMinEigenFeatures函数只能对灰度图进行特征提取
-‘MinQuality’ 这个参数是对特征点提取设置一个threshold,或者说是“阈值“,简单的说,相当于设定只有达到了这个阈值的特征点才会被提取出来
-0.1 这个数值代表上一个参数所设置的数值,也就是说相当于现在把阈值设置为了0.1 (注意这是此函数常用的一个阈值,普遍适用于大部分情况)
接下来的几步就是将提取到的特征点展示出来,注意这里为了便于观察,只显示了150个效果最好的特征点
以下是测试结果,可见提取出来的特征点被清晰地标注了出来
三维重建学习(一)特征提取和追踪_第1张图片

Feature Tracking 特征追踪

特征追踪这里用的也是最常用的方法,Kanade-Lucas-Tomasi (KLT) feature tracker。Matlab中的实现方法比harris corner稍微复杂了一点,但相对还算是很简单。 官方例子。KLT feature tracker需要首先定义一个叫做vision.PointTracker的system object
pointTracker = vision.PointTracker
以第一张图的特征点作为参数对其进行初始化,然后用step函数求系统的阶越响应,即找到第二张图片中的对应点。
代码示例
% Load images
I1 = imread('MilkCart_1.jpg');
I2 = imread('MilkCart_2.jpg');

% Detect feature points
imagePoints1 = detectMinEigenFeatures(rgb2gray(I1), 'MinQuality', 0.1);

% Create the point tracker
tracker = vision.PointTracker('MaxBidirectionalError', 1, 'NumPyramidLevels', 5);

% Initialize the point tracker
imagePoints1 = imagePoints1.Location;
initialize(tracker, imagePoints1, I1);

% Track the points
[imagePoints2, validIdx] = step(tracker, I2);
matchedPoints1 = imagePoints1(validIdx, :);
matchedPoints2 = imagePoints2(validIdx, :);

% Visualize correspondences
figure
showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);
title('Tracked Features');
对pointTracker进行初始化之前,对第一张图中提取的特征点进行了重新定义
imagePoints1 = imagePoints1.Location;
这么做的原因是初始化是需要的是以nx2形式的点的坐标矩阵,但是由detectMinEigenFeatures提取出来的特征点的格式是以一种独有的变量定义的,这一步就是将变量中的location对象提取出来,赋给imagePoints1,即将其变成了一个坐标矩阵
接下来便是在第二张图中跟踪特征点,这里用到了step函数,其作用是求取一个动态系统的阶越响应, 官方例子。
[imagePoints2, validIdx] = step(tracker, I2);
具体在这里,imagePoints2是一个与imagePoints1维数完全相同的矩阵,存取第二张图中的特征点,而validIdx即“Valid Index”则是用来记录成功配对的特征点的角标,所以接下来便可从原本的特征点中提取成功配对的特征点。
最后用showMatchedFeatures函数将两张图的特征点同时表示在一张图像中,便于比较。
三维重建学习(一)特征提取和追踪_第2张图片
这张图把两张图片合成在了一起并且将对应点用直线连接了起来,不过因为两张图片重叠较大,不是很清晰
figure
imshow(I1);
title('Correspondences in the first image');
hold on
plot(matchedPoints1(:, 1), matchedPoints1(:, 2),'+y');
figure
imshow(I2);
title('Correspondences in the second image');
hold on
plot(matchedPoints2(:, 1), matchedPoints2(:, 2),'+y');
接下来这段代码分别标示了在两张图中的对应点
三维重建学习(一)特征提取和追踪_第3张图片 三维重建学习(一)特征提取和追踪_第4张图片
其实还是可以发现局部对应的结果并不是很理想,比如位于瓶盖部分的两个特征点的对应结果相差较大,但总体来说效果还不错
//关于特征点追踪的效果,感谢 @ dataems指出 物体中心对称或者轴对称的部分,特征点track肯定会有问题,纯色的部分会更差。”
-------------------------------------------------------------

附件

三维重建学习(一)特征提取和追踪_第5张图片 三维重建学习(一)特征提取和追踪_第6张图片


你可能感兴趣的:(三维重建学习(一)特征提取和追踪)