• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                        Intel License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000, Intel Corporation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 //   * Redistribution's of source code must retain the above copyright notice,
20 //     this list of conditions and the following disclaimer.
21 //
22 //   * Redistribution's in binary form must reproduce the above copyright notice,
23 //     this list of conditions and the following disclaimer in the documentation
24 //     and/or other materials provided with the distribution.
25 //
26 //   * The name of Intel Corporation may not be used to endorse or promote products
27 //     derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the Intel Corporation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41 #include "precomp.hpp"
42 
43 
matchShapes(InputArray contour1,InputArray contour2,int method,double)44 double cv::matchShapes(InputArray contour1, InputArray contour2, int method, double)
45 {
46     double ma[7], mb[7];
47     int i, sma, smb;
48     double eps = 1.e-5;
49     double mmm;
50     double result = 0;
51 
52     HuMoments( moments(contour1), ma );
53     HuMoments( moments(contour2), mb );
54 
55     switch (method)
56     {
57     case 1:
58         for( i = 0; i < 7; i++ )
59         {
60             double ama = fabs( ma[i] );
61             double amb = fabs( mb[i] );
62 
63             if( ma[i] > 0 )
64                 sma = 1;
65             else if( ma[i] < 0 )
66                 sma = -1;
67             else
68                 sma = 0;
69             if( mb[i] > 0 )
70                 smb = 1;
71             else if( mb[i] < 0 )
72                 smb = -1;
73             else
74                 smb = 0;
75 
76             if( ama > eps && amb > eps )
77             {
78                 ama = 1. / (sma * log10( ama ));
79                 amb = 1. / (smb * log10( amb ));
80                 result += fabs( -ama + amb );
81             }
82         }
83         break;
84 
85     case 2:
86         for( i = 0; i < 7; i++ )
87         {
88             double ama = fabs( ma[i] );
89             double amb = fabs( mb[i] );
90 
91             if( ma[i] > 0 )
92                 sma = 1;
93             else if( ma[i] < 0 )
94                 sma = -1;
95             else
96                 sma = 0;
97             if( mb[i] > 0 )
98                 smb = 1;
99             else if( mb[i] < 0 )
100                 smb = -1;
101             else
102                 smb = 0;
103 
104             if( ama > eps && amb > eps )
105             {
106                 ama = sma * log10( ama );
107                 amb = smb * log10( amb );
108                 result += fabs( -ama + amb );
109             }
110         }
111         break;
112 
113     case 3:
114         for( i = 0; i < 7; i++ )
115         {
116             double ama = fabs( ma[i] );
117             double amb = fabs( mb[i] );
118 
119             if( ma[i] > 0 )
120                 sma = 1;
121             else if( ma[i] < 0 )
122                 sma = -1;
123             else
124                 sma = 0;
125             if( mb[i] > 0 )
126                 smb = 1;
127             else if( mb[i] < 0 )
128                 smb = -1;
129             else
130                 smb = 0;
131 
132             if( ama > eps && amb > eps )
133             {
134                 ama = sma * log10( ama );
135                 amb = smb * log10( amb );
136                 mmm = fabs( (ama - amb) / ama );
137                 if( result < mmm )
138                     result = mmm;
139             }
140         }
141         break;
142     default:
143         CV_Error( CV_StsBadArg, "Unknown comparison method" );
144     }
145 
146     return result;
147 }
148 
149 
150 CV_IMPL  double
cvMatchShapes(const void * _contour1,const void * _contour2,int method,double parameter)151 cvMatchShapes( const void* _contour1, const void* _contour2,
152                int method, double parameter )
153 {
154     cv::AutoBuffer<double> abuf1, abuf2;
155     cv::Mat contour1 = cv::cvarrToMat(_contour1, false, false, 0, &abuf1);
156     cv::Mat contour2 = cv::cvarrToMat(_contour2, false, false, 0, &abuf2);
157 
158     return cv::matchShapes(contour1, contour2, method, parameter);
159 }
160 
161 /* End of file. */
162