Commit 1055f9d2 authored by Rostislav Vasilikhin's avatar Rostislav Vasilikhin Committed by Alexander Alekhin

Merge pull request #10757 from savuor:test_hist_renew

* old types removed

* QueryHist tests: new types

* ThreshHist tests: new types

* CalcHist tests: new types

* CalcBackProject tests: new types

* CalcBackProjectPatch tests: new types

* const ref added
parent 403c3c3d
......@@ -78,7 +78,7 @@ protected:
int img_type;
int img_max_log_size;
double low, high, range_delta;
CvSize img_size;
Size img_size;
vector<CvHistogram*> hist;
vector<float> _ranges;
......@@ -324,19 +324,15 @@ protected:
int validate_test_results( int test_case_idx );
void init_hist( int test_case_idx, int i );
CvMat* indices;
CvMat* values;
CvMat* values0;
Mat indices;
Mat values;
Mat values0;
};
CV_QueryHistTest::CV_QueryHistTest()
{
hist_count = 1;
indices = 0;
values = 0;
values0 = 0;
}
......@@ -348,9 +344,6 @@ CV_QueryHistTest::~CV_QueryHistTest()
void CV_QueryHistTest::clear()
{
cvReleaseMat( &indices );
cvReleaseMat( &values );
cvReleaseMat( &values0 );
CV_BaseHistTest::clear();
}
......@@ -371,24 +364,22 @@ int CV_QueryHistTest::prepare_test_case( int test_case_idx )
int i, j, iters;
float default_value = 0.f;
RNG& rng = ts->get_rng();
CvMat* bit_mask = 0;
int* idx;
iters = (cvtest::randInt(rng) % MAX(total_size/10,100)) + 1;
iters = MIN( iters, total_size*9/10 + 1 );
indices = cvCreateMat( 1, iters*cdims, CV_32S );
values = cvCreateMat( 1, iters, CV_32F );
values0 = cvCreateMat( 1, iters, CV_32F );
idx = indices->data.i;
indices = Mat(1, iters*cdims, CV_32S);
values = Mat(1, iters, CV_32F );
values0 = Mat( 1, iters, CV_32F );
idx = indices.ptr<int>();
//printf( "total_size = %d, cdims = %d, iters = %d\n", total_size, cdims, iters );
bit_mask = cvCreateMat( 1, (total_size + 7)/8, CV_8U );
cvZero( bit_mask );
Mat bit_mask(1, (total_size + 7)/8, CV_8U, Scalar(0));
#define GET_BIT(n) (bit_mask->data.ptr[(n)/8] & (1 << ((n)&7)))
#define SET_BIT(n) bit_mask->data.ptr[(n)/8] |= (1 << ((n)&7))
#define GET_BIT(n) (bit_mask.data[(n)/8] & (1 << ((n)&7)))
#define SET_BIT(n) bit_mask.data[(n)/8] |= (1 << ((n)&7))
// set random histogram bins' values to the linear indices of the bins
for( i = 0; i < iters; i++ )
......@@ -403,13 +394,13 @@ int CV_QueryHistTest::prepare_test_case( int test_case_idx )
if( cvtest::randInt(rng) % 8 || GET_BIT(lin_idx) )
{
values0->data.fl[i] = (float)(lin_idx+1);
values0.at<float>(i) = (float)(lin_idx+1);
SET_BIT(lin_idx);
}
else
// some histogram bins will not be initialized intentionally,
// they should be equal to the default value
values0->data.fl[i] = default_value;
values0.at<float>(i) = default_value;
}
// do the second pass to make values0 consistent with bit_mask
......@@ -420,10 +411,8 @@ int CV_QueryHistTest::prepare_test_case( int test_case_idx )
lin_idx = lin_idx*dims[j] + idx[i*cdims + j];
if( GET_BIT(lin_idx) )
values0->data.fl[i] = (float)(lin_idx+1);
values0.at<float>(i) = (float)(lin_idx+1);
}
cvReleaseMat( &bit_mask );
}
return code;
......@@ -432,17 +421,17 @@ int CV_QueryHistTest::prepare_test_case( int test_case_idx )
void CV_QueryHistTest::run_func(void)
{
int i, iters = values->cols;
int i, iters = values.cols;
CvArr* h = hist[0]->bins;
const int* idx = indices->data.i;
float* val = values->data.fl;
const int* idx = indices.ptr<int>();
float* val = values.ptr<float>();
float default_value = 0.f;
// stage 1: write bins
if( cdims == 1 )
for( i = 0; i < iters; i++ )
{
float v0 = values0->data.fl[i];
float v0 = values0.at<float>(i);
if( fabs(v0 - default_value) < FLT_EPSILON )
continue;
if( !(i % 2) )
......@@ -458,7 +447,7 @@ void CV_QueryHistTest::run_func(void)
else if( cdims == 2 )
for( i = 0; i < iters; i++ )
{
float v0 = values0->data.fl[i];
float v0 = values0.at<float>(i);
if( fabs(v0 - default_value) < FLT_EPSILON )
continue;
if( !(i % 2) )
......@@ -474,7 +463,7 @@ void CV_QueryHistTest::run_func(void)
else if( cdims == 3 )
for( i = 0; i < iters; i++ )
{
float v0 = values0->data.fl[i];
float v0 = values0.at<float>(i);
if( fabs(v0 - default_value) < FLT_EPSILON )
continue;
if( !(i % 2) )
......@@ -490,7 +479,7 @@ void CV_QueryHistTest::run_func(void)
else
for( i = 0; i < iters; i++ )
{
float v0 = values0->data.fl[i];
float v0 = values0.at<float>(i);
if( fabs(v0 - default_value) < FLT_EPSILON )
continue;
if( !(i % 2) )
......@@ -538,11 +527,11 @@ void CV_QueryHistTest::run_func(void)
int CV_QueryHistTest::validate_test_results( int /*test_case_idx*/ )
{
int code = cvtest::TS::OK;
int i, j, iters = values->cols;
int i, j, iters = values.cols;
for( i = 0; i < iters; i++ )
{
float v = values->data.fl[i], v0 = values0->data.fl[i];
float v = values.at<float>(i), v0 = values0.at<float>(i);
if( cvIsNaN(v) || cvIsInf(v) )
{
......@@ -559,7 +548,7 @@ int CV_QueryHistTest::validate_test_results( int /*test_case_idx*/ )
{
ts->printf( cvtest::TS::LOG, "The bin index = (" );
for( j = 0; j < cdims; j++ )
ts->printf( cvtest::TS::LOG, "%d%s", indices->data.i[i*cdims + j],
ts->printf( cvtest::TS::LOG, "%d%s", indices.at<int>(i*cdims + j),
j < cdims-1 ? ", " : ")\n" );
break;
}
......@@ -797,8 +786,8 @@ protected:
int prepare_test_case( int test_case_idx );
void run_func(void);
int validate_test_results( int test_case_idx );
CvMat* indices;
CvMat* values;
Mat indices;
Mat values;
int orig_nz_count;
double threshold;
......@@ -806,12 +795,10 @@ protected:
CV_ThreshHistTest::CV_ThreshHistTest()
CV_ThreshHistTest::CV_ThreshHistTest() : threshold(0)
{
hist_count = 1;
gen_random_hist = 1;
threshold = 0;
indices = values = 0;
}
......@@ -823,8 +810,6 @@ CV_ThreshHistTest::~CV_ThreshHistTest()
void CV_ThreshHistTest::clear()
{
cvReleaseMat( &indices );
cvReleaseMat( &values );
CV_BaseHistTest::clear();
}
......@@ -842,8 +827,9 @@ int CV_ThreshHistTest::prepare_test_case( int test_case_idx )
{
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) );
values = Mat( 1, total_size, CV_32F );
indices = Mat();
memcpy( values.ptr<float>(), cvPtr1D( hist[0]->bins, 0 ), total_size*sizeof(float) );
}
else
{
......@@ -854,8 +840,8 @@ int CV_ThreshHistTest::prepare_test_case( int test_case_idx )
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 );
values = Mat( 1, orig_nz_count+1, CV_32F );
indices = Mat( 1, (orig_nz_count+1)*cdims, CV_32S );
for( node = cvInitSparseMatIterator( sparse, &iterator ), i = 0;
node != 0; node = cvGetNextSparseNode( &iterator ), i++ )
......@@ -864,9 +850,9 @@ int CV_ThreshHistTest::prepare_test_case( int test_case_idx )
OPENCV_ASSERT( i < orig_nz_count, "CV_ThreshHistTest::prepare_test_case", "Buffer overflow" );
values->data.fl[i] = *(float*)CV_NODE_VAL(sparse,node);
values.at<float>(i) = *(float*)CV_NODE_VAL(sparse,node);
for( k = 0; k < cdims; k++ )
indices->data.i[i*cdims + k] = idx[k];
indices.at<int>(i*cdims + k) = idx[k];
}
OPENCV_ASSERT( i == orig_nz_count, "Unmatched buffer size",
......@@ -888,7 +874,7 @@ int CV_ThreshHistTest::validate_test_results( int /*test_case_idx*/ )
{
int code = cvtest::TS::OK;
int i;
float* ptr0 = values->data.fl;
float* ptr0 = values.ptr<float>();
float* ptr = 0;
CvSparseMat* sparse = 0;
......@@ -907,8 +893,8 @@ int CV_ThreshHistTest::validate_test_results( int /*test_case_idx*/ )
v = ptr[i];
else
{
v = (float)cvGetRealND( sparse, indices->data.i + i*cdims );
cvClearND( sparse, indices->data.i + i*cdims );
v = (float)cvGetRealND( sparse, indices.ptr<int>() + i*cdims );
cvClearND( sparse, indices.ptr<int>() + i*cdims );
}
if( v0 <= threshold ) v0 = 0.f;
......@@ -1128,25 +1114,17 @@ protected:
int prepare_test_case( int test_case_idx );
void run_func(void);
int validate_test_results( int test_case_idx );
IplImage* images[CV_MAX_DIM+1];
int channels[CV_MAX_DIM+1];
vector<Mat> images;
vector<int> channels;
};
CV_CalcHistTest::CV_CalcHistTest()
CV_CalcHistTest::CV_CalcHistTest() : images(CV_MAX_DIM+1), channels(CV_MAX_DIM+1)
{
int i;
hist_count = 2;
gen_random_hist = 0;
init_ranges = 1;
for( i = 0; i <= CV_MAX_DIM; i++ )
{
images[i] = 0;
channels[i] = 0;
}
}
......@@ -1158,11 +1136,6 @@ CV_CalcHistTest::~CV_CalcHistTest()
void CV_CalcHistTest::clear()
{
int i;
for( i = 0; i <= CV_MAX_DIM; i++ )
cvReleaseImage( &images[i] );
CV_BaseHistTest::clear();
}
......@@ -1181,21 +1154,22 @@ int CV_CalcHistTest::prepare_test_case( int test_case_idx )
if( i < cdims )
{
int nch = 1; //cvtest::randInt(rng) % 3 + 1;
images[i] = cvCreateImage( img_size,
img_type == CV_8U ? IPL_DEPTH_8U : IPL_DEPTH_32F, nch );
images[i] = Mat(img_size, CV_MAKETYPE(img_type, nch));
channels[i] = cvtest::randInt(rng) % nch;
Mat images_i = cvarrToMat(images[i]);
cvtest::randUni( rng, images_i, Scalar::all(low), Scalar::all(high) );
cvtest::randUni( rng, images[i], Scalar::all(low), Scalar::all(high) );
}
else if( i == CV_MAX_DIM && cvtest::randInt(rng) % 2 )
else if( i == CV_MAX_DIM )
{
if( cvtest::randInt(rng) % 2 )
{
// create mask
images[i] = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
Mat images_i = cvarrToMat(images[i]);
images[i] = Mat(img_size, CV_8U);
// make ~25% pixels in the mask non-zero
cvtest::randUni( rng, images_i, Scalar::all(-2), Scalar::all(2) );
cvtest::randUni( rng, images[i], Scalar::all(-2), Scalar::all(2) );
}
else
images[i] = Mat();
}
}
}
......@@ -1206,50 +1180,112 @@ int CV_CalcHistTest::prepare_test_case( int test_case_idx )
void CV_CalcHistTest::run_func(void)
{
cvCalcHist( images, hist[0], 0, images[CV_MAX_DIM] );
int size[CV_MAX_DIM];
int hdims = cvGetDims( hist[0]->bins, size);
bool huniform = CV_IS_UNIFORM_HIST(hist[0]);
const float* uranges[CV_MAX_DIM] = {0};
const float** hranges = 0;
if( hist[0]->type & CV_HIST_RANGES_FLAG )
{
hranges = (const float**)hist[0]->thresh2;
if( huniform )
{
for(int i = 0; i < hdims; i++ )
uranges[i] = &hist[0]->thresh[i][0];
hranges = uranges;
}
}
std::vector<cv::Mat> imagesv(cdims);
copy(images.begin(), images.begin() + cdims, imagesv.begin());
Mat mask = images[CV_MAX_DIM];
if( !CV_IS_SPARSE_HIST(hist[0]) )
{
cv::Mat H = cv::cvarrToMat(hist[0]->bins);
if(huniform)
{
vector<int> emptyChannels;
vector<int> hSize(hdims);
for(int i = 0; i < hdims; i++)
hSize[i] = size[i];
vector<float> vranges;
if(hranges)
{
vranges.resize(hdims*2);
for(int i = 0; i < hdims; i++ )
{
vranges[i*2 ] = hist[0]->thresh[i][0];
vranges[i*2+1] = hist[0]->thresh[i][1];
}
}
cv::calcHist(imagesv, emptyChannels, mask, H, hSize, vranges);
}
else
{
cv::calcHist( &imagesv[0], (int)imagesv.size(), 0, mask,
H, cvGetDims(hist[0]->bins), H.size, hranges, huniform );
}
}
else
{
CvSparseMat* sparsemat = (CvSparseMat*)hist[0]->bins;
cvZero( hist[0]->bins );
cv::SparseMat sH;
sparsemat->copyToSparseMat(sH);
cv::calcHist( &imagesv[0], (int)imagesv.size(), 0, mask, sH, sH.dims(),
sH.dims() > 0 ? sH.hdr->size : 0, hranges, huniform, false);
cv::SparseMatConstIterator it = sH.begin();
int nz = (int)sH.nzcount();
for(int i = 0; i < nz; i++, ++it )
{
CV_Assert(it.ptr != NULL);
*(float*)cvPtrND(sparsemat, it.node()->idx, 0, -2) = *(const float*)it.ptr;
}
}
}
static void
cvTsCalcHist( IplImage** _images, CvHistogram* hist, IplImage* _mask, int* channels )
cvTsCalcHist( const vector<Mat>& images, CvHistogram* hist, Mat mask, const vector<int>& channels )
{
int x, y, k, cdims;
int x, y, k;
union
{
float* fl;
uchar* ptr;
const float* fl;
const uchar* ptr;
}
plane[CV_MAX_DIM];
int nch[CV_MAX_DIM];
int dims[CV_MAX_DIM];
int uniform = CV_IS_UNIFORM_HIST(hist);
CvSize img_size = cvGetSize(_images[0]);
CvMat images[CV_MAX_DIM], mask = cvMat(1,1,CV_8U);
int img_depth = _images[0]->depth;
cdims = cvGetDims( hist->bins, dims );
int cdims = cvGetDims( hist->bins, dims );
cvZero( hist->bins );
Size img_size = images[0].size();
int img_depth = images[0].depth();
for( k = 0; k < cdims; k++ )
{
cvGetMat( _images[k], &images[k] );
nch[k] = _images[k]->nChannels;
nch[k] = images[k].channels();
}
if( _mask )
cvGetMat( _mask, &mask );
for( y = 0; y < img_size.height; y++ )
{
const uchar* mptr = _mask ? &CV_MAT_ELEM(mask, uchar, y, 0 ) : 0;
const uchar* mptr = mask.empty() ? 0 : mask.ptr<uchar>(y);
if( img_depth == IPL_DEPTH_8U )
if( img_depth == CV_8U )
for( k = 0; k < cdims; k++ )
plane[k].ptr = &CV_MAT_ELEM(images[k], uchar, y, 0 ) + channels[k];
plane[k].ptr = images[k].ptr<uchar>(y) + channels[k];
else
for( k = 0; k < cdims; k++ )
plane[k].fl = &CV_MAT_ELEM(images[k], float, y, 0 ) + channels[k];
plane[k].fl = images[k].ptr<float>(y) + channels[k];
for( x = 0; x < img_size.width; x++ )
{
......@@ -1258,7 +1294,7 @@ cvTsCalcHist( IplImage** _images, CvHistogram* hist, IplImage* _mask, int* chann
if( mptr && !mptr[x] )
continue;
if( img_depth == IPL_DEPTH_8U )
if( img_depth == CV_8U )
for( k = 0; k < cdims; k++ )
val[k] = plane[k].ptr[x*nch[k]];
else
......@@ -1339,25 +1375,17 @@ protected:
int prepare_test_case( int test_case_idx );
void run_func(void);
int validate_test_results( int test_case_idx );
IplImage* images[CV_MAX_DIM+3];
int channels[CV_MAX_DIM+3];
vector<Mat> images;
vector<int> channels;
};
CV_CalcBackProjectTest::CV_CalcBackProjectTest()
CV_CalcBackProjectTest::CV_CalcBackProjectTest() : images(CV_MAX_DIM+3), channels(CV_MAX_DIM+3)
{
int i;
hist_count = 1;
gen_random_hist = 0;
init_ranges = 1;
for( i = 0; i < CV_MAX_DIM+3; i++ )
{
images[i] = 0;
channels[i] = 0;
}
}
......@@ -1369,11 +1397,6 @@ CV_CalcBackProjectTest::~CV_CalcBackProjectTest()
void CV_CalcBackProjectTest::clear()
{
int i;
for( i = 0; i < CV_MAX_DIM+3; i++ )
cvReleaseImage( &images[i] );
CV_BaseHistTest::clear();
}
......@@ -1385,31 +1408,35 @@ int CV_CalcBackProjectTest::prepare_test_case( int test_case_idx )
if( code > 0 )
{
RNG& rng = ts->get_rng();
int i, j, n, img_len = img_size.width*img_size.height;
int i, j, n, img_len = img_size.area();
for( i = 0; i < CV_MAX_DIM + 3; i++ )
{
if( i < cdims )
{
int nch = 1; //cvtest::randInt(rng) % 3 + 1;
images[i] = cvCreateImage( img_size,
img_type == CV_8U ? IPL_DEPTH_8U : IPL_DEPTH_32F, nch );
images[i] = Mat(img_size, CV_MAKETYPE(img_type, nch));
channels[i] = cvtest::randInt(rng) % nch;
Mat images_i = cvarrToMat(images[i]);
cvtest::randUni( rng, images_i, Scalar::all(low), Scalar::all(high) );
cvtest::randUni( rng, images[i], Scalar::all(low), Scalar::all(high) );
}
else if( i == CV_MAX_DIM && cvtest::randInt(rng) % 2 )
else if( i == CV_MAX_DIM )
{
if(cvtest::randInt(rng) % 2 )
{
// create mask
images[i] = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
Mat images_i = cvarrToMat(images[i]);
images[i] = Mat(img_size, CV_8U);
// make ~25% pixels in the mask non-zero
cvtest::randUni( rng, images_i, Scalar::all(-2), Scalar::all(2) );
cvtest::randUni( rng, images[i], Scalar::all(-2), Scalar::all(2) );
}
else
{
images[i] = Mat();
}
}
else if( i > CV_MAX_DIM )
{
images[i] = cvCreateImage( img_size, images[0]->depth, 1 );
images[i] = Mat(img_size, images[0].type());
}
}
......@@ -1419,7 +1446,7 @@ int CV_CalcBackProjectTest::prepare_test_case( int test_case_idx )
n = cvtest::randInt(rng) % (img_len/20+1);
for( i = 0; i < cdims; i++ )
{
char* data = images[i]->imageData;
uchar* data = images[i].data;
for( j = 0; j < n; j++ )
{
int idx = cvtest::randInt(rng) % img_len;
......@@ -1439,39 +1466,94 @@ int CV_CalcBackProjectTest::prepare_test_case( int test_case_idx )
void CV_CalcBackProjectTest::run_func(void)
{
cvCalcBackProject( images, images[CV_MAX_DIM+1], hist[0] );
int size[CV_MAX_DIM];
int hdims = cvGetDims( hist[0]->bins, size );
bool huniform = CV_IS_UNIFORM_HIST(hist[0]);
const float* uranges[CV_MAX_DIM] = {0};
const float** hranges = 0;
if( hist[0]->type & CV_HIST_RANGES_FLAG )
{
hranges = (const float**)hist[0]->thresh2;
if( huniform )
{
for(int i = 0; i < hdims; i++ )
uranges[i] = &hist[0]->thresh[i][0];
hranges = uranges;
}
}
std::vector<cv::Mat> imagesv(hdims);
copy(images.begin(), images.begin() + hdims, imagesv.begin());
cv::Mat dst = images[CV_MAX_DIM+1];
CV_Assert( dst.size() == imagesv[0].size() && dst.depth() == imagesv[0].depth() );
if( !CV_IS_SPARSE_HIST(hist[0]) )
{
cv::Mat H = cv::cvarrToMat(hist[0]->bins);
if(huniform)
{
vector<int> emptyChannels;
vector<float> vranges;
if(hranges)
{
vranges.resize(hdims*2);
for(int i = 0; i < hdims; i++ )
{
vranges[i*2 ] = hist[0]->thresh[i][0];
vranges[i*2+1] = hist[0]->thresh[i][1];
}
}
cv::calcBackProject(imagesv, emptyChannels, H, dst, vranges, 1);
}
else
{
cv::calcBackProject( &imagesv[0], (int)imagesv.size(),
0, H, dst, hranges, 1, false );
}
}
else
{
cv::SparseMat sH;
((const CvSparseMat*)hist[0]->bins)->copyToSparseMat(sH);
cv::calcBackProject( &imagesv[0], (int)imagesv.size(),
0, sH, dst, hranges, 1, huniform );
}
}
static void
cvTsCalcBackProject( IplImage** images, IplImage* dst, CvHistogram* hist, int* channels )
cvTsCalcBackProject( const vector<Mat>& images, Mat dst, CvHistogram* hist, const vector<int>& channels )
{
int x, y, k, cdims;
union
{
float* fl;
uchar* ptr;
const float* fl;
const uchar* ptr;
}
plane[CV_MAX_DIM];
int nch[CV_MAX_DIM];
int dims[CV_MAX_DIM];
int uniform = CV_IS_UNIFORM_HIST(hist);
CvSize img_size = cvGetSize(images[0]);
int img_depth = images[0]->depth;
Size img_size = images[0].size();
int img_depth = images[0].depth();
cdims = cvGetDims( hist->bins, dims );
for( k = 0; k < cdims; k++ )
nch[k] = images[k]->nChannels;
nch[k] = images[k].channels();
for( y = 0; y < img_size.height; y++ )
{
if( img_depth == IPL_DEPTH_8U )
if( img_depth == CV_8U )
for( k = 0; k < cdims; k++ )
plane[k].ptr = &CV_IMAGE_ELEM(images[k], uchar, y, 0 ) + channels[k];
plane[k].ptr = images[k].ptr<uchar>(y) + channels[k];
else
for( k = 0; k < cdims; k++ )
plane[k].fl = &CV_IMAGE_ELEM(images[k], float, y, 0 ) + channels[k];
plane[k].fl = images[k].ptr<float>(y) + channels[k];
for( x = 0; x < img_size.width; x++ )
{
......@@ -1479,7 +1561,7 @@ cvTsCalcBackProject( IplImage** images, IplImage* dst, CvHistogram* hist, int* c
float bin_val = 0;
int idx[CV_MAX_DIM];
if( img_depth == IPL_DEPTH_8U )
if( img_depth == CV_8U )
for( k = 0; k < cdims; k++ )
val[k] = plane[k].ptr[x*nch[k]];
else
......@@ -1517,13 +1599,13 @@ cvTsCalcBackProject( IplImage** images, IplImage* dst, CvHistogram* hist, int* c
if( k == cdims )
bin_val = (float)cvGetRealND( hist->bins, idx );
if( img_depth == IPL_DEPTH_8U )
if( img_depth == CV_8U )
{
int t = cvRound(bin_val);
CV_IMAGE_ELEM( dst, uchar, y, x ) = saturate_cast<uchar>(t);
dst.at<uchar>(y, x) = saturate_cast<uchar>(t);
}
else
CV_IMAGE_ELEM( dst, float, y, x ) = bin_val;
dst.at<float>(y, x) = bin_val;
}
}
}
......@@ -1534,7 +1616,7 @@ int CV_CalcBackProjectTest::validate_test_results( int /*test_case_idx*/ )
int code = cvtest::TS::OK;
cvTsCalcBackProject( images, images[CV_MAX_DIM+2], hist[0], channels );
Mat a = cvarrToMat(images[CV_MAX_DIM+1]), b = cvarrToMat(images[CV_MAX_DIM+2]);
Mat a = images[CV_MAX_DIM+1], b = images[CV_MAX_DIM+2];
double threshold = a.depth() == CV_8U ? 2 : FLT_EPSILON;
code = cvtest::cmpEps2( ts, a, b, threshold, true, "Back project image" );
......@@ -1558,30 +1640,22 @@ protected:
int prepare_test_case( int test_case_idx );
void run_func(void);
int validate_test_results( int test_case_idx );
IplImage* images[CV_MAX_DIM+2];
int channels[CV_MAX_DIM+2];
vector<Mat> images;
vector<int> channels;
CvSize patch_size;
Size patch_size;
double factor;
int method;
};
CV_CalcBackProjectPatchTest::CV_CalcBackProjectPatchTest()
CV_CalcBackProjectPatchTest::CV_CalcBackProjectPatchTest() :
images(CV_MAX_DIM+2), channels(CV_MAX_DIM+2)
{
int i;
hist_count = 1;
gen_random_hist = 0;
init_ranges = 1;
img_max_log_size = 6;
for( i = 0; i < CV_MAX_DIM+2; i++ )
{
images[i] = 0;
channels[i] = 0;
}
}
......@@ -1593,11 +1667,6 @@ CV_CalcBackProjectPatchTest::~CV_CalcBackProjectPatchTest()
void CV_CalcBackProjectPatchTest::clear()
{
int i;
for( i = 0; i < CV_MAX_DIM+2; i++ )
cvReleaseImage( &images[i] );
CV_BaseHistTest::clear();
}
......@@ -1609,7 +1678,7 @@ int CV_CalcBackProjectPatchTest::prepare_test_case( int test_case_idx )
if( code > 0 )
{
RNG& rng = ts->get_rng();
int i, j, n, img_len = img_size.width*img_size.height;
int i, j, n, img_len = img_size.area();
patch_size.width = cvtest::randInt(rng) % img_size.width + 1;
patch_size.height = cvtest::randInt(rng) % img_size.height + 1;
......@@ -1624,30 +1693,24 @@ int CV_CalcBackProjectPatchTest::prepare_test_case( int test_case_idx )
if( i < cdims )
{
int nch = 1; //cvtest::randInt(rng) % 3 + 1;
images[i] = cvCreateImage( img_size,
img_type == CV_8U ? IPL_DEPTH_8U : IPL_DEPTH_32F, nch );
images[i] = Mat(img_size, CV_MAKETYPE(img_type, nch));
channels[i] = cvtest::randInt(rng) % nch;
Mat images_i = cvarrToMat(images[i]);
cvtest::randUni( rng, images_i, Scalar::all(low), Scalar::all(high) );
cvtest::randUni( rng, images[i], Scalar::all(low), Scalar::all(high) );
}
else if( i >= CV_MAX_DIM )
{
images[i] = cvCreateImage(
cvSize(img_size.width - patch_size.width + 1,
img_size.height - patch_size.height + 1),
IPL_DEPTH_32F, 1 );
images[i] = Mat(img_size - patch_size + Size(1, 1), CV_32F);
}
}
cvTsCalcHist( images, hist[0], 0, channels );
cvTsCalcHist( images, hist[0], Mat(), channels );
cvNormalizeHist( hist[0], factor );
// now modify the images a bit
n = cvtest::randInt(rng) % (img_len/10+1);
for( i = 0; i < cdims; i++ )
{
char* data = images[i]->imageData;
uchar* data = images[i].data;
for( j = 0; j < n; j++ )
{
int idx = cvtest::randInt(rng) % img_len;
......@@ -1667,53 +1730,46 @@ int CV_CalcBackProjectPatchTest::prepare_test_case( int test_case_idx )
void CV_CalcBackProjectPatchTest::run_func(void)
{
cvCalcBackProjectPatch( images, images[CV_MAX_DIM], patch_size, hist[0], method, factor );
CvMat dst(images[CV_MAX_DIM]);
vector<CvMat > img(cdims);
vector<CvMat*> pimg(cdims);
for(int i = 0; i < cdims; i++)
{
img[i] = CvMat(images[i]);
pimg[i] = &img[i];
}
cvCalcArrBackProjectPatch( (CvArr**)&pimg[0], &dst, patch_size, hist[0], method, factor );
}
static void
cvTsCalcBackProjectPatch( IplImage** images, IplImage* dst, CvSize patch_size,
cvTsCalcBackProjectPatch( const vector<Mat>& images, Mat dst, Size patch_size,
CvHistogram* hist, int method,
double factor, int* channels )
double factor, const vector<int>& channels )
{
CvHistogram* model = 0;
IplImage imgstub[CV_MAX_DIM], *img[CV_MAX_DIM];
IplROI roi;
int i, dims;
int x, y;
CvSize size = cvGetSize(dst);
Size size = dst.size();
dims = cvGetDims( hist->bins );
cvCopyHist( hist, &model );
cvNormalizeHist( hist, factor );
cvZero( dst );
for( i = 0; i < dims; i++ )
{
CvMat stub, *mat;
mat = cvGetMat( images[i], &stub, 0, 0 );
img[i] = cvGetImage( mat, &imgstub[i] );
img[i]->roi = &roi;
}
roi.coi = 0;
vector<Mat> img(images.size());
for( y = 0; y < size.height; y++ )
{
for( x = 0; x < size.width; x++ )
{
double result;
roi.xOffset = x;
roi.yOffset = y;
roi.width = patch_size.width;
roi.height = patch_size.height;
Rect roi(Point(x, y), patch_size);
for(size_t i = 0; i < img.size(); i++)
img[i] = images[i](roi);
cvTsCalcHist( img, model, 0, channels );
cvTsCalcHist( img, model, Mat(), channels );
cvNormalizeHist( model, factor );
result = cvCompareHist( model, hist, method );
CV_IMAGE_ELEM( dst, float, y, x ) = (float)result;
dst.at<float>(y, x) = (float)result;
}
}
......@@ -1726,10 +1782,14 @@ int CV_CalcBackProjectPatchTest::validate_test_results( int /*test_case_idx*/ )
int code = cvtest::TS::OK;
double err_level = 5e-3;
cvTsCalcBackProjectPatch( images, images[CV_MAX_DIM+1],
patch_size, hist[0], method, factor, channels );
Mat dst = images[CV_MAX_DIM+1];
vector<Mat> imagesv(cdims);
for(int i = 0; i < cdims; i++)
imagesv[i] = images[i];
cvTsCalcBackProjectPatch( imagesv, dst, patch_size, hist[0],
method, factor, channels );
Mat a = cvarrToMat(images[CV_MAX_DIM]), b = cvarrToMat(images[CV_MAX_DIM+1]);
Mat a = images[CV_MAX_DIM], b = images[CV_MAX_DIM+1];
code = cvtest::cmpEps2( ts, a, b, err_level, true, "BackProjectPatch result" );
if( code < 0 )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment