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