cvcopy.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 1,092 行 · 第 1/3 页
SVN-BASE
1,092 行
if( CV_IS_SPARSE_MAT(src) && CV_IS_SPARSE_MAT(dst))
{
CvSparseMat* src1 = (CvSparseMat*)src;
CvSparseMat* dst1 = (CvSparseMat*)dst;
CvSparseMatIterator iterator;
CvSparseNode* node;
dst1->dims = src1->dims;
memcpy( dst1->size, src1->size, src1->dims*sizeof(src1->size[0]));
dst1->valoffset = src1->valoffset;
dst1->idxoffset = src1->idxoffset;
dst1->total = src1->total;
cvClearSet( dst1->heap );
if( dst1->total >= dst1->hashsize*CV_SPARSE_HASH_RATIO )
{
CV_CALL( cvFree( (void**)(&dst1->hashtable) ));
dst1->hashsize = src1->hashsize;
CV_CALL( dst1->hashtable =
(void**)cvAlloc( dst1->hashsize*sizeof(dst1->hashtable[0])));
}
memset( dst1->hashtable, 0, dst1->hashsize*sizeof(dst1->hashtable[0]));
for( node = cvInitSparseMatIterator( src1, &iterator );
node != 0; node = cvGetNextSparseNode( &iterator ))
{
CvSparseNode* node_copy = (CvSparseNode*)cvSetNew( dst1->heap );
int tabidx = node->hashval & (dst1->hashsize - 1);
memcpy( node_copy, node, dst1->heap->elem_size );
node_copy->next = (CvSparseNode*)dst1->hashtable[tabidx];
dst1->hashtable[tabidx] = node_copy;
}
EXIT;
}
else if( CV_IS_MATND(src) || CV_IS_MATND(dst) )
{
CvArr* arrs[] = { src, dst };
CvMatND stubs[3];
CvMatNDIterator iterator;
CV_CALL( icvPrepareArrayOp( 2, arrs, maskarr, stubs, &iterator ));
pix_size = icvPixSize[CV_MAT_TYPE(iterator.hdr[0]->type)];
if( !maskarr )
{
iterator.size.width *= pix_size;
if( iterator.size.width <= CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double))
{
do
{
memcpy( iterator.ptr[1], iterator.ptr[0], iterator.size.width );
}
while( icvNextMatNDSlice( &iterator ));
}
else
{
do
{
icvCopy_8u_C1R( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP, iterator.size );
}
while( icvNextMatNDSlice( &iterator ));
}
}
else
{
CvFunc2D_3A func = (CvFunc2D_3A)(copym_tab.fn_2d[pix_size]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
do
{
func( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP,
iterator.ptr[2], CV_STUB_STEP, iterator.size );
}
while( icvNextMatNDSlice( &iterator ));
}
EXIT;
}
else
{
int coi1 = 0, coi2 = 0;
CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
if( coi1 )
{
CvArr* planes[] = { 0, 0, 0, 0 };
if( maskarr )
CV_ERROR( CV_StsBadArg, "COI + mask are not supported" );
planes[coi1-1] = dst;
CV_CALL( cvCvtPixToPlane( src, planes[0], planes[1], planes[2], planes[3] ));
EXIT;
}
else if( coi2 )
{
CvArr* planes[] = { 0, 0, 0, 0 };
if( maskarr )
CV_ERROR( CV_StsBadArg, "COI + mask are not supported" );
planes[coi2-1] = src;
CV_CALL( cvCvtPlaneToPix( planes[0], planes[1], planes[2], planes[3], dst ));
EXIT;
}
}
}
if( !CV_ARE_TYPES_EQ( src, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
if( !CV_ARE_SIZES_EQ( src, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
size = icvGetMatSize( src );
pix_size = CV_ELEM_SIZE(src->type);
if( !maskarr )
{
size.width *= pix_size;
if( CV_IS_MAT_CONT( src->type & dst->type ))
{
size.width *= size.height;
if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE*
CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double))
{
memcpy( dst->data.ptr, src->data.ptr, size.width );
EXIT;
}
size.height = 1;
}
icvCopy_8u_C1R( src->data.ptr, src->step,
dst->data.ptr, dst->step, size );
}
else
{
CvFunc2D_3A func;
CvMat maskstub, *mask = (CvMat*)maskarr;
if( !CV_IS_MAT( mask ))
CV_CALL( mask = cvGetMat( mask, &maskstub ));
if( !CV_IS_MASK_ARR( mask ))
CV_ERROR( CV_StsBadMask, "" );
if( !inittab )
{
icvInitCopyMRTable( ©m_tab );
inittab = 1;
}
if( !CV_ARE_SIZES_EQ( src, mask ))
CV_ERROR( CV_StsUnmatchedSizes, "" );
if( CV_IS_MAT_CONT( src->type & dst->type & mask->type ))
{
size.width *= size.height;
size.height = 1;
}
func = (CvFunc2D_3A)(copym_tab.fn_2d[pix_size]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
IPPI_CALL( func( src->data.ptr, src->step, dst->data.ptr, dst->step,
mask->data.ptr, mask->step, size ));
}
__END__;
}
/* dst(idx) = value */
CV_IMPL void
cvSet( void* arr, CvScalar value, const void* maskarr )
{
static CvBtFuncTable setm_tab;
static int inittab = 0;
CV_FUNCNAME( "cvSet" );
__BEGIN__;
CvMat stub, *mat = (CvMat*)arr;
int pix_size, type;
double buf[12];
int mat_step;
CvSize size;
if( !CV_IS_MAT(mat))
{
if( CV_IS_MATND(mat))
{
CvMatND stub;
CvMatNDIterator iterator;
int pix_size1;
CV_CALL( icvPrepareArrayOp( 1, &arr, maskarr, &stub, &iterator ));
type = CV_MAT_TYPE(iterator.hdr[0]->type);
pix_size = icvPixSize[type];
pix_size1 = icvPixSize[type & ~CV_MAT_CN_MASK];
CV_CALL( cvScalarToRawData( &value, buf, type, maskarr == 0 ));
if( !maskarr )
{
iterator.size.width *= pix_size;
do
{
icvSet_8u_C1R( iterator.ptr[0], CV_STUB_STEP,
iterator.size, buf, pix_size1 );
}
while( icvNextMatNDSlice( &iterator ));
}
else
{
CvFunc2D_2A1P func = (CvFunc2D_2A1P)(setm_tab.fn_2d[pix_size]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
do
{
func( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP,
iterator.size, buf );
}
while( icvNextMatNDSlice( &iterator ));
}
EXIT;
}
else
{
int coi = 0;
CV_CALL( mat = cvGetMat( mat, &stub, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
}
type = CV_MAT_TYPE( mat->type );
pix_size = icvPixSize[type];
size = icvGetMatSize( mat );
mat_step = mat->step;
if( !maskarr )
{
if( CV_IS_MAT_CONT( mat->type ))
{
size.width *= size.height;
if( size.width <= (int)(CV_MAX_INLINE_MAT_OP_SIZE*sizeof(double)))
{
if( type == CV_32FC1 )
{
int* dstdata = (int*)(mat->data.ptr);
float val = (float)value.val[0];
int ival = (int&)val;
do
{
dstdata[size.width-1] = ival;
}
while( --size.width );
EXIT;
}
if( type == CV_64FC1 )
{
int64* dstdata = (int64*)(mat->data.ptr);
int64 ival = (int64&)(value.val[0]);
do
{
dstdata[size.width-1] = ival;
}
while( --size.width );
EXIT;
}
}
mat_step = CV_STUB_STEP;
size.height = 1;
}
size.width *= pix_size;
CV_CALL( cvScalarToRawData( &value, buf, type, 1 ));
IPPI_CALL( icvSet_8u_C1R( mat->data.ptr, mat_step, size, buf,
icvPixSize[type & ~CV_MAT_CN_MASK]));
}
else
{
CvFunc2D_2A1P func;
CvMat maskstub, *mask = (CvMat*)maskarr;
int mask_step;
CV_CALL( mask = cvGetMat( mask, &maskstub ));
if( !CV_IS_MASK_ARR( mask ))
CV_ERROR( CV_StsBadMask, "" );
if( !inittab )
{
icvInitSetMRTable( &setm_tab );
inittab = 1;
}
if( !CV_ARE_SIZES_EQ( mat, mask ))
CV_ERROR( CV_StsUnmatchedSizes, "" );
mask_step = mask->step;
if( CV_IS_MAT_CONT( mat->type & mask->type ))
{
size.width *= size.height;
mat_step = mask_step = CV_STUB_STEP;
size.height = 1;
}
func = (CvFunc2D_2A1P)(setm_tab.fn_2d[pix_size]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
CV_CALL( cvScalarToRawData( &value, buf, type, 0 ));
IPPI_CALL( func( mat->data.ptr, mat_step, mask->data.ptr,
mask_step, size, buf ));
}
__END__;
}
/****************************************************************************************\
* Clearing *
\****************************************************************************************/
IPCVAPI_IMPL( CvStatus,
icvSetZero_8u_C1R, ( uchar* dst, int dststep, CvSize size ))
{
for( ; size.height--; dst += dststep )
{
memset( dst, 0, size.width );
}
return CV_OK;
}
CV_IMPL void
cvSetZero( CvArr* arr )
{
CV_FUNCNAME( "cvSetZero" );
__BEGIN__;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?