motionEstARPS.m
上传用户:cxsjwj
上传日期:2022-08-09
资源大小:34k
文件大小:6k
源码类别:

matlab例程

开发平台:

Matlab

  1. % Computes motion vectors using Adaptive Rood Pattern Search method
  2. %
  3. % Based on the paper by Yao Nie, and Kai-Kuang Ma
  4. % IEEE Trans. on Image Processing
  5. % Volume 11 Number 12, December 2002 :  Pages 1442:1448
  6. %
  7. % Input
  8. %   imgP : The image for which we want to find motion vectors
  9. %   imgI : The reference image
  10. %   mbSize : Size of the macroblock
  11. %   p : Search parameter  (read literature to find what this means)
  12. %
  13. % Ouput
  14. %   motionVect : the motion vectors for each integral macroblock in imgP
  15. %   ARPScomputations: The average number of points searched for a macroblock
  16. %
  17. % Written by Aroh Barjatya
  18. function motionVect = BmotionEstARPS(imgP, imgI, mbSize, p)
  19. [row col] = size(imgI);
  20. vectors = zeros(2,row*col/mbSize^2);
  21. costs = ones(1, 6) * 65537;
  22. % The index points for Small Diamond search pattern
  23. SDSP(1,:) = [ 0 -1];
  24. SDSP(2,:) = [-1  0];
  25. SDSP(3,:) = [ 0  0];
  26. SDSP(4,:) = [ 1  0];
  27. SDSP(5,:) = [ 0  1];
  28. % We will be storing the positions of points where the checking has been
  29. % already done in a matrix that is initialised to zero. As one point is
  30. % checked, we set the corresponding element in the matrix to one. 
  31. checkMatrix = zeros(2*p+1,2*p+1);
  32. % computations = 0;
  33. % we start off from the top left of the image
  34. % we will walk in steps of mbSize
  35. % mbCount will keep track of how many blocks we have evaluated
  36. mbCount = 1;
  37. for i = 1 : mbSize : row-mbSize+1
  38.     for j = 1 : mbSize : col-mbSize+1
  39.         
  40.         % the Adapive Rood Pattern search starts
  41.         % we are scanning in raster order
  42.         
  43.         x = j;
  44.         y = i;
  45.         
  46.         costs(3) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  47.                                     imgI(i:i+mbSize-1,j:j+mbSize-1),mbSize);
  48.         
  49.         checkMatrix(p+1,p+1) = 1;
  50. %         computations =  computations + 1; 
  51.         % if we are in the left most column then we have to make sure that
  52.         % we just do the LDSP with stepSize = 2
  53.         if (j-1 < 1)
  54.             stepSize = 2;
  55.             maxIndex = 5;
  56.         else 
  57.             stepSize = max(abs(vectors(1,mbCount-1)), abs(vectors(2,mbCount-1)));
  58.             % now we have to make sure that if the point due to motion
  59.             % vector is one of the LDSP points then we dont calculate it
  60.             % again
  61.             if ( (abs(vectors(1,mbCount-1)) == stepSize & vectors(2,mbCount-1) == 0) ...
  62.                  | (abs(vectors(2,mbCount-1)) == stepSize & vectors(1,mbCount-1) == 0)) ...
  63.                  
  64.                 maxIndex = 5; % we just have to check at the rood pattern 5 points
  65.                 
  66.             else
  67.                 maxIndex = 6; % we have to check 6 points
  68.                 LDSP(6,:) = [ vectors(2, mbCount-1)  vectors(1, mbCount-1)];
  69.             end
  70.         end
  71.         
  72.         % The index points for first and only Large Diamond search pattern
  73.         
  74.         LDSP(1,:) = [ 0 -stepSize];
  75.         LDSP(2,:) = [-stepSize 0]; 
  76.         LDSP(3,:) = [ 0  0];
  77.         LDSP(4,:) = [stepSize  0];
  78.         LDSP(5,:) = [ 0  stepSize];
  79.         
  80.         
  81.         % do the LDSP
  82.         
  83.         
  84.         for k = 1:maxIndex
  85.             refBlkVer = y + LDSP(k,2);   % row/Vert co-ordinate for ref block
  86.             refBlkHor = x + LDSP(k,1);   % col/Horizontal co-ordinate
  87.             if ( refBlkVer < 1 | refBlkVer+mbSize-1 > row ...
  88.                  | refBlkHor < 1 | refBlkHor+mbSize-1 > col)
  89.              
  90.                 continue; % outside image boundary
  91.             end
  92.             if (k == 3 | stepSize == 0)
  93.                 continue; % center point already calculated
  94.             end
  95.             costs(k) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  96.                   imgI(refBlkVer:refBlkVer+mbSize-1, refBlkHor:refBlkHor+mbSize-1), mbSize);
  97. %             computations =  computations + 1;
  98.             checkMatrix(LDSP(k,2) + p+1, LDSP(k,1) + p+1) = 1;
  99.             
  100.         end
  101.         
  102.         [cost, point] = min(costs);
  103.         
  104.         
  105.         % The doneFlag is set to 1 when the minimum
  106.         % is at the center of the diamond           
  107.         x = x + LDSP(point, 1);
  108.         y = y + LDSP(point, 2);
  109.         costs = ones(1,5) * 65537;
  110.         costs(3) = cost;
  111.        
  112.         doneFlag = 0;   
  113.         while (doneFlag == 0)
  114.             for k = 1:5
  115.                 refBlkVer = y + SDSP(k,2);   % row/Vert co-ordinate for ref block
  116.                 refBlkHor = x + SDSP(k,1);   % col/Horizontal co-ordinate
  117.                 if ( refBlkVer < 1 | refBlkVer+mbSize-1 > row ...
  118.                       | refBlkHor < 1 | refBlkHor+mbSize-1 > col)
  119.                       continue;
  120.                 end
  121.                 if (k == 3)
  122.                     continue
  123.                 elseif (refBlkHor < j-p | refBlkHor > j+p | refBlkVer < i-p ...
  124.                             | refBlkVer > i+p)
  125.                         continue;
  126.                 elseif (checkMatrix(y-i+SDSP(k,2)+p+1 , x-j+SDSP(k,1)+p+1) == 1)
  127.                     continue
  128.                 end
  129.             
  130.                 costs(k) = costFuncMAD(imgP(i:i+mbSize-1,j:j+mbSize-1), ...
  131.                              imgI(refBlkVer:refBlkVer+mbSize-1, ...
  132.                                  refBlkHor:refBlkHor+mbSize-1), mbSize);
  133.                 checkMatrix(y-i+SDSP(k,2)+p+1, x-j+SDSP(k,1)+p+1) = 1;
  134. %                 computations =  computations + 1;
  135.                 
  136.   
  137.             end
  138.             
  139.             [cost, point] = min(costs);
  140.            
  141.             if (point == 3)
  142.                 doneFlag = 1;
  143.             else
  144.                 x = x + SDSP(point, 1);
  145.                 y = y + SDSP(point, 2);
  146.                 costs = ones(1,5) * 65537;
  147.                 costs(3) = cost;
  148.             end
  149.             
  150.         end  % while loop ends here
  151.         
  152.         vectors(1,mbCount) = y - i;    % row co-ordinate for the vector
  153.         vectors(2,mbCount) = x - j;    % col co-ordinate for the vector            
  154.         mbCount = mbCount + 1;
  155.         costs = ones(1,6) * 65537;
  156.         
  157.         checkMatrix = zeros(2*p+1,2*p+1);
  158.     end
  159. end
  160.     
  161. motionVect = vectors;
  162.     
  163.