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

2D图形编程

开发平台:

Matlab

  1. % MOTION_CORR - Computes a set of interest point correspondences
  2. %               between two successive frames in an image
  3. %               sequence.  First, a Harris corner detector is used
  4. %               to choose interest points.  Then, CORR is used to
  5. %               obtain a matching, using both geometric constraints
  6. %               and local similarity of the points' intensity
  7. %               neighborhoods.
  8. %
  9. % Usage:  [p1, p2, a, F] = motion_corr(im1, im2[, OPTIONS])
  10. %
  11. % Arguments:   
  12. %            im1    - an image
  13. %            im2    - another image
  14. % Options:
  15. %            'p1'        - an m x 3 matrix whose rows are
  16. %                          (homogeneous) coordinates of interest
  17. %                          points in im1; if supplied,
  18. %                          this matrix will be returned as p1; it can be
  19. %                          the empty matrix [] (in which case it is as if
  20. %                          they were not supplied)
  21. %            'smoothing' - pre-smoothing before corner detection
  22. %                          (default: 2.0)
  23. %            'nmsrad'    - radius for non-maximal suppression of Harris
  24. %                          response matrix (default: 2)
  25. %            'rthresh'   - relative threshold for Harris response
  26. %                          matrix (default: 0.3)
  27. %            'rthresh2'  - smaller relative threshold used to
  28. %                          search for matches in the second image
  29. %                          (default: rthresh / 2.0)
  30. %            'sdthresh'  - a distance threshold; no matches will be
  31. %                          accepted such that the Sampson distance
  32. %                          is greater than the threshold (default: 1.0)
  33. %            'dthresh'   - a distance threshold; no matches will be
  34. %                          accepted such that the Euclidean
  35. %                          distance between the matched points is
  36. %                          greater than dthresh (default: 30)
  37. %
  38. %   This function also accepts options for CORR.
  39. %
  40. % Returns:
  41. %            p1     - an m x 3 matrix whose rows are the
  42. %                     (homogeneous) coordinates of interest points
  43. %                     in im1 (this will be the value given to the 'p1'
  44. %                     option, if it is supplied)
  45. %            p2     - an n x 3 matrix whose rows are the
  46. %                     (homogeneous) coordinates of interest points
  47. %                     in im2
  48. %            a      - an m x 1 assignment vector.  a(i) is the index of
  49. %                     the feature of the second image that was matched
  50. %                     to feature i of the first image.  For example,
  51. %                     p1(i, :) is matched to p2(a(i), :).  If feature i
  52. %                     (of the first image) was not matched to any 
  53. %                     feature in the second image, then a(i) is zero.
  54. %            F      - the fundamental matrix used to compute the matching.
  55. %
  56. % See also CORR and HARRIS_PTS.
  57. % Copyright (C) 2002 Mark A. Paskin
  58. %
  59. % This program is free software; you can redistribute it and/or modify
  60. % it under the terms of the GNU General Public License as published by
  61. % the Free Software Foundation; either version 2 of the License, or
  62. % (at your option) any later version.
  63. %
  64. % This program is distributed in the hope that it will be useful, but
  65. % WITHOUT ANY WARRANTY; without even the implied warranty of
  66. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  67. % General Public License for more details.
  68. %
  69. % You should have received a copy of the GNU General Public License
  70. % along with this program; if not, write to the Free Software
  71. % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  72. % USA.
  73. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  74. function [p1, p2, a, F] = motion_corr(im1, im2, varargin)
  75. % STEP 0: Process options
  76. [p1, ...
  77.  smoothing, ...
  78.  nmsrad, ...
  79.  rthresh, ...
  80.  rthresh2, ...
  81.  sdthresh, ...
  82.  dthresh, ...
  83.  corr_opts] = process_options(varargin, 'p1', [], ...
  84.                                         'smoothing', 2, ...
  85.                                         'nmsrad', 2, ...
  86.                                         'rthresh', 0.3, ...
  87.                                         'rthresh2', nan, ...
  88.                 'sdthresh', 1.0, ...
  89.                 'dthresh', 30);
  90. if (isnan(rthresh2)) rthresh2 = rthresh / 2.0; end
  91. 'yes this is the right file...'
  92. % STEP 1: Extract interest points in the second image.  Note that
  93. %         this is done with the smaller (or more forgiving)
  94. %         relative threshold.  Later, we will re-threshold to
  95. %         remove those points in im2 that remain unmatched and do
  96. %         not satisfy rthresh (the more selective threshold).
  97. [p2, z2] = harris_pts(im2, 'smoothing', smoothing, ...
  98.       'nmsrad', nmsrad, 'rthresh', rthresh2);
  99. % If no interest points were provided for the first image, compute them
  100. if (isempty(p1)) 
  101.   p1 = harris_pts(im1, 'smoothing', smoothing, 'nmsrad', nmsrad, ...
  102.   'rthresh', rthresh);
  103. else
  104.   % Ensure the final coordinates are unity
  105.   p1 = p1 ./ p1(:, [3 3 3]);
  106. end
  107.   
  108. % STEP 2: Form a cost matrix based upon local properties of the
  109. %         interest points.  The cost metric we use here is the sum of
  110. %         squared differences of intensity values in a square
  111. %         neighborhood around the pixels; a hard Euclidean distance
  112. %         threshold is implemented so all point pairs that are too far
  113. %         apart are given infinite cost.
  114. D = disteusq(p1(:, 1:2), p2(:, 1:2), 'xs');
  115. N1 = nbhds(im1, round(p1(:, 2)), round(p1(:, 1)), 5, 5);
  116. N2 = nbhds(im2, round(p2(:, 2)), round(p2(:, 1)), 5, 5);
  117. C = disteusq(double(N1), double(N2), 'x');
  118. C(find(D > dthresh)) = Inf;
  119. % STEP 3: Compute the correspondence.
  120. [a, F] = corr(p1, p2, C, 'sdthresh', sdthresh, corr_opts{:});
  121. % STEP 4: Enforce thresholds.  Keep only those points in the second
  122. %         image that (a) obey the primary relative threshold or (b)
  123. %         are matched with points in the first image.
  124. i = find(a);
  125. k = setdiff(find(z2 >= rthresh * max(z2)), a(i));
  126. p2 = p2([a(i); k], :);
  127. a(i) = 1:length(i);
  128. figure 
  129. imagesc(im1);
  130. colormap gray
  131. hold on
  132. for i=1:size(p1,1)
  133.     plot(p1(i,1),p1(i,2),'g+');
  134. end
  135. for i=1:size(p1,1)
  136.     x = p1(i,1);
  137.     y = p1(i,2);
  138.     if a(i)~=0 
  139.         u = p2(a(i),1)-p1(i,1);
  140.         v = p2(a(i),2)-p1(i,2);
  141.         plot([x x+u],[y y+v],'y');
  142.     end
  143. end
  144.     
  145. figure 
  146. imagesc(im2);
  147. colormap gray
  148. hold on
  149. for i=1:size(p2,1)
  150.     plot(p2(i,1),p2(i,2),'g+');
  151.    
  152. end