int CV_ThreshHistTest::prepare_test_case( int test_case_idx ) { int code = CV_BaseHistTest::prepare_test_case( test_case_idx ); if( code > 0 ) { CvRNG* rng = ts->get_rng(); threshold = cvTsRandReal(rng)*gen_hist_max_val; if( hist_type == CV_HIST_ARRAY ) { orig_nz_count = total_size; values = cvCreateMat( 1, total_size, CV_32F ); memcpy( values->data.fl, cvPtr1D( hist[0]->bins, 0 ), total_size*sizeof(float) ); } else { CvSparseMat* sparse = (CvSparseMat*)hist[0]->bins; CvSparseMatIterator iterator; CvSparseNode* node; int i, k; orig_nz_count = sparse->heap->active_count; values = cvCreateMat( 1, orig_nz_count+1, CV_32F ); indices = cvCreateMat( 1, (orig_nz_count+1)*cdims, CV_32S ); for( node = cvInitSparseMatIterator( sparse, &iterator ), i = 0; node != 0; node = cvGetNextSparseNode( &iterator ), i++ ) { const int* idx = CV_NODE_IDX(sparse,node); OPENCV_ASSERT( i < orig_nz_count, "CV_ThreshHistTest::prepare_test_case", "Buffer overflow" ); values->data.fl[i] = *(float*)CV_NODE_VAL(sparse,node); for( k = 0; k < cdims; k++ ) indices->data.i[i*cdims + k] = idx[k]; } OPENCV_ASSERT( i == orig_nz_count, "Unmatched buffer size", "CV_ThreshHistTest::prepare_test_case" ); } } return code; }
int CV_NormHistTest::validate_test_results( int /*test_case_idx*/ ) { int code = CvTS::OK; double sum = 0; if( hist_type == CV_HIST_ARRAY ) { int i; const float* ptr = (float*)cvPtr1D( hist[0]->bins, 0 ); for( i = 0; i < total_size; i++ ) sum += ptr[i]; } else { CvSparseMat* sparse = (CvSparseMat*)hist[0]->bins; CvSparseMatIterator iterator; CvSparseNode *node; for( node = cvInitSparseMatIterator( sparse, &iterator ); node != 0; node = cvGetNextSparseNode( &iterator )) { sum += *(float*)CV_NODE_VAL(sparse,node); } } if( cvIsNaN(sum) || cvIsInf(sum) ) { ts->printf( CvTS::LOG, "The normalized histogram has invalid sum =%g\n", sum ); code = CvTS::FAIL_INVALID_OUTPUT; } else if( fabs(sum - factor) > FLT_EPSILON*10*fabs(factor) ) { ts->printf( CvTS::LOG, "The normalized histogram has incorrect sum =%g, while it should be =%g\n", sum, factor ); code = CvTS::FAIL_BAD_ACCURACY; } if( code < 0 ) ts->set_failed_test_info( code ); return code; }
void *CvNodeVal_wrap(CvSparseNode *node, CvSparseMat *mat) { return CV_NODE_VAL(mat, node); }
int CV_CompareHistTest::validate_test_results( int /*test_case_idx*/ ) { int code = CvTS::OK; int i; double result0[MAX_METHOD+1]; double s0 = 0, s1 = 0, sq0 = 0, sq1 = 0, t; for( i = 0; i < MAX_METHOD; i++ ) result0[i] = 0; if( hist_type == CV_HIST_ARRAY ) { float* ptr0 = (float*)cvPtr1D( hist[0]->bins, 0 ); float* ptr1 = (float*)cvPtr1D( hist[1]->bins, 0 ); for( i = 0; i < total_size; i++ ) { double v0 = ptr0[i], v1 = ptr1[i]; result0[CV_COMP_CORREL] += v0*v1; result0[CV_COMP_INTERSECT] += MIN(v0,v1); if( fabs(v0 + v1) > DBL_EPSILON ) result0[CV_COMP_CHISQR] += (v0 - v1)*(v0 - v1)/(v0 + v1); s0 += v0; s1 += v1; sq0 += v0*v0; sq1 += v1*v1; result0[CV_COMP_BHATTACHARYYA] += sqrt(v0*v1); } } else { CvSparseMat* sparse0 = (CvSparseMat*)hist[0]->bins; CvSparseMat* sparse1 = (CvSparseMat*)hist[1]->bins; CvSparseMatIterator iterator; CvSparseNode* node; for( node = cvInitSparseMatIterator( sparse0, &iterator ); node != 0; node = cvGetNextSparseNode( &iterator ) ) { const int* idx = CV_NODE_IDX(sparse0, node); double v0 = *(float*)CV_NODE_VAL(sparse0, node); double v1 = (float)cvGetRealND(sparse1, idx); result0[CV_COMP_CORREL] += v0*v1; result0[CV_COMP_INTERSECT] += MIN(v0,v1); if( fabs(v0 + v1) > DBL_EPSILON ) result0[CV_COMP_CHISQR] += (v0 - v1)*(v0 - v1)/(v0 + v1); s0 += v0; sq0 += v0*v0; result0[CV_COMP_BHATTACHARYYA] += sqrt(v0*v1); } for( node = cvInitSparseMatIterator( sparse1, &iterator ); node != 0; node = cvGetNextSparseNode( &iterator ) ) { const int* idx = CV_NODE_IDX(sparse1, node); double v1 = *(float*)CV_NODE_VAL(sparse1, node); double v0 = (float)cvGetRealND(sparse0, idx); if( fabs(v0) < DBL_EPSILON ) result0[CV_COMP_CHISQR] += v1; s1 += v1; sq1 += v1*v1; } } t = (sq0 - s0*s0/total_size)*(sq1 - s1*s1/total_size); result0[CV_COMP_CORREL] = fabs(t) > DBL_EPSILON ? (result0[CV_COMP_CORREL] - s0*s1/total_size)/sqrt(t) : 1; s1 *= s0; s0 = result0[CV_COMP_BHATTACHARYYA]; s0 = 1. - s0*(s1 > FLT_EPSILON ? 1./sqrt(s1) : 1.); result0[CV_COMP_BHATTACHARYYA] = sqrt(MAX(s0,0.)); for( i = 0; i < MAX_METHOD; i++ ) { double v = result[i], v0 = result0[i]; const char* method_name = i == CV_COMP_CHISQR ? "Chi-Square" : i == CV_COMP_CORREL ? "Correlation" : i == CV_COMP_INTERSECT ? "Intersection" : i == CV_COMP_BHATTACHARYYA ? "Bhattacharyya" : "Unknown"; if( cvIsNaN(v) || cvIsInf(v) ) { ts->printf( CvTS::LOG, "The comparison result using the method #%d (%s) is invalid (=%g)\n", i, method_name, v ); code = CvTS::FAIL_INVALID_OUTPUT; break; } else if( fabs(v0 - v) > FLT_EPSILON*10*MAX(fabs(v0),0.1) ) { ts->printf( CvTS::LOG, "The comparison result using the method #%d (%s)\n\tis inaccurate (=%g, should be =%g)\n", i, method_name, v, v0 ); code = CvTS::FAIL_BAD_ACCURACY; break; } } if( code < 0 ) ts->set_failed_test_info( code ); return code; }