script7
clear close all load filelist img1 = rgb2gray(imread(files{1})); img2 = rgb2gray(imread(files{2}));
points1 = detectHarrisFeatures(img1); points2 = detectHarrisFeatures(img2); whos points1 points2
Name Size Bytes Class Attributes points1 1421x1 17164 cornerPoints points2 1291x1 15604 cornerPoints
[features1,valid_points1] = extractFeatures(img1,points1); [features2,valid_points2] = extractFeatures(img2,points2); whos features1 features2 valid_points1 valid_points2
Name Size Bytes Class Attributes features1 1x1 91064 binaryFeatures features2 1x1 81912 binaryFeatures valid_points1 1421x1 17164 cornerPoints valid_points2 1278x1 15448 cornerPoints
[indexPairs,matchmetric] = matchFeatures(features1,features2); whos indexPairs matchmetric
Name Size Bytes Class Attributes indexPairs 45x2 360 uint32 matchmetric 45x1 180 single
Retrieve the locations of the corresponding points for each image.
matchedPoints1 = valid_points1(indexPairs(:,1),:); matchedPoints2 = valid_points2(indexPairs(:,2),:);
figure(1); showMatchedFeatures(img1,img2,matchedPoints1,matchedPoints2,'Montage'); npts = size(matchedPoints1,1); title([num2str(npts) ' Candidate point matches']); legend('Matched points 1','Matched points 2');
Warning: Image is too big to fit on screen; displaying at 13%
figure(2); pts1 = double(matchedPoints1.Location); show_points(img1,pts1); pts2 = double(matchedPoints2.Location);
Warning: Image is too big to fit on screen; displaying at 25%
[F, inliersIndex] = estimateFundamentalMatrix(pts1,pts2); format shortg F format dev = zeros(npts,1); for k = 1:npts dev(k) = [pts2(k,1:2) 1]*F*[pts1(k,1:2) 1]'; end ndx = 1:npts; [ndx' inliersIndex dev]
F =
2.2777e-07 1.5967e-06 -0.001249
-1.7029e-06 8.7924e-08 0.0026363
0.00031063 -0.0026733 0.99999
ans =
1.0000 0 -0.0005
2.0000 1.0000 0.0002
3.0000 0 -0.0004
4.0000 1.0000 0.0002
5.0000 1.0000 -0.0002
6.0000 1.0000 0.0002
7.0000 0 -0.0003
8.0000 1.0000 -0.0001
9.0000 0 -0.0005
10.0000 0 0.0008
11.0000 1.0000 -0.0001
12.0000 1.0000 -0.0002
13.0000 1.0000 0.0003
14.0000 1.0000 0.0003
15.0000 0 0.0172
16.0000 1.0000 0.0007
17.0000 1.0000 0.0004
18.0000 0 0.0019
19.0000 1.0000 0.0005
20.0000 0 -0.6873
21.0000 1.0000 -0.0001
22.0000 1.0000 0.0000
23.0000 1.0000 0.0004
24.0000 1.0000 0.0006
25.0000 1.0000 0.0008
26.0000 1.0000 -0.0002
27.0000 0 -0.0006
28.0000 1.0000 0.0001
29.0000 1.0000 0.0009
30.0000 1.0000 0.0001
31.0000 0 -0.0004
32.0000 0 -0.1759
33.0000 0 -0.1260
34.0000 0 1.4491
35.0000 0 -0.0586
36.0000 0 -0.0347
37.0000 1.0000 0.0014
38.0000 0 0.0083
39.0000 0 -0.1145
40.0000 1.0000 0.0029
41.0000 0 -0.0337
42.0000 0 -0.0108
43.0000 0 -0.7671
44.0000 0 -0.7269
45.0000 0 -0.6820
kdx = find(inliersIndex>0); [mx, mdx] = sort(abs(dev(kdx)),'descend'); n = kdx(mdx(1)); fprintf('number of inliers %d\n',length(kdx)); fprintf('maximum inlier dev(%d) = %g\n',n,abs(dev(n)))
number of inliers 23 maximum inlier dev(40) = 0.0029295