cvhistogram.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 2,118 行 · 第 1/5 页
SVN-BASE
2,118 行
{
float* binptr = bins;
int v = 0;
for( i = 0; i < dims; i++ )
{
int idx = tab[i*256 + img[i][x]];
if( idx < 0 )
break;
binptr += idx;
}
if( i == dims )
{
v = cvRound( binptr[0] );
v = CV_CAST_8U(v);
}
dst[x] = (uchar)v;
}
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
icvFree( (void**)&buffer );
}
else
{
CvSparseMat* mat = (CvSparseMat*)(hist->bins);
int node_idx[CV_MAX_DIM];
for( ; size.height--; dst += dstStep )
{
for( x = 0; x < size.width; x++ )
{
int v = 0;
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 )
{
float* bin = (float*)icvGetNodePtr( mat, node_idx, 0, 1 );
v = cvRound(bin[0]);
v = CV_CAST_8U(v);
}
dst[x] = (uchar)v;
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
return CV_OK;
}
// Calculates back project for one or more 32f arrays
static CvStatus CV_STDCALL
icvCalcBackProject_32f_C1R( float** img, int step, float* dst, int dstStep,
CvSize size, const CvHistogram* hist )
{
int is_sparse = CV_IS_SPARSE_HIST(hist);
int uniform = CV_IS_UNIFORM_HIST(hist);
int dims, histsize[CV_MAX_DIM];
float uni_range[CV_MAX_DIM][2];
int i, x;
dims = cvGetDims( hist->bins, histsize );
step /= sizeof(img[0][0]);
dstStep /= sizeof(dst[0]);
if( uniform )
{
for( i = 0; i < dims; i++ )
{
float t = ((float)histsize[i])/(hist->thresh[i][1] - hist->thresh[i][0]);
uni_range[i][0] = t;
uni_range[i][1] = (float)(-t*hist->thresh[i][0]);
}
}
if( !is_sparse )
{
CvMatND* mat = (CvMatND*)(hist->bins);
float* bins = mat->data.fl;
if( uniform )
{
switch( dims )
{
case 1:
{
float a = uni_range[0][0], b = uni_range[0][1];
int sz = histsize[0];
for( ; size.height--; img[0] += step, dst += dstStep )
{
float* ptr = img[0];
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 )
dst[x] = bins[v0];
else
dst[x] = 0;
if( (unsigned)v1 < (unsigned)sz )
dst[x+1] = bins[v1];
else
dst[x+1] = 0;
v0 = cvFloor(ptr[x+2]*a + b);
v1 = cvFloor(ptr[x+3]*a + b);
if( (unsigned)v0 < (unsigned)sz )
dst[x+2] = bins[v0];
else
dst[x+2] = 0;
if( (unsigned)v1 < (unsigned)sz )
dst[x+3] = bins[v1];
else
dst[x+3] = 0;
}
for( ; x < size.width; x++ )
{
int v0 = cvFloor(ptr[x]*a + b);
if( (unsigned)v0 < (unsigned)sz )
dst[x] = bins[v0];
else
dst[x] = 0;
}
}
}
break;
case 2:
{
float a0 = uni_range[0][0], b0 = uni_range[0][1];
float 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, dst += dstStep )
{
float* ptr0 = img[0];
float* ptr1 = img[1];
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 )
dst[x] = bins[v0*step0 + v1];
else
dst[x] = 0;
}
}
}
break;
default:
for( ; size.height--; dst += dstStep )
{
for( x = 0; x < size.width; x++ )
{
float* binptr = bins;
for( i = 0; i < dims; i++ )
{
int idx = cvFloor(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 )
dst[x] = binptr[0];
else
dst[x] = 0;
}
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
else
{
for( ; size.height--; dst += dstStep )
{
for( x = 0; x < size.width; x++ )
{
float* binptr = bins;
for( i = 0; i < dims; i++ )
{
float v = img[i][x];
float* thresh = hist->thresh2[i];
int idx = -1, sz = histsize[i];
while( v >= thresh[idx+1] && ++idx < sz )
/* nop */;
if( (unsigned)idx >= (unsigned)sz )
break;
binptr += idx*(mat->dim[i].step/sizeof(float));
}
if( i == dims )
dst[x] = binptr[0];
else
dst[x] = 0;
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
}
else
{
CvSparseMat* mat = (CvSparseMat*)(hist->bins);
int node_idx[CV_MAX_DIM];
for( ; size.height--; dst += dstStep )
{
if( uniform )
{
for( x = 0; x < size.width; x++ )
{
for( i = 0; i < dims; i++ )
{
int idx = cvFloor(img[i][x]*uni_range[i][0]
+ uni_range[i][1]);
if( (unsigned)idx >= (unsigned)histsize[i] )
break;
node_idx[i] = idx;
}
if( i == dims )
{
float* bin = (float*)icvGetNodePtr( mat, node_idx, 0, 1 );
dst[x] = bin[0];
}
else
dst[x] = 0;
}
}
else
{
for( x = 0; x < size.width; x++ )
{
for( i = 0; i < dims; i++ )
{
float v = img[i][x];
float* thresh = hist->thresh2[i];
int idx = -1, sz = histsize[i];
while( v >= thresh[idx+1] && ++idx < sz )
/* nop */;
if( (unsigned)idx >= (unsigned)sz )
break;
node_idx[i] = idx;
}
if( i == dims )
{
float* bin = (float*)icvGetNodePtr( mat, node_idx, 0, 1 );
dst[x] = bin[0];
}
else
dst[x] = 0;
}
}
for( i = 0; i < dims; i++ )
img[i] += step;
}
}
return CV_OK;
}
CV_IMPL void
cvCalcArrBackProject( CvArr** img, CvArr* dst, const CvHistogram* hist )
{
CV_FUNCNAME( "cvCalcArrBackProject" );
__BEGIN__;
uchar* ptr[CV_MAX_DIM];
uchar* dstptr = 0;
int dststep = 0, step = 0;
int i, dims;
int cont_flag = -1;
CvMat stub0, *mat0 = 0;
CvSize size;
if( !CV_IS_HIST(hist))
CV_ERROR( CV_StsBadArg, "Bad histogram pointer" );
if( !img )
CV_ERROR( CV_StsNullPtr, "Null double array pointer" );
CV_CALL( dims = cvGetDims( hist->bins ));
for( i = 0; i <= dims; i++ )
{
CvMat stub, *mat = (CvMat*)(i < dims ? img[i] : dst);
CV_CALL( mat = cvGetMat( mat, i == 0 ? &stub0 : &stub, 0, 1 ));
if( CV_MAT_CN( mat->type ) != 1 )
CV_ERROR( CV_BadNumChannels, "Only 1-channel arrays are allowed here" );
if( i == 0 )
{
mat0 = mat;
step = mat0->step;
}
else
{
if( !CV_ARE_SIZES_EQ( mat0, mat ))
CV_ERROR( CV_StsUnmatchedSizes, "Not all the planes have equal sizes" );
if( mat0->step != mat->step )
CV_ERROR( CV_StsUnmatchedSizes, "Not all the planes have equal steps" );
if( !CV_ARE_TYPES_EQ( mat0, mat ))
CV_ERROR( CV_StsUnmatchedFormats, "Not all the planes have equal types" );
}
cont_flag &= mat->type;
if( i < dims )
ptr[i] = mat->data.ptr;
else
{
dstptr = mat->data.ptr;
dststep = mat->step;
}
}
size = icvGetMatSize(mat0);
if( CV_IS_MAT_CONT( cont_flag ))
{
size.width *= size.height;
size.height = 1;
dststep = step = CV_AUTOSTEP;
}
if( CV_MAT_DEPTH(mat0->type) > CV_8S && !CV_HIST_HAS_RANGES(hist))
CV_ERROR( CV_StsBadArg, "histogram ranges must be set (via cvSetHistBinRanges) "
"before calling the function" );
switch( CV_MAT_DEPTH(mat0->type) )
{
case CV_8U:
IPPI_CALL( icvCalcBackProject_8u_C1R( ptr, step, dstptr, dststep, size, hist ));
break;
case CV_32F:
IPPI_CALL( icvCalcBackProject_32f_C1R( (float**)ptr, step,
(float*)dstptr, dststep, size, hist ));
break;
default:
CV_ERROR( CV_StsUnsupportedFormat, "Unsupported array type" );
}
__END__;
}
////////////////////// B A C K P R O J E C T P A T C H /////////////////////////
CV_IMPL void
cvCalcArrBackProjectPatch( CvArr** arr, CvArr* dst, CvSize range, CvHistogram* hist,
CvCompareMethod method, double norm_factor )
{
CvHistogram* model = 0;
CV_FUNCNAME( "cvCalcArrBackProjectPatch" );
__BEGIN__;
IplImage imgstub[CV_MAX_DIM], *img[CV_MAX_DIM];
IplROI roi;
CvMat dststub, *dstmat;
int i, dims;
int x, y;
CvSize size;
if( !CV_IS_HIST(hist))
CV_ERROR( CV_StsBadArg, "Bad histogram pointer" );
if( !img )
CV_ERROR( CV_StsNullPtr, "Null double array pointer" );
if( norm_factor <= 0 )
CV_ERROR( CV_StsOutOfRange,
"Bad normalization factor (set it to 1.0 if unsure)" );
CV_CALL( dims = cvGetDims( hist->bins ));
CV_CALL( cvCopyHist( hist, &model ));
CV_CALL( cvNormalizeHist( hist, norm_factor ));
for( i = 0; i < dims; i++ )
{
CvMat stub, *mat;
CV_CALL( mat = cvGetMat( arr[i], &stub,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?