block_match.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: block_match.h,v 1.2 2005/01/30 05:11:42 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Thomas Davies (Original Author)
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #ifndef _BLOCK_MATCH_H_
  38. #define _BLOCK_MATCH_H_
  39. #include <libdirac_motionest/me_utils.h>
  40. #include <vector>
  41. //handles the business of finding the best block match
  42. namespace dirac
  43. {
  44.     typedef std::vector< std::vector< MVector > > CandidateList;
  45.     //! Add a new motion vector list of neighbours of a vector to the set of lists
  46.     /*
  47.         Add a new motion vector list to the set of lists consisting of the 
  48.         square neighbourhood [mv.x-xr,mv.x+xr] by 
  49.         [mv.y-yr,mv.y+yr]. Vectors that already occur in previous lists are 
  50.         not added.
  51.     */
  52.     void AddNewVlist( CandidateList& vect_list , const MVector& mv , const int xr , const int yr );
  53.     //! Add a new motion vector list to the set of lists for sub-pixel matching
  54.     /*
  55.         Add a new motion vector list to the set of lists consisting of the 
  56.         vectors of the form (mv.x+m*step,mv.y+n*step) where m lies between 
  57.         -xr and xr and n lies between -yr and yr.  Vectors that already occur 
  58.         in previous lists are not added. 
  59.     */
  60.     void AddNewVlist( CandidateList& vect_list , const MVector& mv , const int xr , const int yr , const int step );
  61.     //! Add a new motion vector list of diagnonal neighbours of a vector to the set of lists 
  62.     /*
  63.         Add a new motion vector list to the set of lists consisting of the
  64.         diagonal neighbourhood of height 2yr+1 pixels and width 2xr+1 centred
  65.         on param mv.
  66.         Vectors that already occur in previous lists are not added.
  67.     */
  68.     void AddNewVlistD( CandidateList& vect_list , const MVector& mv , const int xr, const int yr);
  69.     //! Add a motion vector to the set of motion vector lists
  70.     /*!
  71.         Add a motion vector to the set of motion vector lists, making sure
  72.         it's not a duplicate.
  73.     */
  74.     void AddVect( CandidateList& vect_list , const MVector& mv , const int list_num);
  75.     //!    Get the (absolute) variation between two motion vectors
  76.     /*!
  77.         Return the variation between two motion vectors, computed as the sum
  78.         of absolute differences of their components.
  79.     */
  80.     ValueType GetVar(const MVector& mv1,const MVector& mv2);
  81.     //!    Get the (absolute) variation between a motion vector and a list of motion vectors
  82.     /*!
  83.         Return the variation between a motion vector and a list of motion
  84.         vectos, computed as the sum of absolute differences between the
  85.         components of the vector and the median vector produced by the list of
  86.         vectors
  87.     */
  88.     ValueType GetVar(const std::vector<MVector>& pred_list,const MVector& mv);
  89.     //! Class to do block matching
  90.     // Subsumes FindBestMatch and FindBestMatchSubpel
  91.     class BlockMatcher
  92.     {
  93.     public:
  94.         //! Constructor
  95.         /*!
  96.         Constructor
  97.             param ref_data the reference picture component
  98.             param pic_data    the picture being matched
  99.             param bparams    the (overlapped) block parameters to be used for the matching
  100.             param mv_array   the array of vectors we're going to write into
  101.             param cost_array the array of costs we're going to write into
  102.         */
  103.         BlockMatcher( const PicArray& ref_data , 
  104.                       const PicArray& pic_data , 
  105.                       const OLBParams& bparams ,
  106.                       const MvArray& mv_array ,
  107.                       const TwoDArray< MvCostData >& cost_array);
  108.         //! Find the best matching vector from a list of candidates
  109.         /*!
  110.                Find the best matching vector from a list of candidates.
  111.                param  xpos  the horizontal location of the block being matched
  112.                param  ypos  the vertical location of the block being matched
  113.                param  cand_list  the list of candidate vectors
  114.                param  mv_prediction  the prediction for the motion vector
  115.                param  lambda  the Lagrangian parameter    
  116.         */
  117.         void FindBestMatch(int xpos , int ypos,
  118.                            const CandidateList& cand_list,
  119.                            const MVector& mv_prediction,
  120.                            float lambda);
  121.         //! Find the best matching vector from a list of candidates, to sub-pixel accuracy (TBC: merge with FindBestMatch)
  122.         /*!
  123.                Find the best matching vector from a list of candidates.
  124.                param  xpos  the horizontal location of the block being matched
  125.                param  ypos  the vertical location of the block being matched
  126.                param  cand_list  the list of candidate vectors
  127.                param  mv_prediction  the prediction for the motion vector
  128.                param  lambda  the Lagrangian parameter    
  129.         */
  130.         void FindBestMatchSubp(int xpos, int ypos,
  131.                                 const CandidateList& cand_list,
  132.                                 const MVector& mv_prediction,
  133.                                 float lambda);
  134.     private:
  135.         // Local copies of the picture and reference
  136.         const PicArray& m_pic_data;
  137.         const PicArray& m_ref_data;
  138.         
  139.         // Local copy of the motion vector array being populated
  140.         const MvArray& m_mv_array;
  141.         
  142.         // Local copy of the costs being determined through the matching
  143.         const TwoDArray< MvCostData >& m_cost_array; 
  144.         // Block difference elements. Will choose between them depending 
  145.         // on whether we're at the edge of the picture
  146.         SimpleBlockDiff m_simplediff;
  147.         BChkBlockDiff m_checkdiff;
  148.         SimpleBlockDiffUp m_simplediffup;
  149.         BChkBlockDiffUp m_checkdiffup;
  150.         // The block parameters we're using
  151.         OLBParams m_bparams;
  152.     };
  153. } // namespace dirac
  154. #endif