void CV_MinMaxHistTest::init_hist(int test_case_idx, int hist_i) { int i, eq = 1; CvRNG* rng = ts->get_rng(); CV_BaseHistTest::init_hist( test_case_idx, hist_i ); for(;;) { for( i = 0; i < cdims; i++ ) { min_idx0[i] = cvTsRandInt(rng) % dims[i]; max_idx0[i] = cvTsRandInt(rng) % dims[i]; eq &= min_idx0[i] == max_idx0[i]; } if( !eq || total_size == 1 ) break; } min_val0 = (float)(-cvTsRandReal(rng)*10 - FLT_EPSILON); max_val0 = (float)(cvTsRandReal(rng)*10 + FLT_EPSILON + gen_hist_max_val); if( total_size == 1 ) min_val0 = max_val0; cvSetRealND( hist[0]->bins, min_idx0, min_val0 ); cvSetRealND( hist[0]->bins, max_idx0, max_val0 ); }
void CV_BaseHistTest::init_hist( int /*test_case_idx*/, int hist_i ) { if( gen_random_hist ) { CvRNG* rng = ts->get_rng(); CvArr* h = hist[hist_i]->bins; if( hist_type == CV_HIST_ARRAY ) { cvRandArr( rng, h, CV_RAND_UNI, cvScalarAll(0), cvScalarAll(gen_hist_max_val) ); } else { int i, j, total_size = 1, nz_count; int idx[CV_MAX_DIM]; for( i = 0; i < cdims; i++ ) total_size *= dims[i]; nz_count = cvTsRandInt(rng) % MAX( total_size/4, 100 ); nz_count = MIN( nz_count, total_size ); // a zero number of non-zero elements should be allowed for( i = 0; i < nz_count; i++ ) { for( j = 0; j < cdims; j++ ) idx[j] = cvTsRandInt(rng) % dims[j]; cvSetRealND( h, idx, cvTsRandReal(rng)*gen_hist_max_val ); } } } }
void cveSetRealND(CvArr* arr, int* idx, double value) { cvSetRealND(arr, idx, value); }
void CV_QueryHistTest::run_func(void) { int i, iters = values->cols; CvArr* h = hist[0]->bins; const int* idx = indices->data.i; float* val = values->data.fl; float default_value = 0.f; // stage 1: write bins if( cdims == 1 ) for( i = 0; i < iters; i++ ) { float v0 = values0->data.fl[i]; if( fabs(v0 - default_value) < FLT_EPSILON ) continue; if( !(i % 2) ) { if( !(i % 4) ) cvSetReal1D( h, idx[i], v0 ); else *(float*)cvPtr1D( h, idx[i] ) = v0; } else cvSetRealND( h, idx+i, v0 ); } else if( cdims == 2 ) for( i = 0; i < iters; i++ ) { float v0 = values0->data.fl[i]; if( fabs(v0 - default_value) < FLT_EPSILON ) continue; if( !(i % 2) ) { if( !(i % 4) ) cvSetReal2D( h, idx[i*2], idx[i*2+1], v0 ); else *(float*)cvPtr2D( h, idx[i*2], idx[i*2+1] ) = v0; } else cvSetRealND( h, idx+i*2, v0 ); } else if( cdims == 3 ) for( i = 0; i < iters; i++ ) { float v0 = values0->data.fl[i]; if( fabs(v0 - default_value) < FLT_EPSILON ) continue; if( !(i % 2) ) { if( !(i % 4) ) cvSetReal3D( h, idx[i*3], idx[i*3+1], idx[i*3+2], v0 ); else *(float*)cvPtr3D( h, idx[i*3], idx[i*3+1], idx[i*3+2] ) = v0; } else cvSetRealND( h, idx+i*3, v0 ); } else for( i = 0; i < iters; i++ ) { float v0 = values0->data.fl[i]; if( fabs(v0 - default_value) < FLT_EPSILON ) continue; if( !(i % 2) ) cvSetRealND( h, idx+i*cdims, v0 ); else *(float*)cvPtrND( h, idx+i*cdims ) = v0; } // stage 2: read bins if( cdims == 1 ) for( i = 0; i < iters; i++ ) { if( !(i % 2) ) val[i] = *(float*)cvPtr1D( h, idx[i] ); else val[i] = (float)cvGetReal1D( h, idx[i] ); } else if( cdims == 2 ) for( i = 0; i < iters; i++ ) { if( !(i % 2) ) val[i] = *(float*)cvPtr2D( h, idx[i*2], idx[i*2+1] ); else val[i] = (float)cvGetReal2D( h, idx[i*2], idx[i*2+1] ); } else if( cdims == 3 ) for( i = 0; i < iters; i++ ) { if( !(i % 2) ) val[i] = *(float*)cvPtr3D( h, idx[i*3], idx[i*3+1], idx[i*3+2] ); else val[i] = (float)cvGetReal3D( h, idx[i*3], idx[i*3+1], idx[i*3+2] ); } else for( i = 0; i < iters; i++ ) { if( !(i % 2) ) val[i] = *(float*)cvPtrND( h, idx+i*cdims ); else val[i] = (float)cvGetRealND( h, idx+i*cdims ); } }