📄 cvhistogram.cpp
字号:
{
limit = hist->thresh2[i][idx+1];
if( limit > hi )
limit = hi;
write_idx = idx*step;
}
else
{
for( ; j < hi; j++ )
tab[i*(hi - lo) + j - lo] = ICV_HIST_DUMMY_IDX;
break;
}
}
}
}
return CV_OK;
}
/***************************** C A L C H I S T O G R A M *************************/
// Calculates histogram for one or more 8u arrays
static CvStatus CV_STDCALL
icvCalcHist_8u_C1R( uchar** img, int step, uchar* mask, int maskStep,
CvSize size, CvHistogram* hist )
{
int* tab;
int is_sparse = CV_IS_SPARSE_HIST(hist);
int dims, histsize[CV_MAX_DIM];
int i, x;
CvStatus status;
dims = cvGetDims( hist->bins, histsize );
tab = (int*)cvStackAlloc( dims*256*sizeof(int));
status = icvCalcHistLookupTables8u( hist, dims, histsize, tab );
if( status < 0 )
return status;
if( !is_sparse )
{
int total = 1;
int* bins = ((CvMatND*)(hist->bins))->data.i;
for( i = 0; i < dims; i++ )
total *= histsize[i];
if( dims <= 3 && total >= -ICV_HIST_DUMMY_IDX )
return CV_BADSIZE_ERR; // too big histogram
switch( dims )
{
case 1:
{
int tab1d[256];
memset( tab1d, 0, sizeof(tab1d));
for( ; size.height--; img[0] += step )
{
uchar* ptr = img[0];
if( !mask )
{
for( x = 0; x <= size.width - 4; x += 4 )
{
int v0 = ptr[x];
int v1 = ptr[x+1];
tab1d[v0]++;
tab1d[v1]++;
v0 = ptr[x+2];
v1 = ptr[x+3];
tab1d[v0]++;
tab1d[v1]++;
}
for( ; x < size.width; x++ )
tab1d[ptr[x]]++;
}
else
{
for( x = 0; x < size.width; x++ )
if( mask[x] )
tab1d[ptr[x]]++;
mask += maskStep;
}
}
for( i = 0; i < 256; i++ )
{
int idx = tab[i];
if( idx >= 0 )
bins[idx] += tab1d[i];
}
}
break;
case 2:
for( ; size.height--; img[0] += step, img[1] += step )
{
uchar* ptr0 = img[0];
uchar* ptr1 = img[1];
if( !mask )
{
for( x = 0; x < size.width; x++ )
{
int v0 = ptr0[x];
int v1 = ptr1[x];
int idx = tab[v0] + tab[256+v1];
if( idx >= 0 )
bins[idx]++;
}
}
else
{
for( x = 0; x < size.width; x++ )
{
if( mask[x] )
{
int v0 = ptr0[x];
int v1 = ptr1[x];
int idx = tab[v0] + tab[256+v1];
if( idx >= 0 )
bins[idx]++;
}
}
mask += maskStep;
}
}
break;
case 3:
for( ; size.height--; img[0] += step, img[1] += step, img[2] += step )
{
uchar* ptr0 = img[0];
uchar* ptr1 = img[1];
uchar* ptr2 = img[2];
if( !mask )
{
for( x = 0; x < size.width; x++ )
{
int v0 = ptr0[x];
int v1 = ptr1[x];
int v2 = ptr2[x];
int idx = tab[v0] + tab[256+v1] + tab[512+v2];
if( idx >= 0 )
bins[idx]++;
}
}
else
{
for( x = 0; x < size.width; x++ )
{
if( mask[x] )
{
int v0 = ptr0[x];
int v1 = ptr1[x];
int v2 = ptr2[x];
int idx = tab[v0] + tab[256+v1] + tab[512+v2];
if( idx >= 0 )
bins[idx]++;
}
}
mask += maskStep;
}
}
break;
default:
for( ; size.height--; )
{
if( !mask )
{
for( x = 0; x < size.width; x++ )
{
int* binptr = bins;
for( i = 0; i < dims; i++ )
{
int idx = tab[i*256 + img[i][x]];
if( idx < 0 )
break;
binptr += idx;
}
if( i == dims )
binptr[0]++;
}
}
else
{
for( x = 0; x < size.width; x++ )
{
if( mask[x] )
{
int* binptr = bins;
for( i = 0; i < dims; i++ )
{
int idx = tab[i*256 + img[i][x]];
if( idx < 0 )
break;
binptr += idx;
}
if( i == dims )
binptr[0]++;
}
}
mask += maskStep;
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
}
else
{
CvSparseMat* mat = (CvSparseMat*)(hist->bins);
int node_idx[CV_MAX_DIM];
for( ; size.height--; )
{
if( !mask )
{
for( x = 0; x < size.width; x++ )
{
for( i = 0; i < dims; i++ )
{
int idx = tab[i*256 + img[i][x]];
if( idx < 0 )
break;
node_idx[i] = idx;
}
if( i == dims )
{
int* bin = (int*)cvPtrND( mat, node_idx, 0, 1 );
bin[0]++;
}
}
}
else
{
for( x = 0; x < size.width; x++ )
{
if( mask[x] )
{
for( i = 0; i < dims; i++ )
{
int idx = tab[i*256 + img[i][x]];
if( idx < 0 )
break;
node_idx[i] = idx;
}
if( i == dims )
{
int* bin = (int*)cvPtrND( mat, node_idx, 0, 1, 0 );
bin[0]++;
}
}
}
mask += maskStep;
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
return CV_OK;
}
// Calculates histogram for one or more 32f arrays
static CvStatus CV_STDCALL
icvCalcHist_32f_C1R( float** img, int step, uchar* mask, int maskStep,
CvSize size, CvHistogram* hist )
{
int is_sparse = CV_IS_SPARSE_HIST(hist);
int uniform = CV_IS_UNIFORM_HIST(hist);
int dims, histsize[CV_MAX_DIM];
double uni_range[CV_MAX_DIM][2];
int i, x;
dims = cvGetDims( hist->bins, histsize );
step /= sizeof(img[0][0]);
if( uniform )
{
for( i = 0; i < dims; i++ )
{
double t = histsize[i]/((double)hist->thresh[i][1] - hist->thresh[i][0]);
uni_range[i][0] = t;
uni_range[i][1] = -t*hist->thresh[i][0];
}
}
if( !is_sparse )
{
CvMatND* mat = (CvMatND*)(hist->bins);
int* bins = mat->data.i;
if( uniform )
{
switch( dims )
{
case 1:
{
double a = uni_range[0][0], b = uni_range[0][1];
int sz = histsize[0];
for( ; size.height--; img[0] += step )
{
float* ptr = img[0];
if( !mask )
{
for( x = 0; x <= size.width - 4; x += 4 )
{
int v0 = cvFloor(ptr[x]*a + b);
int v1 = cvFloor(ptr[x+1]*a + b);
if( (unsigned)v0 < (unsigned)sz )
bins[v0]++;
if( (unsigned)v1 < (unsigned)sz )
bins[v1]++;
v0 = cvFloor(ptr[x+2]*a + b);
v1 = cvFloor(ptr[x+3]*a + b);
if( (unsigned)v0 < (unsigned)sz )
bins[v0]++;
if( (unsigned)v1 < (unsigned)sz )
bins[v1]++;
}
for( ; x < size.width; x++ )
{
int v0 = cvFloor(ptr[x]*a + b);
if( (unsigned)v0 < (unsigned)sz )
bins[v0]++;
}
}
else
{
for( x = 0; x < size.width; x++ )
if( mask[x] )
{
int v0 = cvFloor(ptr[x]*a + b);
if( (unsigned)v0 < (unsigned)sz )
bins[v0]++;
}
mask += maskStep;
}
}
}
break;
case 2:
{
double a0 = uni_range[0][0], b0 = uni_range[0][1];
double a1 = uni_range[1][0], b1 = uni_range[1][1];
int sz0 = histsize[0], sz1 = histsize[1];
int step0 = ((CvMatND*)(hist->bins))->dim[0].step/sizeof(float);
for( ; size.height--; img[0] += step, img[1] += step )
{
float* ptr0 = img[0];
float* ptr1 = img[1];
if( !mask )
{
for( x = 0; x < size.width; x++ )
{
int v0 = cvFloor( ptr0[x]*a0 + b0 );
int v1 = cvFloor( ptr1[x]*a1 + b1 );
if( (unsigned)v0 < (unsigned)sz0 &&
(unsigned)v1 < (unsigned)sz1 )
bins[v0*step0 + v1]++;
}
}
else
{
for( x = 0; x < size.width; x++ )
{
if( mask[x] )
{
int v0 = cvFloor( ptr0[x]*a0 + b0 );
int v1 = cvFloor( ptr1[x]*a1 + b1 );
if( (unsigned)v0 < (unsigned)sz0 &&
(unsigned)v1 < (unsigned)sz1 )
bins[v0*step0 + v1]++;
}
}
mask += maskStep;
}
}
}
break;
default:
for( ; size.height--; )
{
if( !mask )
{
for( x = 0; x < size.width; x++ )
{
int* binptr = bins;
for( i = 0; i < dims; i++ )
{
int idx = cvFloor((double)img[i][x]*uni_range[i][0]
+ uni_range[i][1]);
if( (unsigned)idx >= (unsigned)histsize[i] )
break;
binptr += idx*(mat->dim[i].step/sizeof(float));
}
if( i == dims )
binptr[0]++;
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -