aihot  2017-05-12 18:32:36  OpenCV |   查看评论   
另外一个有用的数据结构是 CvSet,它是 CvGraph、SvSparseMat 和 CvSubdiv2D 的父类,其实现依赖于 CvSeq,创建一个 CvSet 和 CvSeq 类似为 cvCreateSet,添加、删除元素使用 cvSetAdd(cvSetNew 是一个 inline 版本)和 cvSetRemove(cvSetRemoveByPtr 使用指针删除),cvGetSetElem 通过一个索引获得元素,cvClearSet 清除里面的元素。CvGraph 是用来表示一个带权有向或者无向图的数据结构,用 cvCreateGraph 创建,cvGraphAdd/RemoveVxt 添加顶点(另有一个ByPtr 版本),可以用 cvGetGraphVxt 获得顶点内容,cvGraphVxtIdx 获得元素的索引,cvGraphAdd/RemoveEdge 添加/删除边(也有 ByPtr 版本),另外有搜索边的 cvFindGraphEdge 以及 ByPtr 版本。通过 cvGraphVxtDegree 获得顶点的 degree,清除一个 graph 可以用 cvClearGraph,复制用 cvCloneGraph。遍历一个 graph 可以用 CvGraphScanner 这个数据结构,使用 cvCreateGraphScanner 创建深度优先便利的 scanner(用 Release 释放),这个 scanner 可以用一个 mask 来决定哪些地方是值得停下来供程序员处理的,有了这个 scanner 后用 cvGraphNextItem 就可以迭代了。
OpenCV 里面还有不少作图函数,就是在图片上画一些简单的几何形状,比如 Line、Rectangle、Circle、Ellipse、EllipseBox、FillPoly、FillConvexPoly、PolyLine。另外为了渲染字体,有 cvInitFont,cvPutText、cvGetTextSize 供使用。另外提供了 cv 里面 contour 的绘制函数(一般使用 cvFindContours 获得等高线,然后)cvDrawContours。通过 cvInitLineIterator 可以获得一条直线(指定起点和终点)上面的那些 pixel。cvClipLine 是将一条直线用一个矩形 clip。cvEllipse2Poly 将椭圆转换成为 polyline。
另外 cxcore 里面还提供了一个一致的存储数据的方式,这是通过 XML(或者 YAML)和 CvFileStorage 结构实现的,XML 本身是一个 tree 结构的东西,每个节点用 CvFileNode 表示其类型,用 CvAttrList 表示一个对象含有的属性列表。创建/释放一个 CvFileStorage 对象用 cvOpen/ReleaseFileStorage 函数。前者创建的 CvFileStorage 可用 cvStart/EndWriteStruct 或者 cvWriteInt/String/Real/Comment/RawData 进行写入,另外有 cvWrite 适合写入 CvSeq 等对象。读取使用比较笨的就是直接 cvRead*ByName,或者 cvGetFileNodeByName,比较快的是创建 CvStringHashNode,使用它查询 cvGetFileNode,然后从 CvFileNode 里面获得数据。另外,也有类似的 cvReadInt/Real/等等,以及 cvRead。
OpenCV 提供了一个基本的 RTTI 实现,这是利用 CvTypeInfo 实现的,利用 cvTypeOf 可以获得对应的类型,如果不确定有没有某个类型,可以用 cvFindType 搜索,通过 cvRegisterType 和 cvUnregisterType 注册、注销新类型。这样我们可以直接用 cvRelease 释放某个已知类型的对象、cvClone 复制一个,cvSave 和 cvLoad 实现该对象的存储。
cxcore 里面还有一些非常有用的功能,比如 cvCheckArr 检查有没有越界或者 NaN 类型。cvKMeans2 可以进行 kmeans 聚类,cvSeqPartition 用于将序列通过一个等价函数分成等价类。另外有一些用于出错处理的函数,比如每个 OpenCV 的函数源里面写的 CV_FUNCNAME( Name ) 就是用于报告出错函数的宏,等价于声明了一个静态的字符串,常用 CV_ERROR 报错,另有 CV_CHECK 检查出错,CV_CALL 提供统一的调用 cxcore 函数方法(自动 CV_CHECK),CV_ASSERT 判断条件(和 assert 类似)。另外有 cvGetErrStatus、cvSetErrStatus,设置出错模式 cvGet/SetErrMode(分 leaf 出错就退出,parent 调用 handler 后向上 unwind,silent 不调用 handler 直接向上 unwind),产生错误 cvError,可以用 cvErrorStr 获得解释。
和 OS 相关的函数,如 cvAlloc、cvFree,计算用时的 cvGetTickCount 和 cvgetTickFrequency,编写模块用的 cvRegisterModule、cvGetModuleInfo,另外还有获得线程、以及并行运算信息的函数,这里不加叙述了。
ml 这个库的结构相对简单,实现的 ML 的算法也仅仅那么几个最经典的,并不具有很好的扩展性。几乎所有的 ml 的模型都是继承 CvStatModel 这个类(其实是一个接口),主要有 clear() 清除模型,train() 训练,predict() 预测,以及 IO 相关的 save/load() 或者 read/write()。实现的算法有朴素贝叶斯分类器 CvNormalBayesClassifier,k-近邻 CvKNearest(不知道用了 kdtree 这些结构没),支持向量机 CvSVM(不支持用户自定义的核函数似乎,可以用 k-fold 交叉验证选择参数),决策树 CART CvDTree,集成算法 AdaBoost CvBoost 以及 boosted tree CvBoostTree、随机树 CvRTree、EM 算法 CvEM(仅仅对某些特定模型可以用),神经网络(两层前馈神经网络)CvANN,感觉就是可以用来做些简单的问题,但是不要指望能用到最新的一些模型。
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自openCV简介

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]