动态数组结构—内部序列函数
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 )