OpenCv矩阵操作函数源代码

OpenCv矩阵操作函数源代码
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 pointer" );

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 arrays have equal type, sizes (mask is optional array

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 pointer" );

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中添加\bin路径,例如: D:\OpenCV\bin; (3)打开\_make\opencv.dsw,选择菜单Build->Batch Build->Build; ******************************************************************************* 如果需要安装OpenCV中的(CalibFilter、ProxyTrans、SyncFilter),则 步骤为以下方式 (1)安装SDK(注意:2004年下半年及2005以后的版本都不包括directshow), 安装目录为:D:\ DXSDK; (2)安装Open CV(这里的OpenCV版本为OpenCV_1.0); (3)点击”我的电脑”右键属性的系统环境变量,在path中添加\bin路径,例如: D:\OpenCV\bin; (4)编译D:\DXSDK\Samples\C++\DirectShow\BaseClasses,编译建立Release和Debug版本, 将产生的库strmbase.lib和strmbasd.lib拷贝到目录\lib下,在Developer Studio的Tools->Options->Directories->Include files中添加如下路径:\include \samples\C++\DirectShow\BaseClasses 另外在Tools->Options->Directories->Library files中添加如下路径: \lib; (5)打开\_make\opencv.dsw,选择菜单Build->Batch Build->Build,又打开 \_make\opencv_directshow.dsw,选择菜单Build->Batch Build->Build; ******************************************************************************* 注意:在编译opencv.dsw有错误 错误的地方是"foreground_regions"问题。打开"Edit"->"Find In Files"->"In folder"选择"D:\OpenCV",找foreground_regions。在"Find in Files"底下我们点击"CvSeq* foreground_regions /*foreground object contours*/",找到 CvMemStorage* storage; /*storage for 揻oreground_regions?/ CvSeq* foreground_regions /*foreground object contours*/ 问题就出在 CvMemStorage* storage; /*storage for 揻oreground_regions?/, 改为 "CvMemStorage* storage; /*storage for 揻oreground_regions*/" 即可。 *******************************************************************************

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函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.360docs.net/doc/4c18557619.html,/technology/computing/opencv/?软件下载: https://www.360docs.net/doc/4c18557619.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

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)*/

相关文档
最新文档