cvarray.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 2,591 行 · 第 1/5 页
SVN-BASE
2,591 行
submat->type = mat->type | (submat->step == 0 ? CV_MAT_CONT_FLAG : 0);
submat->refcount = 0;
res = submat;
}
__END__;
return res;
}
// Selects array's column span.
CV_IMPL CvMat*
cvGetCols( const CvArr* arr, CvMat* submat, int start_col, int end_col )
{
CvMat* res = 0;
CV_FUNCNAME( "cvGetCols" );
__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_col >= (unsigned)mat->cols ||
(unsigned)end_col > (unsigned)mat->cols )
CV_ERROR( CV_StsOutOfRange, "" );
{
/*
int* refcount = mat->refcount;
if( refcount )
++*refcount;
cvDecRefData( submat );
*/
submat->rows = mat->rows;
submat->cols = end_col - start_col;
submat->step = mat->step & (submat->rows > 1 ? -1 : 0);
submat->data.ptr = mat->data.ptr + (size_t)start_col*icvPixSize[CV_MAT_TYPE(mat->type)];
submat->type = mat->type & (submat->step && submat->cols < mat->cols ?
~CV_MAT_CONT_FLAG : -1);
submat->refcount = 0;
res = submat;
}
__END__;
return res;
}
// Selects array diagonal
CV_IMPL CvMat*
cvGetDiag( const CvArr* arr, CvMat* submat, int diag )
{
CvMat* res = 0;
CV_FUNCNAME( "cvGetDiag" );
__BEGIN__;
CvMat stub, *mat = (CvMat*)arr;
int len, pix_size;
if( !CV_IS_MAT( mat ))
CV_CALL( mat = cvGetMat( mat, &stub ));
if( !submat )
CV_ERROR( CV_StsNullPtr, "" );
pix_size = CV_ELEM_SIZE(mat->type);
/*{
int* refcount = mat->refcount;
if( refcount )
++*refcount;
cvDecRefData( submat );
}*/
if( diag >= 0 )
{
len = mat->cols - diag;
if( len <= 0 )
CV_ERROR( CV_StsOutOfRange, "" );
len = CV_IMIN( len, mat->rows );
submat->data.ptr = mat->data.ptr + diag*pix_size;
}
else
{
len = mat->rows + diag;
if( len <= 0 )
CV_ERROR( CV_StsOutOfRange, "" );
len = CV_IMIN( len, mat->cols );
submat->data.ptr = mat->data.ptr - diag*mat->step;
}
submat->rows = len;
submat->cols = 1;
submat->step = (mat->step + pix_size) & (submat->rows > 1 ? -1 : 0);
submat->type = mat->type & (submat->step ? ~CV_MAT_CONT_FLAG : -1);
submat->refcount = 0;
res = submat;
__END__;
return res;
}
/****************************************************************************************\
* Operations on CvScalar and accessing array elements *
\****************************************************************************************/
// Converts CvScalar to specified type
CV_IMPL void
cvScalarToRawData( const CvScalar* scalar, void* data, int type, int extend_to_12 )
{
CV_FUNCNAME( "cvScalarToRawData" );
type = CV_MAT_TYPE(type);
__BEGIN__;
int cn = CV_MAT_CN( type );
int depth = type & CV_MAT_DEPTH_MASK;
assert( scalar && data );
assert( (unsigned)(cn - 1) < 4 );
switch( depth )
{
case CV_8UC1:
while( cn-- )
{
int t = cvRound( scalar->val[cn] );
((uchar*)data)[cn] = CV_CAST_8U(t);
}
break;
case CV_8SC1:
while( cn-- )
{
int t = cvRound( scalar->val[cn] );
((char*)data)[cn] = CV_CAST_8S(t);
}
break;
case CV_16SC1:
while( cn-- )
{
int t = cvRound( scalar->val[cn] );
((short*)data)[cn] = CV_CAST_16S(t);
}
break;
case CV_32SC1:
while( cn-- )
((int*)data)[cn] = cvRound( scalar->val[cn] );
break;
case CV_32FC1:
while( cn-- )
((float*)data)[cn] = (float)(scalar->val[cn]);
break;
case CV_64FC1:
while( cn-- )
((double*)data)[cn] = (double)(scalar->val[cn]);
break;
default:
assert(0);
CV_ERROR_FROM_CODE( CV_BadDepth );
}
if( extend_to_12 )
{
int pix_size = icvPixSize[type];
int offset = icvPixSize[depth]*12;
do
{
offset -= pix_size;
memcpy( (char*)data + offset, data, pix_size );
}
while( offset > pix_size );
}
__END__;
}
// Converts data of specified type to CvScalar
CV_IMPL void
cvRawDataToScalar( const void* data, int flags, CvScalar* scalar )
{
CV_FUNCNAME( "cvRawDataToScalar" );
__BEGIN__;
int cn = CV_MAT_CN( flags );
assert( scalar && data );
assert( (unsigned)(cn - 1) < 4 );
memset( scalar->val, 0, sizeof(scalar->val));
switch( CV_MAT_DEPTH( flags ))
{
case CV_8U:
while( cn-- )
scalar->val[cn] = CV_8TO32F(((uchar*)data)[cn]);
break;
case CV_8S:
while( cn-- )
scalar->val[cn] = CV_8TO32F(((char*)data)[cn]);
break;
case CV_16S:
while( cn-- )
scalar->val[cn] = ((short*)data)[cn];
break;
case CV_32S:
while( cn-- )
scalar->val[cn] = ((int*)data)[cn];
break;
case CV_32F:
while( cn-- )
scalar->val[cn] = ((float*)data)[cn];
break;
case CV_64F:
while( cn-- )
scalar->val[cn] = ((double*)data)[cn];
break;
default:
assert(0);
CV_ERROR_FROM_CODE( CV_BadDepth );
}
__END__;
}
static double icvGetReal( const void* data, int type )
{
switch( type )
{
case CV_8U:
return *(uchar*)data;
case CV_8S:
return *(char*)data;
case CV_16S:
return *(short*)data;
case CV_32S:
return *(int*)data;
case CV_32F:
return *(float*)data;
case CV_64F:
return *(double*)data;
}
return 0;
}
static void icvSetReal( double value, const void* data, int type )
{
if( type < CV_32F )
{
int ivalue = cvRound(value);
switch( type )
{
case CV_8U:
*(uchar*)data = CV_CAST_8U(ivalue);
break;
case CV_8S:
*(char*)data = CV_CAST_8S(ivalue);
break;
case CV_16S:
*(short*)data = CV_CAST_16S(ivalue);
break;
case CV_32S:
*(int*)data = CV_CAST_32S(ivalue);
break;
}
}
else
{
switch( type )
{
case CV_32F:
*(float*)data = (float)value;
break;
case CV_64F:
*(double*)data = value;
break;
}
}
}
// Returns pointer to specified element of array (linear index is used)
CV_IMPL uchar*
cvPtr1D( const CvArr* arr, int idx, int* _type )
{
uchar* ptr = 0;
CV_FUNCNAME( "cvPtr1D" );
__BEGIN__;
if( CV_IS_MAT( arr ))
{
CvMat* mat = (CvMat*)arr;
int type = CV_MAT_TYPE(mat->type);
int pix_size = icvPixSize[type];
if( _type )
*_type = type;
// the first part is mul-free sufficient check
// that the index is within the matrix
if( (unsigned)idx >= (unsigned)(mat->rows + mat->cols - 1) &&
(unsigned)idx >= (unsigned)(mat->rows*mat->cols))
CV_ERROR( CV_StsOutOfRange, "index is out of range" );
if( CV_IS_MAT_CONT(mat->type))
{
ptr = mat->data.ptr + (size_t)idx*pix_size;
}
else
{
int row = idx/mat->cols;
ptr = mat->data.ptr + (size_t)row*mat->step + (idx - row*mat->cols)*pix_size;
}
}
else if( CV_IS_IMAGE_HDR( arr ))
{
IplImage* img = (IplImage*)arr;
int width = !img->roi ? img->width : img->roi->width;
int y = idx/width, x = idx - y*width;
ptr = cvPtr2D( arr, y, x, _type );
}
else if( CV_IS_MATND( arr ))
{
CvMatND* mat = (CvMatND*)arr;
int j, type = CV_MAT_TYPE(mat->type);
size_t size = mat->dim[0].size;
if( _type )
*_type = type;
for( j = 1; j < mat->dims; j++ )
size *= mat->dim[j].size;
if((unsigned)idx >= (unsigned)size )
CV_ERROR( CV_StsOutOfRange, "index is out of range" );
if( CV_IS_MAT_CONT(mat->type))
{
int pix_size = icvPixSize[type];
ptr = mat->data.ptr + (size_t)idx*pix_size;
}
else
{
ptr = mat->data.ptr;
for( j = mat->dims - 1; j >= 0; j-- )
{
int sz = mat->dim[j].size;
if( sz )
{
int t = idx/sz;
ptr += (idx - t*sz)*mat->dim[j].step;
idx = t;
}
}
}
}
else if( CV_IS_SPARSE_MAT( arr ))
{
ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, _type, 1 );
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
return ptr;
}
// Returns pointer to specified element of 2d array
CV_IMPL uchar*
cvPtr2D( const CvArr* arr, int y, int x, int* _type )
{
uchar* ptr = 0;
CV_FUNCNAME( "cvPtr2D" );
__BEGIN__;
if( CV_IS_MAT( arr ))
{
CvMat* mat = (CvMat*)arr;
int type;
if( (unsigned)y >= (unsigned)(mat->rows) ||
(unsigned)x >= (unsigned)(mat->cols) )
CV_ERROR( CV_StsOutOfRange, "index is out of range" );
type = CV_MAT_TYPE(mat->type);
if( _type )
*_type = type;
ptr = mat->data.ptr + (size_t)y*mat->step + x*icvPixSize[type];
}
else if( CV_IS_IMAGE( arr ))
{
IplImage* img = (IplImage*)arr;
int pix_size = (img->depth & 255) >> 3;
int width, height;
ptr = (uchar*)img->imageData;
if( img->dataOrder == 0 )
pix_size *= img->nChannels;
if( img->roi )
{
width = img->roi->width;
height = img->roi->height;
ptr += img->roi->yOffset*img->widthStep +
img->roi->xOffset*pix_size;
if( img->dataOrder )
{
int coi = img->roi->coi;
if( !coi )
CV_ERROR( CV_BadCOI,
"COI must be non-null in case of planar images" );
ptr += (coi - 1)*img->imageSize;
}
}
else
{
width = img->width;
height = img->height;
}
if( (unsigned)y >= (unsigned)height ||
(unsigned)x >= (unsigned)width )
CV_ERROR( CV_StsOutOfRange, "index is out of range" );
ptr += y*img->widthStep + x*pix_size;
if( _type )
{
int type = icvIplToCvDepth(img->depth);
if( type < 0 || (unsigned)(img->nChannels - 1) > 3 )
CV_ERROR( CV_StsUnsupportedFormat, "" );
*_type = type + (img->nChannels - 1)*8;
}
}
else if( CV_IS_MATND( arr ))
{
CvMatND* mat = (CvMatND*)arr;
if( mat->dims != 2 ||
(unsigned)y >= (unsigned)(mat->dim[0].size) ||
(unsigned)x >= (unsigned)(mat->dim[1].size) )
CV_ERROR( CV_StsOutOfRange, "index is out of range" );
ptr = mat->data.ptr + (size_t)y*mat->dim[0].step + x*mat->dim[1].step;
if( _type )
*_type = CV_MAT_TYPE(mat->type);
}
else if( CV_IS_SPARSE_MAT( arr ))
{
int idx[] = { y, x };
ptr = icvGetNodePtr( (CvSparseMat*)arr, idx, _type, 1 );
}
else
{
CV_ERROR( CV_StsBadArg, "unrecognized or unsupported array type" );
}
__END__;
return ptr;
}
// Returns pointer to specified element of 3d array
CV_IMPL uchar*
cvPtr3D( const CvArr* arr, int z, int y, int x, int* _type )
{
uchar* ptr = 0;
CV_FUNCNAME( "cvPtr3D" );
__BEGIN__;
if( CV_IS_MATND( arr ))
{
CvMatND* mat = (CvMatND*)arr;
if( mat->dims != 3 ||
(unsigned)z >= (unsigned)(mat->dim[0].size) ||
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?