OpenCv矩阵操作函数源代码
/* ////////////////////////////////////////////////////////////////////
//
// CvMat, CvMatND, CvSparceMat and IplImage support functions
// (creation, deletion, copying, retrieving and setting elements etc.)
//
// */
#include "_cxcore.h"
static struct
{
Cv_iplCreateImageHeader createHeader;
Cv_iplAllocateImageData allocateData;
Cv_iplDeallocate deallocate;
Cv_iplCreateROI createROI;
Cv_iplCloneImage cloneImage;
}
CvIPL;
// Makes the library use native IPL image allocators
CV_IMPL void
cvSetIPLAllocators( Cv_iplCreateImageHeader createHeader,
Cv_iplAllocateImageData allocateData,
Cv_iplDeallocate deallocate,
Cv_iplCreateROI createROI,
Cv_iplCloneImage cloneImage )
{
CV_FUNCNAME( "cvSetIPLAllocators" );
__BEGIN__;
if( !createHeader || !allocateData || !deallocate || !createROI || !cloneImage )
{
if( createHeader || allocateData || deallocate || createROI || cloneImage ) CV_ERROR( CV_StsBadArg, "Either all the pointers should be null or "
"they all should be non-null" );
}
CvIPL.createHeader = createHeader;
CvIPL.allocateData = allocateData;
CvIPL.deallocate = deallocate;
CvIPL.createROI = createROI;
CvIPL.cloneImage = cloneImage;
__END__;
}
/****************************************************************************** **********\
* CvMat creation and basic operations *
\****************************************************************************** **********/
// Creates CvMat and underlying data
CV_IMPL CvMat*
cvCreateMat( int height, int width, int type )
{
CvMat* arr = 0;
CV_FUNCNAME( "cvCreateMat" );
__BEGIN__;
CV_CALL( arr = cvCreateMatHeader( height, width, type ));
CV_CALL( cvCreateData( arr ));
__END__;
if( cvGetErrStatus() < 0 )
cvReleaseMat( &arr );
return arr;
}
static void icvCheckHuge( CvMat* arr )
{
if( (int64)arr->step*arr->rows > INT_MAX )
arr->type &= ~CV_MA T_CONT_FLAG;
}
// Creates CvMat header only
CV_IMPL CvMat*
cvCreateMatHeader( int rows, int cols, int type )
{
CvMat* arr = 0;
CV_FUNCNAME( "cvCreateMatHeader" );
__BEGIN__;
int min_step;
type = CV_MA T_TYPE(type);
if( rows <= 0 || cols <= 0 )
CV_ERROR( CV_StsBadSize, "Non-positive width or height" );
min_step = CV_ELEM_SIZE(type)*cols;
if( min_step <= 0 )
CV_ERROR( CV_StsUnsupportedFormat, "Invalid matrix type" );
CV_CALL( arr = (CvMat*)cvAlloc( sizeof(*arr)));
arr->step = rows == 1 ? 0 : cvAlign(min_step, CV_DEFAULT_MA T_ROW_ALIGN);
arr->type = CV_MA T_MAGIC_V AL | type |
(arr->step == 0 || arr->step == min_step ? CV_MA T_CONT_FLAG : 0);
arr->rows = rows;
arr->cols = cols;
arr->data.ptr = 0;
arr->refcount = 0;
arr->hdr_refcount = 1;
icvCheckHuge( arr );
__END__;
if( cvGetErrStatus() < 0 )
cvReleaseMat( &arr );
return arr;
}
// Initializes CvMat header, allocated by the user
CV_IMPL CvMat*
cvInitMatHeader( CvMat* arr, int rows, int cols,
int type, void* data, int step )
{
CV_FUNCNAME( "cvInitMatHeader" );
__BEGIN__;
int mask, pix_size, min_step;
if( !arr )
CV_ERROR_FROM_CODE( CV_StsNullPtr );
if( (unsigned)CV_MA T_DEPTH(type) > CV_DEPTH_MAX ) CV_ERROR_FROM_CODE( CV_BadNumChannels );
if( rows <= 0 || cols <= 0 )
CV_ERROR( CV_StsBadSize, "Non-positive cols or rows" );
type = CV_MA T_TYPE( type );
arr->type = type | CV_MA T_MAGIC_V AL;
arr->rows = rows;
arr->cols = cols;
arr->data.ptr = (uchar*)data;
arr->refcount = 0;
arr->hdr_refcount = 0;
mask = (arr->rows <= 1) - 1;
pix_size = CV_ELEM_SIZE(type);
min_step = arr->cols*pix_size & mask;
if( step != CV_AUTOSTEP && step != 0 )
{
if( step < min_step )
CV_ERROR_FROM_CODE( CV_BadStep );
arr->step = step & mask;
}
else
{
arr->step = min_step;
}
arr->type = CV_MA T_MAGIC_V AL | type |
(arr->step == min_step ? CV_MA T_CONT_FLAG : 0);
icvCheckHuge( arr );
__END__;
return arr;
// Deallocates the CvMat structure and underlying data
CV_IMPL void
cvReleaseMat( CvMat** array )
{
CV_FUNCNAME( "cvReleaseMat" );
__BEGIN__;
if( !array )
CV_ERROR_FROM_CODE( CV_HeaderIsNull );
if( *array )
{
CvMat* arr = *array;
if( !CV_IS_MA T_HDR(arr) && !CV_IS_MA TND_HDR(arr) )
CV_ERROR_FROM_CODE( CV_StsBadFlag );
*array = 0;
cvDecRefData( arr );
cvFree( &arr );
}
__END__;
}
// Creates a copy of matrix
CV_IMPL CvMat*
cvCloneMat( const CvMat* src )
{
CvMat* dst = 0;
CV_FUNCNAME( "cvCloneMat" );
__BEGIN__;
if( !CV_IS_MA T_HDR( src ))
CV_ERROR( CV_StsBadArg, "Bad CvMat header" );
CV_CALL( dst = cvCreateMatHeader( src->rows, src->cols, src->type ));
if( src->data.ptr )
{
CV_CALL( cvCreateData( dst ));
CV_CALL( cvCopy( src, dst ));
}
__END__;
return dst;
}
/****************************************************************************** **********\
* CvMatND creation and basic operations *
\****************************************************************************** **********/
CV_IMPL CvMatND*
cvInitMatNDHeader( CvMatND* mat, int dims, const int* sizes,
int type, void* data )
{
CvMatND* result = 0;
CV_FUNCNAME( "cvInitMatNDHeader" );
__BEGIN__;
type = CV_MA T_TYPE(type);
int i;
int64 step = CV_ELEM_SIZE(type);
if( !mat )
CV_ERROR( CV_StsNullPtr, "NULL matrix header pointer" );
if( step == 0 )
CV_ERROR( CV_StsUnsupportedFormat, "invalid array data type" );
if( !sizes )
CV_ERROR( CV_StsNullPtr, "NULL
if( dims <= 0 || dims > CV_MAX_DIM )
CV_ERROR( CV_StsOutOfRange,
"non-positive or too large number of dimensions" );
for( i = dims - 1; i >= 0; i-- )
{
if( sizes[i] <= 0 )
CV_ERROR( CV_StsBadSize, "one of dimesion sizes is non-positive" );
mat->dim[i].size = sizes[i];
if( step > INT_MAX )
CV_ERROR( CV_StsOutOfRange, "The array is too big" );
mat->dim[i].step = (int)step;
step *= sizes[i];
}
mat->type = CV_MA TND_MAGIC_V AL | (step <= INT_MAX ? CV_MA T_CONT_FLAG : 0) | type;
mat->dims = dims;
mat->data.ptr = (uchar*)data;
mat->refcount = 0;
mat->hdr_refcount = 0;
result = mat;
__END__;
if( cvGetErrStatus() < 0 && mat )
{
mat->type = 0;
mat->data.ptr = 0;
}
return result;
}
// Creates CvMatND and underlying data
CV_IMPL CvMatND*
cvCreateMatND( int dims, const int* sizes, int type )
{
CvMatND* arr = 0;
CV_FUNCNAME( "cvCreateMatND" );
__BEGIN__;
CV_CALL( arr = cvCreateMatNDHeader( dims, sizes, type ));
CV_CALL( cvCreateData( arr ));
__END__;
if( cvGetErrStatus() < 0 )
cvReleaseMatND( &arr );
return arr;
}
// Creates CvMatND header only
CV_IMPL CvMatND*
cvCreateMatNDHeader( int dims, const int* sizes, int type )
{
CvMatND* arr = 0;
CV_FUNCNAME( "cvCreateMatNDHeader" );
__BEGIN__;
if( dims <= 0 || dims > CV_MAX_DIM )
CV_ERROR( CV_StsOutOfRange,
"non-positive or too large number of dimensions" );
CV_CALL( arr = (CvMatND*)cvAlloc( sizeof(*arr) ));
CV_CALL( cvInitMatNDHeader( arr, dims, sizes, type, 0 ));
arr->hdr_refcount = 1;
__END__;
if( cvGetErrStatus() < 0 )
cvReleaseMatND( &arr );
return arr;
}
// Creates a copy of nD array
CV_IMPL CvMatND*
cvCloneMatND( const CvMatND* src )
{
CvMatND* dst = 0;
CV_FUNCNAME( "cvCloneMatND" );
__BEGIN__;
int i, *sizes;
if( !CV_IS_MA TND_HDR( src ))
CV_ERROR( CV_StsBadArg, "Bad CvMatND header" );
sizes = (int*)alloca( src->dims*sizeof(sizes[0]) );
for( i = 0; i < src->dims; i++ )
sizes[i] = src->dim[i].size;
CV_CALL( dst = cvCreateMatNDHeader( src->dims, sizes, src->type ));
if( src->data.ptr )
{
CV_CALL( cvCreateData( dst ));
CV_CALL( cvCopy( src, dst ));
}
__END__;
return dst;
}
static CvMatND*
cvGetMatND( const CvArr* arr, CvMatND* matnd, int* coi )
{
CvMatND* result = 0;
CV_FUNCNAME( "cvGetMatND" );
__BEGIN__;
if( coi )
*coi = 0;
if( !matnd || !arr )
CV_ERROR( CV_StsNullPtr, "NULL array pointer is passed" );
if( CV_IS_MA TND_HDR(arr))
{
if( !((CvMatND*)arr)->data.ptr )
CV_ERROR( CV_StsNullPtr, "The matrix has NULL data pointer" );
result = (CvMatND*)arr;
}
else
{
CvMat stub, *mat = (CvMat*)arr;
if( CV_IS_IMAGE_HDR( mat ))
CV_CALL( mat = cvGetMat( mat, &stub, coi ));
if( !CV_IS_MA T_HDR( mat ))
CV_ERROR( CV_StsBadArg, "Unrecognized or unsupported array type" );
if( !mat->data.ptr )
CV_ERROR( CV_StsNullPtr, "Input array has NULL data pointer" );
matnd->data.ptr = mat->data.ptr;
matnd->refcount = 0;
matnd->hdr_refcount = 0;
matnd->type = mat->type;
matnd->dims = 2;
matnd->dim[0].size = mat->rows;
matnd->dim[0].step = mat->step;
matnd->dim[1].size = mat->cols;
matnd->dim[1].step = CV_ELEM_SIZE(mat->type);
result = matnd;
}
__END__;
return result;
}
// returns number of dimensions to iterate.
/*
Checks whether
that needs to have the same size, but 8uC1 or 8sC1 type).
Returns number of dimensions to iterate through:
0 means that all arrays are continuous,
1 means that all arrays are vectors of continuous arrays etc.
and the size of largest common continuous part of the arrays
*/
CV_IMPL int
cvInitNArrayIterator( int count, CvArr** arrs,
const CvArr* mask, CvMatND* stubs,
CvNArrayIterator* iterator, int flags )
{
int dims = -1;
CV_FUNCNAME( "cvInitArrayOp" );
__BEGIN__;
int i, j, size, dim0 = -1;
int64 step;
CvMatND* hdr0 = 0;
if( count < 1 || count > CV_MAX_ARR )
CV_ERROR( CV_StsOutOfRange, "Incorrect number of arrays" );
if( !arrs || !stubs )
CV_ERROR( CV_StsNullPtr, "Some of required array pointers is NULL" );
if( !iterator )
CV_ERROR( CV_StsNullPtr, "Iterator pointer is NULL" );
for( i = 0; i <= count; i++ )
{
const CvArr* arr = i < count ? arrs[i] : mask;
CvMatND* hdr;
if( !arr )
{
if( i < count )
CV_ERROR( CV_StsNullPtr, "Some of required array pointers is NULL" );
break;
}
if( CV_IS_MA TND( arr ))
hdr = (CvMatND*)arr;
else
{
int coi = 0;
CV_CALL( hdr = cvGetMatND( arr, stubs + i, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "COI set is not allowed here" );
}
iterator->hdr[i] = hdr;
if( i > 0 )
{
if( hdr->dims != hdr0->dims )
CV_ERROR( CV_StsUnmatchedSizes,
"Number of dimensions is the same for all arrays" );
if( i < count )
{
switch( flags & (CV_NO_DEPTH_CHECK|CV_NO_CN_CHECK))
{
case 0:
if( !CV_ARE_TYPES_EQ( hdr, hdr0 ))
CV_ERROR( CV_StsUnmatchedFormats,
"Data type is not the same for all arrays" );
break;
case CV_NO_DEPTH_CHECK:
if( !CV_ARE_CNS_EQ( hdr, hdr0 ))
CV_ERROR( CV_StsUnmatchedFormats,
"Number of channels is not the same for all arrays" );
break;
case CV_NO_CN_CHECK:
if( !CV_ARE_CNS_EQ( hdr, hdr0 ))
CV_ERROR( CV_StsUnmatchedFormats,
"Depth is not the same for all arrays" );
break;
}
}
else
{
if( !CV_IS_MASK_ARR( hdr ))
CV_ERROR( CV_StsBadMask, "Mask should have 8uC1 or 8sC1 data type" );
}
if( !(flags & CV_NO_SIZE_CHECK) )
{
for( j = 0; j < hdr->dims; j++ )
if( hdr->dim[j].size != hdr0->dim[j].size )
CV_ERROR( CV_StsUnmatchedSizes,
"Dimension sizes are the same for all arrays" );
}
}
else
hdr0 = hdr;
step = CV_ELEM_SIZE(hdr->type);
for( j = hdr->dims - 1; j > dim0; j-- )
{
if( step != hdr->dim[j].step )
break;
step *= hdr->dim[j].size;
}
if( j == dim0 && step > INT_MAX )
j++;
if( j > dim0 )
dim0 = j;
iterator->hdr[i] = (CvMatND*)hdr;
iterator->ptr[i] = (uchar*)hdr->data.ptr;
}
size = 1;
for( j = hdr0->dims - 1; j > dim0; j-- )
size *= hdr0->dim[j].size;
dims = dim0 + 1;
iterator->dims = dims;
iterator->count = count;
iterator->size = cvSize(size,1);
for( i = 0; i < dims; i++ )
iterator->stack[i] = hdr0->dim[i].size;
__END__;
return dims;
}
// returns zero value if iteration is finished, non-zero otherwise
CV_IMPL int cvNextNArraySlice( CvNArrayIterator* iterator )
{
assert( iterator != 0 );
int i, dims, size = 0;
for( dims = iterator->dims; dims > 0; dims-- )
{
for( i = 0; i < iterator->count; i++ )
iterator->ptr[i] += iterator->hdr[i]->dim[dims-1].step;
if( --iterator->stack[dims-1] > 0 )
break;
size = iterator->hdr[0]->dim[dims-1].size;
for( i = 0; i < iterator->count; i++ )
iterator->ptr[i] -= (size_t)size*iterator->hdr[i]->dim[dims-1].step;
iterator->stack[dims-1] = size;
}
return dims > 0;
}
/****************************************************************************** **********\
* CvSparseMat creation and basic operations *
\****************************************************************************** **********/
// Creates CvMatND and underlying data
CV_IMPL CvSparseMat*
cvCreateSparseMat( int dims, const int* sizes, int type )
{
CvSparseMat* arr = 0;
CV_FUNCNAME( "cvCreateSparseMat" );
__BEGIN__;
type = CV_MA T_TYPE( type );
int pix_size1 = CV_ELEM_SIZE1(type);
int pix_size = pix_size1*CV_MA T_CN(type);
int i, size;
CvMemStorage* storage;
if( pix_size == 0 )
CV_ERROR( CV_StsUnsupportedFormat, "invalid array data type" );
if( dims <= 0 || dims > CV_MAX_DIM_HEAP )
CV_ERROR( CV_StsOutOfRange, "bad number of dimensions" );
if( !sizes )
CV_ERROR( CV_StsNullPtr, "NULL
for( i = 0; i < dims; i++ )
{
if( sizes[i] <= 0 )
CV_ERROR( CV_StsBadSize, "one of dimesion sizes is non-positive" );
}
CV_CALL( arr = (CvSparseMat*)cvAlloc(sizeof(*arr)+MAX(0,dims-CV_MAX_DIM)*sizeof(arr->size[0])));
arr->type = CV_SPARSE_MA T_MAGIC_V AL | type;
arr->dims = dims;
arr->refcount = 0;
arr->hdr_refcount = 1;
memcpy( arr->size, sizes, dims*sizeof(sizes[0]));
arr->valoffset = (int)cvAlign(sizeof(CvSparseNode), pix_size1);
arr->idxoffset = (int)cvAlign(arr->valoffset + pix_size, sizeof(int));
size = (int)cvAlign(arr->idxoffset + dims*sizeof(int), sizeof(CvSetElem));
CV_CALL( storage = cvCreateMemStorage( CV_SPARSE_MA T_BLOCK ));
CV_CALL( arr->heap = cvCreateSet( 0, sizeof(CvSet), size, storage ));
arr->hashsize = CV_SPARSE_HASH_SIZE0;
size = arr->hashsize*sizeof(arr->hashtable[0]);
CV_CALL( arr->hashtable = (void**)cvAlloc( size ));
memset( arr->hashtable, 0, size );
__END__;
if( cvGetErrStatus() < 0 )
cvReleaseSparseMat( &arr );
return arr;
}
// Creates CvMatND and underlying data
CV_IMPL void
cvReleaseSparseMat( CvSparseMat** array )
{
CV_FUNCNAME( "cvReleaseSparseMat" );
__BEGIN__;
if( !array )
CV_ERROR_FROM_CODE( CV_HeaderIsNull );
if( *array )
{
CvSparseMat* arr = *array;
if( !CV_IS_SPARSE_MA T_HDR(arr) )
CV_ERROR_FROM_CODE( CV_StsBadFlag );
*array = 0;
cvReleaseMemStorage( &arr->heap->storage );
cvFree( &arr->hashtable );
cvFree( &arr );
}
__END__;
}
// Creates CvMatND and underlying data
CV_IMPL CvSparseMat*
cvCloneSparseMat( const CvSparseMat* src )
{
CvSparseMat* dst = 0;
CV_FUNCNAME( "cvCloneSparseMat" );
__BEGIN__;
if( !CV_IS_SPARSE_MA T_HDR(src) )
CV_ERROR( CV_StsBadArg, "Invalid sparse array header" );
CV_CALL( dst = cvCreateSparseMat( src->dims, src->size, src->type ));
CV_CALL( cvCopy( src, dst ));
__END__;
if( cvGetErrStatus() < 0 )
cvReleaseSparseMat( &dst );
return dst;
}
CvSparseNode*
cvInitSparseMatIterator( const CvSparseMat* mat, CvSparseMatIterator* iterator ) {
CvSparseNode* node = 0;
CV_FUNCNAME( "cvInitSparseMatIterator" );
__BEGIN__;
int idx;
if( !CV_IS_SPARSE_MA T( mat ))
CV_ERROR( CV_StsBadArg, "Invalid sparse matrix header" );
if( !iterator )
CV_ERROR( CV_StsNullPtr, "NULL iterator pointer" );
iterator->mat = (CvSparseMat*)mat;
iterator->node = 0;
for( idx = 0; idx < mat->hashsize; idx++ )
if( mat->hashtable[idx] )
{
node = iterator->node = (CvSparseNode*)mat->hashtable[idx];
break;
}
iterator->curidx = idx;
__END__;
return node;
}
#define ICV_SPARSE_MA T_HASH_MULTIPLIER 33
static uchar*
icvGetNodePtr( CvSparseMat* mat, const int* idx, int* _type,
int create_node, unsigned* precalc_hashval )
{
uchar* ptr = 0;
CV_FUNCNAME( "icvGetNodePtr" );
__BEGIN__;
int i, tabidx;
unsigned hashval = 0;
CvSparseNode *node;
assert( CV_IS_SPARSE_MA T( mat ));
if( !precalc_hashval )
{
for( i = 0; i < mat->dims; i++ )
{
int t = idx[i];
if( (unsigned)t >= (unsigned)mat->size[i] )
CV_ERROR( CV_StsOutOfRange, "One of indices is out of range" );
hashval = hashval*ICV_SPARSE_MA T_HASH_MULTIPLIER + t;
}
}
else
{
hashval = *precalc_hashval;
}
tabidx = hashval & (mat->hashsize - 1);
hashval &= INT_MAX;
for( node = (CvSparseNode*)mat->hashtable[tabidx];
node != 0; node = node->next )
{
if( node->hashval == hashval )
{
int* nodeidx = CV_NODE_IDX(mat,node);
for( i = 0; i < mat->dims; i++ )
if( idx[i] != nodeidx[i] )
break;
if( i == mat->dims )
{
ptr = (uchar*)CV_NODE_V AL(mat,node);
break;
}
}
}
if( !ptr && create_node )
{
if( mat->heap->active_count >= mat->hashsize*CV_SPARSE_HASH_RA TIO ) {
void** newtable;
int newsize = MAX( mat->hashsize*2, CV_SPARSE_HASH_SIZE0);
int newrawsize = newsize*sizeof(newtable[0]);
CvSparseMatIterator iterator;
assert( (newsize & (newsize - 1)) == 0 );
// resize hash table
CV_CALL( newtable = (void**)cvAlloc( newrawsize ));
memset( newtable, 0, newrawsize );
node = cvInitSparseMatIterator( mat, &iterator );
while( node )
{
CvSparseNode* next = cvGetNextSparseNode( &iterator );
int newidx = node->hashval & (newsize - 1);
node->next = (CvSparseNode*)newtable[newidx];
newtable[newidx] = node;
node = next;
}
cvFree( &mat->hashtable );
mat->hashtable = newtable;
mat->hashsize = newsize;
tabidx = hashval & (newsize - 1);
}
node = (CvSparseNode*)cvSetNew( mat->heap );
node->hashval = hashval;
node->next = (CvSparseNode*)mat->hashtable[tabidx];
mat->hashtable[tabidx] = node;
CV_MEMCPY_INT( CV_NODE_IDX(mat,node), idx, mat->dims );
ptr = (uchar*)CV_NODE_V AL(mat,node);
if( create_node > 0 )
CV_ZERO_CHAR( ptr, CV_ELEM_SIZE(mat->type));
}
if( _type )
*_type = CV_MA T_TYPE(mat->type);
__END__;
return ptr;
}
static void
icvDeleteNode( CvSparseMat* mat, const int* idx, unsigned* precalc_hashval )
{
CV_FUNCNAME( "icvDeleteNode" );
__BEGIN__;
int i, tabidx;
unsigned hashval = 0;
CvSparseNode *node, *prev = 0;
assert( CV_IS_SPARSE_MA T( mat ));
if( !precalc_hashval )
{
for( i = 0; i < mat->dims; i++ )
{
int t = idx[i];
if( (unsigned)t >= (unsigned)mat->size[i] )
CV_ERROR( CV_StsOutOfRange, "One of indices is out of range" );
hashval = hashval*ICV_SPARSE_MA T_HASH_MULTIPLIER + t;
}
}
OpenCV主要函数介绍
4.1 OpenCV主要函数介绍 1) cvLoadImage 从文件中读取图像 IplImage* cvLoadImage(const char* filename,int flags=CV_LOAD_IMAGE_COLOR ); 函数cvLoadImage从指定文件读入图像,返回读入图像的指针。其中filename是要被读入的文件的文件名;flags指定读入图像的颜色和深度。 2)cvSaveImage 保存图像到文件 int cvSaveImage( const char* filename, const CvArr* image ); 函数cvSaveImage保存图像到指定文件。其中filename保存文件名。image 要保存的图像。图像格式的的选择依赖于filename的扩展名,只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。 3)cvQueryFrame从摄像头或者文件中抓取并返回一帧 IplImage* cvQueryFrame( CvCapture* capture ); 函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。其中capture视频获取结构。。 4)cvCaptureFromCAM 初始化摄像头 CvCapture* cvCaptureFromCAM( int index ); 函数cvCaptureFromCAM给从摄像头的视频流分配和初始化CvCapture结构。 其中index要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。 5)cvHaarDetectObjects 用来检测图像中的人脸区域 CV API(CvSeq*) cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1), int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0), CvSize min_size CV_DEFAULT(cvSize(0,0)), CvSize max_size CV_DEFAULT(cvSize(0,0))); 用于快速检测人脸区域,便于提取得到人脸数据。其中image 为被检图像,cascade为 haar分类器级联的内部标识形式,storage 为用来存储检测到的一
OpenCV 2.4.4安装与配置
OpenCV 2.4.4 安装与配置 步骤一:安装OpenCV https://www.360docs.net/doc/4c18557619.html,/projects/opencvlibrary/files/opencv-win/2.4.4/ 1.从以上地址下载OpenCV 2.4.4,执行exe文件,将文件安装到所需目录。 2.建立环境变量并添加到系统路径(以将文件安装在D:\opencv为例): i) 右键点击桌面的计算机图标,选择“属性”,跳出如下窗口:
ii) 点击“高级系统设置”,跳出如下窗口:
iii) 点击“高级”选项卡下的“环境变量”,跳出如下窗口:
iv) 点击“系统变量”下的“新建”,“变量名”输入OPENCV_BUILD,“变量值”输入D:\opencv\build(如果OpenCV解压在别的目录,请输入该目录路径。比如,如果在C盘ProgramFiles文件夹建立了名为OpenCV的文件夹,并在其中解压,那么输入的目录就为 C:\ProgramFiles\OpenCV\opencv\build,总之目录一直到build文件夹),点击“确定”。 v) 双击“用户变量”中的PATH,在跳出的窗口中输入变量值为%OPENCV_BUILD%\x86\vc10\bin (如果电脑是64位系统的,请把“x86”改为“x64”;并请确保使用的是VS 2010,因为vc10 文件夹针对的是VS 2010)。
步骤二:在VS2010中配置OpenCV 1. 打开VS 2010,新建一个项目(Win32控制台或MFC 都可以)。 2. 建立Debug 属性表。 i) 点击“视图”菜单中的“属性管理器”。
Opencv文件操作与数据存储
数据存储 OpenCV提供了一种机制来序列化(serialize)和去序列化(de-serialize)其各种数据类型,可以从磁盘中按YAML或XML格式读/写。在第4章中,我们将专门介绍存储和调用常见的对象IplImages的函数(cvSaveImage()和cvLoadImage())。此外,第4章将讨论读/写视频的特有函数:可以从文件或者摄影机中读取数据的函数cvGrabFrame()以及写操作函数cvCreateVideoWriter()和cvWriteFrame()。本小节将侧重于一般对象的永久存储:读/写矩阵、OpenCV结构、配置与日志文件。 首先,我们从有效且简便的OpenCV矩阵的保存和读取功能函数开始。函数是cvSave()和cvLoad()。例3-15展示了如何保存和读取一个5×5的单位矩阵(对角线上是1,其余地方都是0)。 例3-15:存储和读取CvMat 1.CvMat A= cvMat( 5, 5, CV_32F, the_matrix_data ); 2. 3.cvSave( "my_matrix.xml", &A ); 4.. . . 5.// to load it then in some other program use … 6.CvMat* A1= (CvMat*) cvLoad( "my_matrix.xml" ); CxCore参考手册中有整节内容都在讨论数据存储。首先要知道,在OpenCV中,一般的数据存储要先创建一个CvFileStorage结构(如例3-16)所示,该结构将内存对象存储在一个树形结构中。然后通过使用 CV_STORAGE_READ参数的cvOpenFileStorage()从磁盘读取数据,创建填充该结构,也可以通过使用 CV_STORAGE_WRITE的cvOpenFileStorage()创建并打开CvFileStorage写数据,而后使用适当的数据存储函数来填充它。在磁盘上,数据的存储格式为XML或者YAML。 例3-16:CvFileStorage结构,数据通过CxCore数据存储函数访问 1.typedef struct CvFileStorage 2.{ 3.... // hidden fields 4.} CvFileStorage; CvFileStorage树内部的数据是一个层次化的数据集合,包括标量、CxCore对象(矩阵、序列和图)以及用户定义的对象。 假如有一个配置文件或日志文件。配置文件告诉我们视频有多少帧(10),画面大小(320×240)并且将应用一个3×3的色彩转换矩阵。例3-17展示了如何从磁盘中调出cfg.xml文件。 例3-17:往磁盘上写一个配置文件cfg.xml 1.CvFileStorage* fs= cvOpenFileStorage( 2."cfg.xml", 3.0, 4.CV_STORAGE_WRITE 5.); 6.cvWriteInt( fs, "frame_count", 10 ); 7.cvStartWriteStruct( fs, "frame_size", CV_NODE_SEQ ); 8.cvWriteInt( fs, 0, 320 ); 9.cvWriteInt( fs, 0, 200 ); 10.cvEndWriteStruct(fs); 11.cvWrite( fs, "color_cvt_matrix", cmatrix );
opencv函数目录-Cv图像处理
目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp
OPENCV 2.4.10安装
一、VS2020安装opencv2.4.10 1.1首先安装vs2010 安装这个就不用多谈了 1.2下载opencv- 2.4.10.exe,并解压到 最后会在 1.3添加系统变量 在系统变量path后添加:C:\opencv\opencv\build\x86\vc10\bin 1.4新建vc++控制台工程项目,配置 1.4.1项目属性->配置属性->VC++目录->包含目录 添加 C:\opencv\opencv\build\include C:\opencv\opencv\build\include\opencv C:\opencv\opencv\build\include\opencv2
1.4.2项目属性->配置属性->VC++目录->引用目录 添加 C:\opencv\opencv\build\x86\vc10\lib 1.4.3项目属性->链接器->输入->附加依赖项 在debug模式下添加 配置方案为Debug的配置,添加:(2410代表我的opencv版本是2.4.10,需要对应更改) opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib
opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_nonfree2410d.lib opencv_objdetect2410d.lib opencv_ocl2410d.lib opencv_photo2410d.lib opencv_stitching2410d.lib opencv_superres2410d.lib opencv_ts2410d.lib opencv_video2410d.lib opencv_videostab2410d.lib 配置方案为Release的配置,添加: opencv_calib3d2410.lib opencv_contrib2410.lib opencv_core2410.lib opencv_features2d2410.lib opencv_flann2410.lib opencv_gpu2410.lib opencv_highgui2410.lib opencv_imgproc2410.lib opencv_legacy2410.lib opencv_ml2410.lib opencv_nonfree2410.lib opencv_objdetect2410.lib opencv_ocl2410.lib opencv_photo2410.lib opencv_stitching2410.lib opencv_superres2410.lib opencv_ts2410.lib opencv_video2410.lib opencv_videostab2410.lib
OPENCV库函数使用说明
OPENCV(Intel Open Source Computer Vision Library)是一种数字图像处理和计算机视觉的函数库,由Intel公司微处理器实验室(Intel’s Microprocessor Research Lab)的视觉交互组(The Visual Interactivity Group)开发。它可以在Windows系统、Linux系统、MacOSx系统等操作平台上使用,也可以和其他编程工具结合,以满足不同的使用要求。使用OPENCV使用C/C++编写,包含300多个图像处理函数,有以下几个对立的子库组成: 1.CXCORE:一些基本函数(各种数据类型的基本运算等) 2.CV:图像处理和计算机视觉算法(图像处理、结构分析、运动分析、物体跟 踪和模式识别等) 3.HIGHGUI:用户交互部分(图形界面,图像视频输入输出,系统调用函数) 4.CVAUX:一些实验性的函数(三维跟踪等) 在这些库函数的支持下,用户可以直接调用滤波函数,形态学处理,图像特征提取,轮廓提取算法和跟踪算法,也可以添加自己编写的子函数,不但能完成复杂的开发任务,还可以提高效率,达到事半功倍的效果。 OPENCV的重要特性: 1.拥有包括300多个C函数的跨平台的中、高层API。它不依赖于其他的外部库——尽管也可以使用某些外部库。 2.对非商业应用和商业应用都是免费(FREE)的。 3.为Integrated Performance Primitives(IPP)提供了透明的接口。这意味着如果有为特定处理器优化的IPP库,OPENCV将在运行时自动加载这些库。 在VC++环境中OPENCV的使用设置: Microsoft公司开发的Visual C++是一种具有高度综合性能的软件开发工具。用它开发出的程序具有运行速度快,可移植能力强等优点,在对数字图像处理进行处理时经常采用Visual C++进行编程,通过对VC进行配置,就可以在编程过程中直接使用OPENCV的函数编写代码,减少了工作量,提高了运行效率。 在OPENCV安装完成后,首先需要把它的路径加入到系统环境变量中,然后再VC菜单Tools→Options→Directories下设置Library files路径,再选择Source files,最后选择Include files,就可以加入路径,如错误!未找到引用源。所示。设置完成后,就可以新建或打开一个使用OPENCV的工程。 打开工程后,选择菜单Project→Settings,然后将Setting for选为All Configurations,再选择右边的link标签,在Object/library modules加上工程属性中使用的库,这样就可以顺利编程。
vs2010下配置OpenCV
以下配置方法仅属于个人见解;若有什么不对的地方请指教啊。 在完成每一步骤后,记住点击?确定?,以确保你的设置成功。 在某些步骤中注意要在Debug 和Release 分别进行配置。 1.首先是下载VS2010并安装,这里不作赘述;(安装目录: D:\\Program Files\Microsoft Visual Studio 10.0) 2.下载并安装OpenCV,我的版本是2.1(安装目录为D:\Program Files\OpenCV2.1)注意将路径添加至Path中 3.下载并安装CMake,下载版本为Windows(Win32 Installer),安装目录为D:\Program Files\CMake 2.8 4.运行cmake-gui(D:\Program Files\CMake 2.8\bin),设置路径为OpenCV安装路径(本文档假定安装位置为:D:\Program Files\OpenCV2.1),并创建子目录D:\Program Files\OpenCV2.1\vs2010,用于存放编译结果。将数据填入指定文本框中
5.点击?Configure?,在弹出对话框中选中Visual Studio 10.0;单选框中选项选择程序默认的;然后点击Fnish;程序会自动完成 ?Configure Done?; 6.然后点击?configure?,接着点击?Generate?。程序完成?Generate Done?。 7.完成以上步骤后,将在D:\Program Files\OpenCV2.1|vs2010目录下生成OpenCV.sln的VC Solution File,接着请用vs2010打开OpenCV.sln,完成以下操作:
OPENCV函数
Opencv函数 分配图像空间: IplImage*cvCreateImage(CvSize size,int depth,int channels); size:cvSize(width,height); depth:IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U, IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32F, IPL_DEPTH_64F channels:1,2,3or4. 注意数据为交叉存取.彩色图像的数据编排为b0g0r0b1g1 r1... 举例: //分配一个单通道字节图像 IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); //分配一个三通道浮点图像 IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 释放图像空间: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); 复制图像: IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage*img2; img2=cvCloneImage(img1); 设定/获取兴趣区域: void cvSetImageROI(IplImage*image,CvRect rect); void cvResetImageROI(IplImage*image); vRect cvGetImageROI(const IplImage*image); 大部分OpenCV函数都支持ROI. 设定/获取兴趣通道: void cvSetImageCOI(IplImage*image,int coi);//0=all int cvGetImageCOI(const IplImage*image); 大部分OpenCV函数暂不支持COI.
Open CV的安装及使用说明
Open CV的安装及使用说明 ******************************************************************************* 如果不需要安装OpenCV中的(CalibFilter、ProxyTrans、SyncFilter), 则步骤为以下方式 (1)安装Open CV(这里的OpenCV版本为OpenCV_1.0); (2)点击”我的电脑”右键属性的系统环境变量,在path中添加
OPenCV3.2中Mat对象常用函数属性总结
OPenCV3.2中Mat对象常用函数属性总结Mat对象是OpenCV2.0之后引进的图像数据结构,它能自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。 在使用Mat对象时,有以下四个要点需要注意: 1、输出图像的内存是自动分配的 2、使用OpenCV的C++接口,不需要考虑内存分配问题 3、赋值操作和拷贝构造函数只会复制头部分 4、使用clone与copyTo两个函数实现数据完全复制 下面我们就具体介绍一下公共成员函数和公共属性。 公共成员函数: 1、cv::Mat::Mat ( int rows, int cols, int type ) 参数: rows2D数组中的行数 cols2D数组中的列数。 type数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
2、cv::Mat::Mat ( Size size, int type ) 参数: size 2D数组大小:Size(cols, rows)。在Size()构造函数中,行数和列数以相反的顺序排列。 type 数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。 3、cv::Mat::Mat ( int rows, int cols, int type, const Scalar & s ) 参数: rows2D数组中的行数。 cols 2D数组中的列数。 type数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。s 初始化每个矩阵元素的可选值。在构建后将所有矩阵元素设置为特定值, 使用赋值运算符Mat::operator=(const Scalar& value) 。 4、cv::Mat::Mat ( Size size, int type,
ubuntu12.04安装OpenCV2.4.1
ubuntu12.04安装OpenCV2.4。1 分类:opencv2012-06-26 14:411230人阅读评论(0)收藏举报 目录(?)[+] The Installation Procedure To install and configure OpenCV 2.4.1, complete the following steps. The commands shown in each step can be copy and pasted directly into a Linux command line. 1. R emove any installed versions of ffmpeg and x264. sudo apt-get remove ffmpeg x264 libx264-dev 2. G et all the dependencies for x264 and ffmpeg. sudo apt-get update sudo apt-get install build-essential checkinstall git cmake libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libva-dev libvdpau-dev libvorbis-dev libx11-dev libxfixes-dev libxvidcore-dev texi2html yasm zlib1g-dev 3. D ownload and install gstreamer. sudo apt-get install libgstreamer0.10-0 libgstreamer0.10-dev gstreamer0.10-tools gstreamer0.10-plugins-base libgstreamer-plugins-base0.10-dev gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-plugins-bad gstreamer0.10-ffmpeg 4. D ownload and install gtk. sudo apt-get install libgtk2.0-0 libgtk2.0-dev 5. D ownload and install libjpeg. sudo apt-get install libjpeg8 libjpeg8-dev 6. C reate a directory to hold source code.
快速学习OPENCV常用函数
访问图像元素如下: 1、针对各种图像(包括4-通道)和矩阵的函数(cvGet2D,cvSet2D),但是它们都很慢. (img->origin=IPL_ORIGIN_TL)或者是左下角(img->origin=IPL_ORIGIN_BL) 假设有8-bit1-通道的图像I(IplImage*img): I(x,y)~((uchar*)(img->imageData+img->widthStep*y))[x] 假设有8-bit3-通道的图像I(IplImage*img): I(x,y)blue~((uchar*)(img->imageData+img->widthStep*y))[x*3] I(x,y)green~((uchar*)(img->imageData+img->widthStep*y))[x*3+1] I(x,y)red~((uchar*)(img->imageData+img->widthStep*y))[x*3+2] 如果增加点(100,100)的亮度30,那么可以: CvPoint pt={100,100}; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+1]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+2]+=30; CvPoint pt={100,100}; uchar*temp_ptr=&((uchar*)(img->imageData+ img->widthStep*pt.y))[x*3]; temp_ptr[0]+=30; temp_ptr[1]+=30; temp_ptr[2]+=30; 假设有32-bit浮点数,1-通道图像I(IplImage*img): I(x,y)~((float*)(img->imageData+img->widthStep*y))[x] 现在,通用方法:假设有N-通道,类型为T的图像: I(x,y)c~((T*)(img->imageData+img->widthStep*y))[x*N+c] 或者你可使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc) I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c) 2、访问矩阵元素 设有32-bit浮点数的实数矩阵M(CvMat*mat): M(i,j)~((float*)(mat->data.ptr+mat->step*i))[j] 设有64-bit浮点数的复数矩阵M(CvMat*mat): Re M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2] Im M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2+1]
OPENCV_Mat类存取方法(元素访问)
Opencv ----Mat类 ?cv::Mat ?depth/dims/channels/step/data/elemSize Mat矩阵中数据元素的地址计算公式: addr(M i0,i1,…i m-1) = M.data + M.step[0] * i0 + M.step[1] * i1+ … + M.step[m-1] * i m-1。其中m = M.dims 是指M的维度 i.data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存(uchar* data). ii.row: 行;col:列;rows:行数;cols:列数。 iii.dims :Mat所代表的矩阵的维度,如3 * 4 的矩阵为2 维,3 * 4 * 5 的为3维. iv.channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说3 * 4 矩阵中一共12 个元素,如果每个元素有三个值,那么就说这个矩阵是3 通道的,即channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。但是opencv用imread(opencv读图的函数)读进来的图像,三通道存放顺序为B、 G、R。 v.depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个0 –6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };可见0和1都代表8位,2和3都代表16位,4和5代表32位,6代表64位; vi.step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意step1
OpenCV最基础的图像处理的例子
?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?
OPENCV下载与安装
OpenCV下载与安装 可以在https://www.360docs.net/doc/4c18557619.html,/downloads.html上下载各种版本的OpenCV的源码,Windows、Linux/Mac、iOS、Android都有相应的版本,所以OpenCV可以满足在各种操作系统下的开发,一般来说现有的无人驾驶智能车视觉信息认知计算研究团队都是在Windows和Linux平台下开发。目前OpenCV最新发布的是OpenCV3.0BETA版本(这是一个公测版本),本书所有的视觉算法是基于OpenCV2.4.3版本实现的。 OpenCV下载后安装极其简单,下面是一个以OpenCV2.4.3版本为例的具体安装过程。 OpenCV下载后是一个可执行文件(.exe文件),如OpenCV-2.4.3.exe,安装的时候只需要直接运行这个可执行文件,运行后或得到图1-4的安装路径的选择界面,安装过程实质就是一个解压过程。 图1-4OpenCV安装的路径选择 如1-4所示是将OpenCV解压在计算机的C盘,安装(解压)完成后,可以在C盘中找到一个名称为opencv的文件夹,若能找到,
说明OpenCV安装完毕。不建议将OpenCV安装在C盘中(C盘一般是系统盘),因为OpenCV解压后的文件比较大。 1.2.3环境配置 OpenCV安装完之后还需要进行环境配置才能使用,本书是以Windows7+Microsoft Visual Studio2010下OpenCV2.4.3的环境配置为案例介绍。 (1)设置OpenCV环境变量 OpenCV库函数需要通过用户环境变量调用所需要的库文件。点击:开始->计算机(右击)->属性->高级系统设置->高级->环境变量,在用户变量里新建一项: 变量名:path 变量值:C:\opencv\build\x86\vc10\bin 图1-5设置环境变量
opencv矩阵操作学习资料
o p e n c v矩阵操作
通用矩阵乘法 void cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0 ); #define cvMatMulAdd( src1, src2, src3, dst ) cvGEMM( src1, src2, 1, src3, 1, dst, 0 ) #define cvMatMul( src1, src2, dst ) cvMatMulAdd( src1, src2, 0, dst ) src1 第一输入数组 src2 第二输入数组 src3 第三输入数组 (偏移量),如果没有偏移量,可以为空( NULL)。 dst 输出数组 tABC T操作标志,可以是 0 或者下面列举的值的组合: CV_GEMM_A_T - 转置 src1 CV_GEMM_B_T - 转置 src2 CV_GEMM_C_T - 转置 src3 例如, CV_GEMM_A_T+CV_GEMM_C_T 对应 alpha*src1T*src2 + beta*src3T 函数 cvGEMM 执行通用矩阵乘法: dst = alpha*op(src1)*op(src2) + beta*op(src3), 这里 op(X) 是 X 或者 XT
所有的矩阵应该有相同的数据类型和协调的矩阵大小。支持实数浮点矩阵或者 复数浮点矩阵。 [编辑] Transform 对数组每一个元素执行矩阵变换 void cvTransform( const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL ); src 输入数组 dst 输出数组 transmat 变换矩阵 shiftvec 可选偏移向量 函数 cvTransform 对数组 src 每一个元素执行矩阵变换并将结果存储到 dst: dst(I)=transmat*src(I) + shiftvec 或者 dst(I)k=sumj(transmat(k,j)*src(I)j) + shiftvec(k) N-通道数组 src 的每一个元素都被视为一个N元向量,使用一个M×N 的变换矩阵 transmat 和偏移向量 shiftvec 把它变换到一个 M-通道的数组 dst 的 一个元素中。这里可以选择将偏移向量 shiftvec 嵌入到 transmat 中。这样
opencv最基础的图像处理
openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3
对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/