static int hu_moments_test( void ) { const double success_error_level = 1e-7; CvSize size = { 512, 512 }; int i; IplImage* img = atsCreateImage( size.width, size.height, 8, 1, 0 ); CvMoments moments; CvHuMoments a, b; AtsRandState rng_state; int seed = atsGetSeed(); double nu20, nu02, nu11, nu30, nu21, nu12, nu03; double err = 0; char buffer[100]; atsRandInit( &rng_state, 0, 255, seed ); atsbRand8u( &rng_state, (uchar*)(img->imageData), size.width * size.height ); cvMoments( img, &moments, 0 ); atsReleaseImage( img ); nu20 = cvGetNormalizedCentralMoment( &moments, 2, 0 ); nu11 = cvGetNormalizedCentralMoment( &moments, 1, 1 ); nu02 = cvGetNormalizedCentralMoment( &moments, 0, 2 ); nu30 = cvGetNormalizedCentralMoment( &moments, 3, 0 ); nu21 = cvGetNormalizedCentralMoment( &moments, 2, 1 ); nu12 = cvGetNormalizedCentralMoment( &moments, 1, 2 ); nu03 = cvGetNormalizedCentralMoment( &moments, 0, 3 ); cvGetHuMoments( &moments, &a ); b.hu1 = nu20 + nu02; b.hu2 = sqr(nu20 - nu02) + 4*sqr(nu11); b.hu3 = sqr(nu30 - 3*nu12) + sqr(3*nu21 - nu03); b.hu4 = sqr(nu30 + nu12) + sqr(nu21 + nu03); b.hu5 = (nu30 - 3*nu12)*(nu30 + nu12)*(sqr(nu30 + nu12) - 3*sqr(nu21 + nu03)) + (3*nu21 - nu03)*(nu21 + nu03)*(3*sqr(nu30 + nu12) - sqr(nu21 + nu03)); b.hu6 = (nu20 - nu02)*(sqr(nu30 + nu12) - sqr(nu21 + nu03)) + 4*nu11*(nu30 + nu12)*(nu21 + nu03); b.hu7 = (3*nu21 - nu03)*(nu30 + nu12)*(sqr(nu30 + nu12) - 3*sqr(nu21 + nu03)) + (3*nu12 - nu30)*(nu21 + nu03)*(3*sqr(nu30 + nu12) - sqr(nu21 + nu03)); for( i = 0; i < 7; i++ ) { double t = rel_err( ((double*)&b)[i], ((double*)&a)[i] ); if( t > err ) err = t; } sprintf( buffer, "Accuracy: %.4e", err ); return trsResult( err > success_error_level ? TRS_FAIL : TRS_OK, buffer ); }
/* * call-seq: * normalized_central -> float * * Retrieves normalized central moment. * * ηx_order,y_order= μx_order,y_order/M00((y_order+x_order)/2+1) */ VALUE rb_normalized_central(VALUE self, VALUE x_order, VALUE y_order) { return rb_float_new(cvGetNormalizedCentralMoment(CVMOMENTS(self), NUM2INT(x_order), NUM2INT(y_order))); }
double cveGetNormalizedCentralMoment(CvMoments* moments, int xOrder, int yOrder) { return cvGetNormalizedCentralMoment(moments, xOrder, yOrder); }