fmransac_test2.m
上传用户:trade789
上传日期:2018-05-10
资源大小:603k
文件大小:7k
源码类别:

2D图形编程

开发平台:

Matlab

  1. % FMRANSAC_TEST
  2. %
  3. % This script demonstrates the use of the RANSAC algorithm (in
  4. % combination with local information) for inducing point
  5. % correspondences between two images of the same scene.
  6. %
  7. % First, an image with corners is created.  Then, the Harris corner
  8. % detector is used to compute a set of interest points.  Next, both
  9. % the image and the feature points are passed through a projective
  10. % transformation in order to create a new image with the same feature
  11. % points as the first (and thus, a known correspondence).
  12. %
  13. % Then the following steps are performed to match the points
  14. % (without knowledge of the actual correspondence).  First, a crude
  15. % matching is obtained by using feature keys that characterize the
  16. % local neighborhood of each interest point.  Then, RANSAC is used
  17. % on this set of matches to exclude incorrect matches and generate
  18. % an estimate of the fundamental matrix that relates the two sets
  19. % of points.  Finally, the fundamental matrix is used to match the
  20. % original set of interest point.
  21. % Copyright (C) 2002 Mark A. Paskin
  22. %
  23. % This program is free software; you can redistribute it and/or modify
  24. % it under the terms of the GNU General Public License as published by
  25. % the Free Software Foundation; either version 2 of the License, or
  26. % (at your option) any later version.
  27. %
  28. % This program is distributed in the hope that it will be useful, but
  29. % WITHOUT ANY WARRANTY; without even the implied warranty of
  30. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  31. % General Public License for more details.
  32. %
  33. % You should have received a copy of the GNU General Public License
  34. % along with this program; if not, write to the Free Software
  35. % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  36. % USA.
  37. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  38. clear p im hc hcm hcmf hcmfi;
  39. % Play with these parameters:
  40. keytype = 2;    % The type of feature key to use
  41. gdorder = 4;    % The highest order Gaussian derivative filters to use
  42. gdsigma = 5;    % The standard deviation of the Gaussian derivatives
  43. steer = 0;      % Steer filters in gradient direction for rotational invariance
  44. % Create an image with lots of "inside" and "outside" corners in it
  45. im1 = corners('prob', 0.5);
  46. [ny, nx] = size(im1);
  47. if 0
  48. % Transform the image twice
  49. T = maketform('projective', ...
  50.        [0 0; ny 0;      ny nx;     0 nx], ...
  51.        [0 0; ny 0.3*nx; ny 0.7*nx; 0 nx]);
  52. im2 = imtransform(im1, T, 'FillValues', 255);
  53. else
  54.     im2 = affine(im1, pi/2, 1, 1, 0, 0, nx/2, ny/2);
  55. end
  56. % Run the Harris corner detector on both images
  57. p1 = harris_pts(im1, 'smoothing', 1.0, 'nmsrad', 2, 'relthresh', 0.1);
  58. % Project the corners in the first image through the transformation
  59. p2 = fliplr(tformfwd(fliplr(p1), T));
  60. % Compute the feature keys
  61. switch keytype
  62.  case 0
  63.   % Test: this should be perfect
  64.   W = -diag(ones(1, size(p1, 1)));
  65.  case 1
  66.   K1 = nfdkeys(p1, 'k', 20, 'sd', 10, 'ss', pi/20);
  67.   K2 = nfdkeys(p2, 'k', 20, 'sd', 10, 'ss', pi/20);
  68.   W = -real(K1 * K2');
  69.  case 2
  70.   F = gdfilters(gdorder, gdsigma);
  71.   f = cat(3, F{:});
  72.   K1 = fkeys(im1, round(p1), f, 'steer', steer);
  73.   K2 = fkeys(im2, round(p2), f, 'steer', steer);
  74.   % Compute an affinity matrix
  75.   W = disteusq(K1, K2, 'x', inv(cov([K1; K2])));
  76. end
  77. % Obtain an initial set of matches using local information.  Only
  78. % some of these will be correct.
  79. a = match(W);
  80. b = find(a);
  81. s = length(b);
  82. q1 = [p1(b, [2 1]), ones(s, 1)];
  83. q2 = [p2(a(b), [2 1]), ones(s, 1)];
  84. % Plot the matching
  85. subplot(3, 2, 1);
  86. imagesc(im1); colormap(gray); axis image; axis off; hold on;
  87. correct = find(a' == 1:length(a));
  88. incorrect = find(a' ~= 1:length(a));
  89. text(q1(incorrect, 1), q1(incorrect, 2), int2str(incorrect'), ...
  90.      'Color', 'r', 'FontSize', 7, ...
  91.      'HorizontalAlignment', 'center');
  92. text(q1(correct, 1), q1(correct, 2), int2str(correct'), ...
  93.      'Color', 'b', 'FontSize', 7, ...
  94.      'HorizontalAlignment', 'center');
  95. title('Local matches (blue=correct;red=incorrect)');
  96. hold off;
  97. subplot(3, 2, 2);
  98. imagesc(im2); colormap(gray); axis image; axis off; hold on;
  99. text(q2(incorrect, 1), q2(incorrect, 2), int2str(incorrect'), ...
  100.      'Color', 'r', 'FontSize', 7, ...
  101.      'HorizontalAlignment', 'center');
  102. text(q2(correct, 1), q2(correct, 2), int2str(correct'), ...
  103.      'Color', 'b', 'FontSize', 7, ...
  104.      'HorizontalAlignment', 'center');
  105. title(sprintf('Local matches (%d/%d correct)', ...
  106.       sum(a' == 1:size(p1, 1)), ...
  107.       size(p1, 1)));
  108. hold off;
  109. % Run RANSAC to obtain the final matching
  110. [F, k] = fmransac(q1, q2, 'numpairs', 7, 'conf', 0.9, ...
  111.   'maxsamples', 10000);
  112. correct = find(a(b(k)) == b(k));
  113. incorrect = find(a(b(k)) ~= b(k));
  114. % Plot the matching
  115. subplot(3, 2, 3);
  116. imagesc(im1); colormap(gray); axis image; axis off; hold on;
  117. text(q1(k(incorrect), 1), q1(k(incorrect), 2), int2str(k(incorrect)), ...
  118.      'Color', 'r', 'FontSize', 7, ...
  119.      'HorizontalAlignment', 'center');
  120. text(q1(k(correct), 1), q1(k(correct), 2), int2str(k(correct)), ...
  121.      'Color', 'b', 'FontSize', 7, ...
  122.      'HorizontalAlignment', 'center');
  123. title('RANSAC matches (blue=correct;red=incorrect)');
  124. hold off;
  125. subplot(3, 2, 4);
  126. imagesc(im2); colormap(gray); axis image; axis off; hold on;
  127. text(q2(k(incorrect), 1), q2(k(incorrect), 2), int2str(k(incorrect)), ...
  128.      'Color', 'r', 'FontSize', 7, ...
  129.      'HorizontalAlignment', 'center');
  130. text(q2(k(correct), 1), q2(k(correct), 2), int2str(k(correct)), ...
  131.      'Color', 'b', 'FontSize', 7, ...
  132.      'HorizontalAlignment', 'center');
  133. title(sprintf('RANSAC-matches (%d/%d correct)', ...
  134.       sum(a(b(k)) == b(k)), ...
  135.       size(k, 1)));
  136. hold off;
  137. % Finally, use the estimated fundamental matrix to search for
  138. % matches.
  139. q1 = [p1(:, [2 1]), ones(size(p1, 1), 1)];
  140. q2 = [p2(:, [2 1]), ones(size(p2, 1), 1)];
  141. a = fmmatch(q1, q2, F);
  142. % Plot the final matching
  143. subplot(3, 2, 5);
  144. imagesc(im1); colormap(gray); axis image; axis off; hold on;
  145. correct = find(a' == 1:length(a));
  146. incorrect = find(a' ~= 1:length(a));
  147. text(q1(incorrect, 1), q1(incorrect, 2), int2str(incorrect'), ...
  148.      'Color', 'r', 'FontSize', 7, ...
  149.      'HorizontalAlignment', 'center');
  150. text(q1(correct, 1), q1(correct, 2), int2str(correct'), ...
  151.      'Color', 'b', 'FontSize', 7, ...
  152.      'HorizontalAlignment', 'center');
  153. title('Final matches (blue=correct;red=incorrect)');
  154. hold off;
  155. subplot(3, 2, 6);
  156. imagesc(im2); colormap(gray); axis image; axis off; hold on;
  157. text(q2(incorrect, 1), q2(incorrect, 2), int2str(a(incorrect)), ...
  158.      'Color', 'r', 'FontSize', 7, ...
  159.      'HorizontalAlignment', 'center');
  160. text(q2(correct, 1), q2(correct, 2), int2str(a(correct)), ...
  161.      'Color', 'b', 'FontSize', 7, ...
  162.      'HorizontalAlignment', 'center');
  163. title(sprintf('Final matches (%d/%d correct)', ...
  164.       sum(a' == 1:length(a)), ...
  165.       size(p1, 1)));
  166. hold off;
  167. return