这里简单的记录一些 OpenCV 这个库的使用。这是用 C/C++ 写的一个和 computer vision 相关的库,一共含有 5 个组件:
- CXCORE 是 OpenCV 里面使用的常用数据结构,以及处理这些数据结构的函数。
- CV 是常用的 computer vision 相关的函数,比如计算 histogram、目标检测、跟踪的程序。
- ML 是常用的 machine learning 相关的函数,如做分类的 naive Bayes、SVM 等等。
- highgui 是一些比较高层函数,主要是做用户界面。
- 另外还有一个从摄像头获取数据的 CVCAM 库,但是 1.1 里面似乎并进 highgui 了。
最新的是 1.1pre1,但是 debian 里面还是两年前的 1.0 版本的,这就需要自己编译一个了,后面有空学着 debian 的方式做个 deb 包好了。
OpenCV 的文档也算是还不错的了,除了函数的解释,部分功能还有例程、例子可以参考,这对对函数功能不是很清楚的人是非常有用的,比如我 这里不打算详细的记录 OpenCV 的每个功能,感兴趣的看文档吧。
先从 CXCORE 的基本结构讲起,OpenCV 里面提供了:
点 CvPoint(分 int 和 float 类型的,一般 int 的都没有后缀,float 会写 32f,double 是 64f;有 2D 和 3D 的版本),
大小 CvSize、
矩形 CvRect(用左下角的顶点坐标和宽、高表示)、
向量 CvScalar(4 个 double 那么大)。
更重要的就是存储矩阵用的 CvMat、CvMatND(多维矩阵,一般图片就是几个 channel,每个 channel 是一个 CvMat),稀疏矩阵 CvSparseMat。注意这里面有一个比较重要的成员,就是 int* refcount,这是允许多个“矩阵”(其实是 CvMatHeader 或者 CvMatNDHeader)对同一个矩阵进行引用,这时释放的时候涉及到矩阵元素的属主(ownership),只有当 refcount 为 0 的时候,释放的时候才会释放这些元素。数据的入口都是匿名 union,data 可以当作指针用。
图片一般存放在一个 IplImage 结构里面,这个结构里面有很多参数决定图片数据的类型,比如是 UINT8 还是 float 等。创建这些数据最基本的函数就是 cvCreate*,这是产生一个完整的结构,并