opencv2.2.0源代码(include文件)分析(3)--下部分

来源:互联网 发布:足球球员数据 编辑:程序博客网 时间:2024/05/21 03:55

动态数组结构—内部序列函数

 

CVAPI(void)  cvChangeSeqBlock( void*reader, int direction );

CVAPI(void)  cvCreateSeqBlock(CvSeqWriter* writer );

 

CVAPI(CvSet*)  cvCreateSet( int set_flags, int header_size,

int elem_size,CvMemStorage* storage );//创建一个新的set

 

CVAPI(int)  cvSetAdd(CvSet* set_header, CvSetElem* elem CV_DEFAULT(NULL),CvSetElem** inserted_elemCV_DEFAULT(NULL) );//在Set中添加一个新的元素并返回指向他的指针

 

CV_INLINE  CvSetElem*cvSetNew( CvSet* set_header )

{

    CvSetElem*elem = set_header->free_elems;

    if(elem )

    {

        set_header->free_elems= elem->next_free;

        elem->flags= elem->flags & CV_SET_ELEM_IDX_MASK;

        set_header->active_count++;

    }

    else

        cvSetAdd(set_header, NULL, (CvSetElem**)&elem );

    return elem;

}

 

CV_INLINE  void cvSetRemoveByPtr(CvSet* set_header, void* elem )

{

    CvSetElem*_elem = (CvSetElem*)elem;

    assert(_elem->flags >= 0 );

    _elem->next_free= set_header->free_elems;

    _elem->flags= (_elem->flags & CV_SET_ELEM_IDX_MASK) | CV_SET_ELEM_FREE_FLAG;

    set_header->free_elems= _elem;

    set_header->active_count--;

}

 

CVAPI(void)   cvSetRemove(CvSet* set_header, int index );//通过给定索引在set中移除元素

 

CV_INLINECvSetElem* cvGetSetElem( const CvSet* set_header, int index)//返回该索引值的set的元素,如果不存在该元素,则返回NULL

{

    CvSetElem*elem = (CvSetElem*)cvGetSeqElem( (CvSeq*)set_header, index );

    return elem&& CV_IS_SET_ELEM( elem ) ? elem : 0;

}

 

CVAPI(void)  cvClearSet(CvSet* set_header );//移除Set中的所有元素

 

CVAPI(CvGraph*)  cvCreateGraph( int graph_flags, int header_size, intvtx_size, int edge_size,                              CvMemStorage*storage );//创建新图

 

CVAPI(int)  cvGraphAddVtx(CvGraph* graph, const CvGraphVtx* vtxCV_DEFAULT(NULL),                          CvGraphVtx**inserted_vtx CV_DEFAULT(NULL) );//在图中添加节点

 

 

CVAPI(int)  cvGraphRemoveVtx(CvGraph* graph, int index );

CVAPI(int)  cvGraphRemoveVtxByPtr(CvGraph* graph, CvGraphVtx* vtx );//移除图中的节点和相关的边

 

 

CVAPI(int)  cvGraphAddEdge(CvGraph*graph,                           int start_idx, int end_idx,const CvGraphEdge*edge CV_DEFAULT(NULL),CvGraphEdge** inserted_edge CV_DEFAULT(NULL) );//通过索引或者指针指向的两个节点不连接,则连接;如果连接,则返回连接两节点的边。返回1,表示创建新边;0,表示每创建。

 

CVAPI(int)  cvGraphAddEdgeByPtr(CvGraph*graph,                              CvGraphVtx*start_vtx, CvGraphVtx*end_vtx,                               const CvGraphEdge*edgeCV_DEFAULT(NULL),                               CvGraphEdge**inserted_edge CV_DEFAULT(NULL) );

 

CVAPI(void)  cvGraphRemoveEdge(CvGraph* graph, int start_idx, intend_idx );

CVAPI(void)  cvGraphRemoveEdgeByPtr(CvGraph* graph, CvGraphVtx* start_vtx,CvGraphVtx* end_vtx );//移除连接两节点的边

 

CVAPI(CvGraphEdge*)  cvFindGraphEdge( const CvGraph*graph, intstart_idx, int end_idx );

CVAPI(CvGraphEdge*)  cvFindGraphEdgeByPtr( const CvGraph*graph,constCvGraphVtx* start_vtx,const CvGraphVtx* end_vtx );//查找连接两节点的边

 

#define cvGraphFindEdgecvFindGraphEdge

#define cvGraphFindEdgeByPtrcvFindGraphEdgeByPtr

 

CVAPI(void)  cvClearGraph(CvGraph* graph );//移除图的所有节点和边

 

 

CVAPI(int)  cvGraphVtxDegree( const CvGraph*graph, int vtx_idx );//计算给定节点所有关联边数

CVAPI(int)  cvGraphVtxDegreeByPtr( const CvGraph*graph, constCvGraphVtx* vtx );

 

 

//获取给定索引的图节点

#define cvGetGraphVtx(graph, idx ) (CvGraphVtx*)cvGetSetElem((CvSet*)(graph), (idx))

 

//获取给定指针的图节点索引值

#define cvGraphVtxIdx(graph, vtx ) ((vtx)->flags & CV_SET_ELEM_IDX_MASK)

 

//获取给定指针的图边索引值

#define cvGraphEdgeIdx(graph, edge ) ((edge)->flags & CV_SET_ELEM_IDX_MASK)

#define cvGraphGetVtxCount(graph ) ((graph)->active_count)

#define cvGraphGetEdgeCount(graph ) ((graph)->edges->active_count)

 

#define  CV_GRAPH_VERTEX        1

#define  CV_GRAPH_TREE_EDGE     2

#define  CV_GRAPH_BACK_EDGE     4

#define  CV_GRAPH_FORWARD_EDGE  8

#define  CV_GRAPH_CROSS_EDGE    16

#define  CV_GRAPH_ANY_EDGE      30

#define  CV_GRAPH_NEW_TREE      32

#define  CV_GRAPH_BACKTRACKING  64

#define  CV_GRAPH_OVER          -1

 

#define  CV_GRAPH_ALL_ITEMS    -1

 

//图节点和边的标志

#define  CV_GRAPH_ITEM_VISITED_FLAG  (1<< 30)

#define  CV_IS_GRAPH_VERTEX_VISITED(vtx)\

    (((CvGraphVtx*)(vtx))->flags& CV_GRAPH_ITEM_VISITED_FLAG)

#define  CV_IS_GRAPH_EDGE_VISITED(edge)\

    (((CvGraphEdge*)(edge))->flags& CV_GRAPH_ITEM_VISITED_FLAG)

#define  CV_GRAPH_SEARCH_TREE_NODE_FLAG   (1<< 29)

#define  CV_GRAPH_FORWARD_EDGE_FLAG       (1<< 28)

 

typedef struct CvGraphScanner

{

    CvGraphVtx*vtx;      

    CvGraphVtx*dst;      

    CvGraphEdge*edge;    

 

    CvGraph*graph;       

    CvSeq*   stack;       

    int      index;       

    int      mask;        

}

CvGraphScanner;

 

CVAPI(CvGraphScanner*)  cvCreateGraphScanner(CvGraph* graph,CvGraphVtx* vtx CV_DEFAULT(NULL),int maskCV_DEFAULT(CV_GRAPH_ALL_ITEMS));//创建新的图观察器

 

CVAPI(void)cvReleaseGraphScanner( CvGraphScanner** scanner );//释放图观察器

 

CVAPI(int)  cvNextGraphItem(CvGraphScanner* scanner );//获取图的下一个元素

 

CVAPI(CvGraph*)cvCloneGraph( const CvGraph* graph, CvMemStorage* storage );//创建图拷贝

 

画图

 

画图功能只为images和matrices类型:

1,彩色图通道顺序为BGR[A]

2,反锯齿仅支持8-bit图

3,所有函数的包括颜色参数是指RGB值(满足CV_RGB)对于彩色图,亮度对于灰度图。

4,如果画图为部分或者全部在图外,则被缩短。

 

 

#define CV_RGB(r, g, b )  cvScalar( (b), (g), (r), 0 )

#define CV_FILLED-1

 

#define CV_AA16

 

CVAPI(void)  cvLine(CvArr* img, CvPoint pt1, CvPointpt2,                     CvScalarcolor, int thicknessCV_DEFAULT(1),                     int line_typeCV_DEFAULT(8), int shift CV_DEFAULT(0) );//画4连接,8连接或者包括两点的分割线段

 

CVAPI(void)  cvRectangle(CvArr* img, CvPoint pt1, CvPoint pt2,CvScalar color, int thicknessCV_DEFAULT(1),                         int line_typeCV_DEFAULT(8),int shift CV_DEFAULT(0));//画给定对角线点(pt1, pt2)的矩形,如果thickness<0(比如,thickness ==CV_FILLED),填充框

 

CVAPI(void)  cvRectangleR(CvArr* img, CvRectr,                           CvScalarcolor, int thicknessCV_DEFAULT(1),                           int line_typeCV_DEFAULT(8),int shift CV_DEFAULT(0));//画满足于CvRect结构体的矩形框

   

   

CVAPI(void)  cvCircle(CvArr* img, CvPoint center, intradius,CvScalar color, int thicknessCV_DEFAULT(1),                       int line_typeCV_DEFAULT(8), int shift CV_DEFAULT(0));//画给定半径和圆心的圆

 

CVAPI(void)  cvEllipse(CvArr* img, CvPoint center, CvSize axes,double angle, double start_angle, double end_angle,                        CvScalarcolor, int thickness CV_DEFAULT(1),int line_type CV_DEFAULT(8), int shiftCV_DEFAULT(0));//画椭圆轮廓,填充椭圆,画椭圆弧,填充椭圆扇形:由<thickness>,<start_angle>, <end_angle>参数控制。结果图的旋转,由<angle>参数控制(所有度数为弧度制)。

 

CV_INLINE  void  cvEllipseBox(CvArr* img, CvBox2D box, CvScalar color,int thicknessCV_DEFAULT(1),                              intline_typeCV_DEFAULT(8), int shift CV_DEFAULT(0) )

{

    CvSizeaxes;

    axes.width= cvRound(box.size.width*0.5);

    axes.height= cvRound(box.size.height*0.5);

 

    cvEllipse(img, cvPointFrom32f( box.center ), axes, box.angle,0, 360, color, thickness,line_type, shift );

}

 

 

CVAPI(void)  cvFillConvexPoly(CvArr* img, const CvPoint* pts, intnpts, CvScalar color,int line_typeCV_DEFAULT(8), int shift CV_DEFAULT(0));//填充凸多边形,其他多边形

 

CVAPI(void)  cvFillPoly(CvArr* img, CvPoint** pts, const int* npts,int contours,CvScalar color,int line_type CV_DEFAULT(8), intshift CV_DEFAULT(0));//填充由一个或多个任意多边形绑定的区域

 

CVAPI(void)  cvPolyLine(CvArr* img, CvPoint** pts, const int* npts,int contours,int is_closed,CvScalar color, int thickness CV_DEFAULT(1),int line_typeCV_DEFAULT(8), int shift CV_DEFAULT(0) );//画一个或多个多边形曲线

 

#define cvDrawRectcvRectangle

#define cvDrawLinecvLine

#define cvDrawCirclecvCircle

#define cvDrawEllipsecvEllipse

#define cvDrawPolyLinecvPolyLine

 

CVAPI(int)cvClipLine( CvSize img_size, CvPoint* pt1, CvPoint* pt2 );//用矩形窗口修改连接*pt1,*pt2的切割线,(0<=x<img_size.width,0<=y<img_size.height)

 

CVAPI(int)  cvInitLineIterator( const CvArr*image, CvPoint pt1, CvPoint pt2,CvLineIterator* line_iterator,  int connectivityCV_DEFAULT(8),int left_to_right CV_DEFAULT(0));//初始化线性迭代器,line_iterator->ptr指向图像中的pt1(或者pt2,详细查看left_to_right描述器)。返回介于结束顶点线上的像素数目。

 

//移动迭代器转向另一个线性点

#define CV_NEXT_LINE_POINT(line_iterator)                     \

{                                                               \

    int _line_iterator_mask= (line_iterator).err < 0 ? -1 : 0; \

    (line_iterator).err+= (line_iterator).minus_delta +        \

        ((line_iterator).plus_delta& _line_iterator_mask);     \

    (line_iterator).ptr+= (line_iterator).minus_step +         \

        ((line_iterator).plus_step& _line_iterator_mask);      \

}

 

 

//基本字体类型

#define CV_FONT_HERSHEY_SIMPLEX         0

#define CV_FONT_HERSHEY_PLAIN           1

#define CV_FONT_HERSHEY_DUPLEX          2

#define CV_FONT_HERSHEY_COMPLEX         3

#define CV_FONT_HERSHEY_TRIPLEX         4

#define CV_FONT_HERSHEY_COMPLEX_SMALL   5

#define CV_FONT_HERSHEY_SCRIPT_SIMPLEX  6

#define CV_FONT_HERSHEY_SCRIPT_COMPLEX  7

 

//字体标志

#define CV_FONT_ITALIC                 16

 

#define CV_FONT_VECTOR0    CV_FONT_HERSHEY_SIMPLEX

 

 

//字体结构

typedef struct CvFont

{

     const char*nameFont;        //Qt:nameFont

     CvScalarcolor;                   //Qt:ColorFont-> cvScalar(blue_component, green_component, red\_component[,alpha_component])

    int         font_face;        //Qt:bool italic        

    const int*  ascii;           

    const int*  greek;

    const int*  cyrillic;

    float       hscale,vscale;

    float       shear;           

    int         thickness;        //Qt:weight              

    float       dx;              

    int         line_type;        //Qt:PointSize

}

CvFont;

 

CVAPI(void)  cvInitFont(CvFont* font, int font_face,                         double hscale, double vscale,double shearCV_DEFAULT(0),                         int thicknessCV_DEFAULT(1),int line_type CV_DEFAULT(8));// 初始化字体结构用在将来的cvPutText

 

CV_INLINECvFont cvFont( double scale, int thickness CV_DEFAULT(1) )

{

    CvFontfont;

    cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, scale, scale, 0, thickness, CV_AA );

    return font;

}

 

 

CVAPI(void)  cvPutText(CvArr* img, const char* text, CvPoint org,const CvFont* font,CvScalar color );//将特殊的字体和颜色写在特殊的位置上

 

 

CVAPI(void)  cvGetTextSize( const char*text_string, const CvFont* font,CvSize* text_size, int* baseline);//计算文字流的绑定框,用于文字位置校正

 

 

 

 

CVAPI(CvScalar)  cvColorToScalar( double packed_color, int arrtype);//

 

CVAPI(int)cvEllipse2Poly( CvPoint center, CvSizeaxes,        intangle, int arc_start, int arc_end,CvPoint * pts, int delta );//返回构成椭圆的多边形。Axes在center旋转angle后的box定义为椭圆。椭圆的轴长,由arc_start,arc_end决定;角度为0°到360°。参数pts必须足够大,以满足结果需求;返回存储在pts的点总数。

 

CVAPI(void)  cvDrawContours(CvArr *img, CvSeq*contour,                             CvScalarexternal_color, CvScalarhole_color,                             int max_level, int thicknessCV_DEFAULT(1),                             int line_typeCV_DEFAULT(8),CvPoint offset CV_DEFAULT(cvPoint(0,0)));//画填充图像内部区域轮廓

 

 

CVAPI(void)cvLUT( const CvArr* src, CvArr* dst, const CvArr* lut );//

 

画图---通过序列树进行迭代

 

typedef struct CvTreeNodeIterator

{

    const void*node;

    int level;

    int max_level;

}

CvTreeNodeIterator;

 

CVAPI(void)cvInitTreeNodeIterator( CvTreeNodeIterator* tree_iterator,const void*first, int max_level );

CVAPI(void*)cvNextTreeNode( CvTreeNodeIterator* tree_iterator );

CVAPI(void*)cvPrevTreeNode( CvTreeNodeIterator* tree_iterator );

 

CVAPI(void)cvInsertNodeIntoTree( void* node, void* parent, void* frame );//将特定的父序列插入树。如果parent和frame相等,则contour空指针指向parent

 

CVAPI(void)cvRemoveNodeFromTree( void* node, void* frame );//移除树中连接contour及其孩子

 

 

CVAPI(CvSeq*)cvTreeToNodeSeq( const void* first, intheader_size,CvMemStorage*storage );//将指针指向所有序列,从<first>开始,到独立一个序列

 

#define CV_KMEANS_USE_INITIAL_LABELS    1

CVAPI(int)cvKMeans2( const CvArr* samples, int cluster_count, CvArr*labels, CvTermCriteria termcrit, int attempts CV_DEFAULT(1),CvRNG*rng CV_DEFAULT(0), int flags CV_DEFAULT(0),CvArr* _centersCV_DEFAULT(0), double* compactness CV_DEFAULT(0) );//K-聚类算法,将一系列例子向量,聚类成特殊数目的类

 

系统函数

 

 

CVAPI(int)  cvRegisterModule( const CvModuleInfo*module_info ); //添加连接原始IPP列表的信息的函数指针列表,

 

 

CVAPI(int)  cvUseOptimized( int on_off);//载入连接IPP,MKL等的优化函数,或者转向纯C代码

 

 

CVAPI(void)  cvGetModuleInfo( const char*module_name,                              const char**version,const char** loaded_addon_plugins );//获取registered modules和载入优化接口的信息

 

typedef void*(CV_CDECL *CvAllocFunc)(size_t size, void* userdata);

typedef int (CV_CDECL*CvFreeFunc)(void* pptr, void* userdata);

 

 

CVAPI(void)cvSetMemoryManager( CvAllocFunc alloc_func CV_DEFAULT(NULL),CvFreeFuncfree_funcCV_DEFAULT(NULL),                               void*userdata CV_DEFAULT(NULL));//设置用户自定义内存配置函数(替代malloc和free),用cvAlloc,cvFree和更高一级的函数(比如cvCreateImage)回调

 

 

typedef IplImage*(CV_STDCALL* Cv_iplCreateImageHeader)

                           (int,int,int,char*,char*,int,int,int,int,int,

                            IplROI*,IplImage*,void*,IplTileInfo*);

typedef void (CV_STDCALL*Cv_iplAllocateImageData)(IplImage*,int,int);

typedef void (CV_STDCALL*Cv_iplDeallocate)(IplImage*,int);

typedef IplROI*(CV_STDCALL* Cv_iplCreateROI)(int,int,int,int,int);

typedef IplImage*(CV_STDCALL* Cv_iplCloneImage)(const IplImage*);

 

 

CVAPI(void)cvSetIPLAllocators( Cv_iplCreateImageHeadercreate_header,Cv_iplAllocateImageDataallocate_data,                               Cv_iplDeallocatedeallocate, Cv_iplCreateROIcreate_roi,                               Cv_iplCloneImageclone_image );//确保OpenCV中IplImage分配和十分使用IPL函数

 

#define CV_TURN_ON_IPL_COMPATIBILITY()                                  \

    cvSetIPLAllocators(iplCreateImageHeader,iplAllocateImage,         \

                        iplDeallocate,iplCreateROI, iplCloneImage )

 

0 0