📄 cxcopy.c
字号:
{
do
{
memcpy( iterator.ptr[1], iterator.ptr[0], iterator.size.width );
}
while( cvNextNArraySlice( &iterator ));
}
else
{
do
{
icvCopy_8u_C1R( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP, iterator.size );
}
while( cvNextNArraySlice( &iterator ));
}
}
else
{
CvCopyMaskFunc func = icvGetCopyMaskFunc( pix_size );
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
do
{
func( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP,
iterator.size,
iterator.ptr[2], CV_STUB_STEP );
}
while( cvNextNArraySlice( &iterator ));
}
EXIT;
}
else
{
int coi1 = 0, coi2 = 0;
CV_CALL( src = cvGetMat( src, &srcstub, &coi1, 0 ));
CV_CALL( dst = cvGetMat( dst, &dststub, &coi2, 0 ));
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( cvSplit( 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( cvMerge( 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 = cvGetMatSize( src );
pix_size = CV_ELEM_SIZE(src->type);
if( !maskarr )
{
int src_step = src->step, dst_step = dst->step;
size.width *= pix_size;
if( CV_IS_MAT_CONT( src->type & dst->type ) && (src_step == dst_step) && (src_step == src->width * pix_size))
{
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;
src_step = dst_step = CV_STUB_STEP;
}
icvCopy_8u_C1R( src->data.ptr, src_step,
dst->data.ptr, dst_step, size );
}
else
{
CvCopyMaskFunc func = icvGetCopyMaskFunc(pix_size);
CvMat maskstub, *mask = (CvMat*)maskarr;
int src_step = src->step;
int dst_step = dst->step;
int mask_step;
if( !CV_IS_MAT( mask ))
CV_CALL( mask = cvGetMat( mask, &maskstub, 0, 0 ));
if( !CV_IS_MASK_ARR( mask ))
CV_ERROR( CV_StsBadMask, "" );
if( !CV_ARE_SIZES_EQ( src, mask ))
CV_ERROR( CV_StsUnmatchedSizes, "" );
mask_step = mask->step;
if( CV_IS_MAT_CONT( src->type & dst->type & mask->type ))
{
size.width *= size.height;
size.height = 1;
src_step = dst_step = mask_step = CV_STUB_STEP;
}
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
IPPI_CALL( func( src->data.ptr, src_step, dst->data.ptr, dst_step,
size, mask->data.ptr, mask_step ));
}
__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( !value.val[0] && !value.val[1] &&
!value.val[2] && !value.val[3] && !maskarr )
{
cvZero( arr );
EXIT;
}
if( !CV_IS_MAT(mat))
{
if( CV_IS_MATND(mat))
{
CvMatND nstub;
CvNArrayIterator iterator;
int pix_size1;
CV_CALL( cvInitNArrayIterator( 1, &arr, maskarr, &nstub, &iterator, 0 ));
type = CV_MAT_TYPE(iterator.hdr[0]->type);
pix_size1 = CV_ELEM_SIZE1(type);
pix_size = pix_size1*CV_MAT_CN(type);
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( cvNextNArraySlice( &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( cvNextNArraySlice( &iterator ));
}
EXIT;
}
else
{
int coi = 0;
CV_CALL( mat = cvGetMat( mat, &stub, &coi, 0 ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
}
type = CV_MAT_TYPE( mat->type );
pix_size = CV_ELEM_SIZE(type);
size = cvGetMatSize( 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 )
{
float* dstdata = (float*)(mat->data.ptr);
float val = (float)value.val[0];
do
{
dstdata[size.width-1] = val;
}
while( --size.width );
EXIT;
}
if( type == CV_64FC1 )
{
double* dstdata = (double*)(mat->data.ptr);
double val = value.val[0];
do
{
dstdata[size.width-1] = val;
}
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,
CV_ELEM_SIZE1(type)));
}
else
{
CvFunc2D_2A1P func;
CvMat maskstub, *mask = (CvMat*)maskarr;
int mask_step;
CV_CALL( mask = cvGetMat( mask, &maskstub, 0, 0 ));
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 *
\****************************************************************************************/
icvSetByte_8u_C1R_t icvSetByte_8u_C1R_p = 0;
CvStatus CV_STDCALL
icvSetZero_8u_C1R( uchar* dst, int dststep, CvSize size )
{
if( size.width + size.height > 256 && icvSetByte_8u_C1R_p )
return icvSetByte_8u_C1R_p( 0, dst, dststep, size );
for( ; size.height--; dst += dststep )
memset( dst, 0, size.width );
return CV_OK;
}
CV_IMPL void
cvSetZero( CvArr* arr )
{
CV_FUNCNAME( "cvSetZero" );
__BEGIN__
CvMat stub, *mat = (CvMat*)arr;
CvSize size;
int mat_step;
if( !CV_IS_MAT( mat ))
{
if( CV_IS_MATND(mat))
{
CvMatND nstub;
CvNArrayIterator iterator;
CV_CALL( cvInitNArrayIterator( 1, &arr, 0, &nstub, &iterator, 0 ));
iterator.size.width *= CV_ELEM_SIZE(iterator.hdr[0]->type);
if( iterator.size.width <= CV_MAX_INLINE_MAT_OP_SIZE*(int)sizeof(double) )
{
do
{
memset( iterator.ptr[0], 0, iterator.size.width );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -