📄 cxarray.cpp
字号:
}
else
{
submat->rows = (end_row - start_row + delta_row - 1)/delta_row;
submat->step = mat->step * delta_row;
}
submat->cols = mat->cols;
submat->step &= submat->rows > 1 ? -1 : 0;
submat->data.ptr = mat->data.ptr + (size_t)start_row*mat->step;
submat->type = (mat->type | (submat->step == 0 ? CV_MAT_CONT_FLAG : 0)) &
(delta_row != 1 ? ~CV_MAT_CONT_FLAG : -1);
submat->refcount = 0;
submat->hdr_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*CV_ELEM_SIZE(mat->type);
submat->type = mat->type & (submat->step && submat->cols < mat->cols ?
~CV_MAT_CONT_FLAG : -1);
submat->refcount = 0;
submat->hdr_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;
if( submat->step )
submat->type &= ~CV_MAT_CONT_FLAG;
else
submat->type |= CV_MAT_CONT_FLAG;
submat->refcount = 0;
submat->hdr_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 );
if( (unsigned)(cn - 1) >= 4 )
CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 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_16UC1:
while( cn-- )
{
int t = cvRound( scalar->val[cn] );
((ushort*)data)[cn] = CV_CAST_16U(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 = CV_ELEM_SIZE(type);
int offset = CV_ELEM_SIZE1(depth)*12;
do
{
offset -= pix_size;
CV_MEMCPY_AUTO( (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 );
if( (unsigned)(cn - 1) >= 4 )
CV_ERROR( CV_StsOutOfRange, "The number of channels must be 1, 2, 3 or 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_16U:
while( cn-- )
scalar->val[cn] = ((ushort*)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_16U:
return *(ushort*)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_16U:
*(ushort*)data = CV_CAST_16U(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 = CV_ELEM_SIZE(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, col;
if( mat->cols == 1 )
row = idx, col = 0;
else
row = idx/mat->cols, col = idx - row*mat->cols;
ptr = mat->data.ptr + (size_t)row*mat->step + col*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 = CV_ELEM_SIZE(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 ))
{
CvSparseMat* m = (CvSparseMat*)arr;
if( m->dims == 1 )
ptr = icvGetNodePtr( (CvSparseMat*)arr, &idx, _type, 1, 0 );
else
{
int i, n = m->dims;
int* _idx = (int*)cvStackAlloc(n*sizeof(_idx[0]));
for( i = n - 1; i >= 0; i-- )
{
int t = idx / m->size[i];
_idx[i] = idx - t*m->size[i];
idx = t;
}
ptr = icvGetNodePtr( (CvSparseMat*)arr, _idx, _type, 1, 0 );
}
}
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*CV_ELEM_SIZE(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 ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -