📄 cxarray.cpp
字号:
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
}
// Assigns external data to array
CV_IMPL void
cvSetData( CvArr* arr, void* data, int step )
{
CV_FUNCNAME( "cvSetData" );
__BEGIN__;
int pix_size, min_step;
if( CV_IS_MAT_HDR(arr) || CV_IS_MATND_HDR(arr) )
cvReleaseData( arr );
if( CV_IS_MAT_HDR( arr ))
{
CvMat* mat = (CvMat*)arr;
int type = CV_MAT_TYPE(mat->type);
pix_size = CV_ELEM_SIZE(type);
min_step = mat->cols*pix_size & ((mat->rows <= 1) - 1);
if( step != CV_AUTOSTEP )
{
if( step < min_step && data != 0 )
CV_ERROR_FROM_CODE( CV_BadStep );
mat->step = step & ((mat->rows <= 1) - 1);
}
else
{
mat->step = min_step;
}
mat->data.ptr = (uchar*)data;
mat->type = CV_MAT_MAGIC_VAL | type |
(mat->step==min_step ? CV_MAT_CONT_FLAG : 0);
icvCheckHuge( mat );
}
else if( CV_IS_IMAGE_HDR( arr ))
{
IplImage* img = (IplImage*)arr;
pix_size = ((img->depth & 255) >> 3)*img->nChannels;
min_step = img->width*pix_size;
if( step != CV_AUTOSTEP && img->height > 1 )
{
if( step < min_step && data != 0 )
CV_ERROR_FROM_CODE( CV_BadStep );
img->widthStep = step;
}
else
{
img->widthStep = min_step;
}
img->imageSize = img->widthStep * img->height;
img->imageData = img->imageDataOrigin = (char*)data;
if( (((int)(size_t)data | step) & 7) == 0 &&
cvAlign(img->width * pix_size, 8) == step )
{
img->align = 8;
}
else
{
img->align = 4;
}
}
else if( CV_IS_MATND_HDR( arr ))
{
CvMatND* mat = (CvMatND*)arr;
int i;
int64 cur_step;
if( step != CV_AUTOSTEP )
CV_ERROR( CV_BadStep,
"For multidimensional array only CV_AUTOSTEP is allowed here" );
mat->data.ptr = (uchar*)data;
cur_step = CV_ELEM_SIZE(mat->type);
for( i = mat->dims - 1; i >= 0; i-- )
{
if( cur_step > INT_MAX )
CV_ERROR( CV_StsOutOfRange, "The array is too big" );
mat->dim[i].step = (int)cur_step;
cur_step *= mat->dim[i].size;
}
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
}
// Deallocates array's data
CV_IMPL void
cvReleaseData( CvArr* arr )
{
CV_FUNCNAME( "cvReleaseData" );
__BEGIN__;
if( CV_IS_MAT_HDR( arr ) || CV_IS_MATND_HDR( arr ))
{
CvMat* mat = (CvMat*)arr;
cvDecRefData( mat );
}
else if( CV_IS_IMAGE_HDR( arr ))
{
IplImage* img = (IplImage*)arr;
if( !CvIPL.deallocate )
{
char* ptr = img->imageDataOrigin;
img->imageData = img->imageDataOrigin = 0;
cvFree( &ptr );
}
else
{
CvIPL.deallocate( img, IPL_IMAGE_DATA );
}
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
}
// Retrieves essential information about image ROI or CvMat data
CV_IMPL void
cvGetRawData( const CvArr* arr, uchar** data, int* step, CvSize* roi_size )
{
CV_FUNCNAME( "cvGetRawData" );
__BEGIN__;
if( CV_IS_MAT( arr ))
{
CvMat *mat = (CvMat*)arr;
if( step )
*step = mat->step;
if( data )
*data = mat->data.ptr;
if( roi_size )
*roi_size = cvGetMatSize( mat );
}
else if( CV_IS_IMAGE( arr ))
{
IplImage* img = (IplImage*)arr;
if( step )
*step = img->widthStep;
if( data )
CV_CALL( *data = cvPtr2D( img, 0, 0 ));
if( roi_size )
{
if( img->roi )
{
*roi_size = cvSize( img->roi->width, img->roi->height );
}
else
{
*roi_size = cvSize( img->width, img->height );
}
}
}
else if( CV_IS_MATND( arr ))
{
CvMatND* mat = (CvMatND*)arr;
if( !CV_IS_MAT_CONT( mat->type ))
CV_ERROR( CV_StsBadArg, "Only continuous nD arrays are supported here" );
if( data )
*data = mat->data.ptr;
if( roi_size || step )
{
int i, size1 = mat->dim[0].size, size2 = 1;
if( mat->dims > 2 )
for( i = 1; i < mat->dims; i++ )
size1 *= mat->dim[i].size;
else
size2 = mat->dim[1].size;
if( roi_size )
{
roi_size->width = size2;
roi_size->height = size1;
}
if( step )
*step = size1 == 1 ? 0 : mat->dim[0].step;
}
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
}
CV_IMPL int
cvGetElemType( const CvArr* arr )
{
int type = -1;
CV_FUNCNAME( "cvGetElemType" );
__BEGIN__;
if( CV_IS_MAT_HDR(arr) || CV_IS_MATND_HDR(arr) || CV_IS_SPARSE_MAT_HDR(arr))
{
type = CV_MAT_TYPE( ((CvMat*)arr)->type );
}
else if( CV_IS_IMAGE(arr))
{
IplImage* img = (IplImage*)arr;
type = CV_MAKETYPE( icvIplToCvDepth(img->depth), img->nChannels );
}
else
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
__END__;
return type;
}
// Returns a number of array dimensions
CV_IMPL int
cvGetDims( const CvArr* arr, int* sizes )
{
int dims = -1;
CV_FUNCNAME( "cvGetDims" );
__BEGIN__;
if( CV_IS_MAT_HDR( arr ))
{
CvMat* mat = (CvMat*)arr;
dims = 2;
if( sizes )
{
sizes[0] = mat->rows;
sizes[1] = mat->cols;
}
}
else if( CV_IS_IMAGE( arr ))
{
IplImage* img = (IplImage*)arr;
dims = 2;
if( sizes )
{
sizes[0] = img->height;
sizes[1] = img->width;
}
}
else if( CV_IS_MATND_HDR( arr ))
{
CvMatND* mat = (CvMatND*)arr;
dims = mat->dims;
if( sizes )
{
int i;
for( i = 0; i < dims; i++ )
sizes[i] = mat->dim[i].size;
}
}
else if( CV_IS_SPARSE_MAT_HDR( arr ))
{
CvSparseMat* mat = (CvSparseMat*)arr;
dims = mat->dims;
if( sizes )
memcpy( sizes, mat->size, dims*sizeof(sizes[0]));
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
return dims;
}
// Returns the size of particular array dimension
CV_IMPL int
cvGetDimSize( const CvArr* arr, int index )
{
int size = -1;
CV_FUNCNAME( "cvGetDimSize" );
__BEGIN__;
if( CV_IS_MAT( arr ))
{
CvMat *mat = (CvMat*)arr;
switch( index )
{
case 0:
size = mat->rows;
break;
case 1:
size = mat->cols;
break;
default:
CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
}
}
else if( CV_IS_IMAGE( arr ))
{
IplImage* img = (IplImage*)arr;
switch( index )
{
case 0:
size = !img->roi ? img->height : img->roi->height;
break;
case 1:
size = !img->roi ? img->width : img->roi->width;
break;
default:
CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
}
}
else if( CV_IS_MATND_HDR( arr ))
{
CvMatND* mat = (CvMatND*)arr;
if( (unsigned)index >= (unsigned)mat->dims )
CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
size = mat->dim[index].size;
}
else if( CV_IS_SPARSE_MAT_HDR( arr ))
{
CvSparseMat* mat = (CvSparseMat*)arr;
if( (unsigned)index >= (unsigned)mat->dims )
CV_ERROR( CV_StsOutOfRange, "bad dimension index" );
size = mat->size[index];
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
return size;
}
// Returns the size of CvMat or IplImage
CV_IMPL CvSize
cvGetSize( const CvArr* arr )
{
CvSize size = { 0, 0 };
CV_FUNCNAME( "cvGetSize" );
__BEGIN__;
if( CV_IS_MAT_HDR( arr ))
{
CvMat *mat = (CvMat*)arr;
size.width = mat->cols;
size.height = mat->rows;
}
else if( CV_IS_IMAGE_HDR( arr ))
{
IplImage* img = (IplImage*)arr;
if( img->roi )
{
size.width = img->roi->width;
size.height = img->roi->height;
}
else
{
size.width = img->width;
size.height = img->height;
}
}
else
{
CV_ERROR( CV_StsBadArg, "Array should be CvMat or IplImage" );
}
__END__;
return size;
}
// Selects sub-array (no data is copied)
CV_IMPL CvMat*
cvGetSubRect( const CvArr* arr, CvMat* submat, CvRect rect )
{
CvMat* res = 0;
CV_FUNCNAME( "cvGetRect" );
__BEGIN__;
CvMat stub, *mat = (CvMat*)arr;
if( !CV_IS_MAT( mat ))
CV_CALL( mat = cvGetMat( mat, &stub ));
if( !submat )
CV_ERROR( CV_StsNullPtr, "" );
if( (rect.x|rect.y|rect.width|rect.height) < 0 )
CV_ERROR( CV_StsBadSize, "" );
if( rect.x + rect.width > mat->cols ||
rect.y + rect.height > mat->rows )
CV_ERROR( CV_StsBadSize, "" );
{
/*
int* refcount = mat->refcount;
if( refcount )
++*refcount;
cvDecRefData( submat );
*/
submat->data.ptr = mat->data.ptr + (size_t)rect.y*mat->step +
rect.x*CV_ELEM_SIZE(mat->type);
submat->step = mat->step & (rect.height > 1 ? -1 : 0);
submat->type = (mat->type & (rect.width < mat->cols ? ~CV_MAT_CONT_FLAG : -1)) |
(submat->step == 0 ? CV_MAT_CONT_FLAG : 0);
submat->rows = rect.height;
submat->cols = rect.width;
submat->refcount = 0;
res = submat;
}
__END__;
return res;
}
// Selects array's row span.
CV_IMPL CvMat*
cvGetRows( const CvArr* arr, CvMat* submat,
int start_row, int end_row, int delta_row )
{
CvMat* res = 0;
CV_FUNCNAME( "cvGetRows" );
__BEGIN__;
CvMat stub, *mat = (CvMat*)arr;
if( !CV_IS_MAT( mat ))
CV_CALL( mat = cvGetMat( mat, &stub ));
if( !submat )
CV_ERROR( CV_StsNullPtr, "" );
if( (unsigned)start_row >= (unsigned)mat->rows ||
(unsigned)end_row > (unsigned)mat->rows || delta_row <= 0 )
CV_ERROR( CV_StsOutOfRange, "" );
{
/*
int* refcount = mat->refcount;
if( refcount )
++*refcount;
cvDecRefData( submat );
*/
if( delta_row == 1 )
{
submat->rows = end_row - start_row;
submat->step = mat->step & (submat->rows > 1 ? -1 : 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -