cv::matchShapes的ShapeMatchMode分别对应什么算法
本质上都是Hu矩,查看文档, opencv 4.x

3.x其实也是一样

以下代码基于 opencv 3.1.0
opencv2\imgproc\types_c.h
enum ShapeMatchModes
{CV_CONTOURS_MATCH_I1 =1, CV_CONTOURS_MATCH_I2 =2, CV_CONTOURS_MATCH_I3 =3
};
source\modules\imgproc\src\matchcontours.cpp
double cv::matchShapes(InputArray contour1, InputArray contour2, int method, double)
{double ma[7], mb[7];int i, sma, smb;double eps = 1.e-5;double mmm;double result = 0;HuMoments( moments(contour1), ma ); //计算Hu矩HuMoments( moments(contour2), mb ); //计算Hu矩switch (method){case 1:for( i = 0; i < 7; i++ ){double ama = fabs( ma[i] );double amb = fabs( mb[i] );if( ma[i] > 0 )sma = 1;else if( ma[i] < 0 )sma = -1;elsesma = 0;if( mb[i] > 0 )smb = 1;else if( mb[i] < 0 )smb = -1;elsesmb = 0;if( ama > eps && amb > eps ){ama = 1. / (sma * log10( ama ));amb = 1. / (smb * log10( amb ));result += fabs( -ama + amb );}}break;case 2:for( i = 0; i < 7; i++ ){double ama = fabs( ma[i] );double amb = fabs( mb[i] );if( ma[i] > 0 )sma = 1;else if( ma[i] < 0 )sma = -1;elsesma = 0;if( mb[i] > 0 )smb = 1;else if( mb[i] < 0 )smb = -1;elsesmb = 0;if( ama > eps && amb > eps ){ama = sma * log10( ama );amb = smb * log10( amb );result += fabs( -ama + amb );}}break;case 3:for( i = 0; i < 7; i++ ){double ama = fabs( ma[i] );double amb = fabs( mb[i] );if( ma[i] > 0 )sma = 1;else if( ma[i] < 0 )sma = -1;elsesma = 0;if( mb[i] > 0 )smb = 1;else if( mb[i] < 0 )smb = -1;elsesmb = 0;if( ama > eps && amb > eps ){ama = sma * log10( ama );amb = smb * log10( amb );mmm = fabs( (ama - amb) / ama );if( result < mmm )result = mmm;}}break;default:CV_Error( CV_StsBadArg, "Unknown comparison method" );}return result;
}
