opencv裁剪并移植到手机实现游戏中的数字识别
前言
前段时间因为公司项目需要需要对手机游戏中的数字进行识别。项目已基本完成,在此留下自己的思路,希望能给大家借鉴下。主要内容有:
· Opencv的裁剪与移植。
· 数字提取与分割。
· 数字识别与输出。
Opencv的裁剪与移植
因为android手机上的apk包不能太大,我们整个项目的apk大小不到1M大小。我最终将opencv裁剪并实现数字识别的所有代码编译成so文件大小只有250k左右的大小。(编译成so文件android可以通过jni调用)
源码说明与裁剪
本节主要介绍OpenCV中C语言版(OpenCV2.0以下)和C++语言版(OpenCV2.2以上)各模块功能,以及构架图。
OpenCV模块
首先,我们介绍1.0至2,2版,OpenCV库划分为以下几个模块。
图1 OpenCV1.X库模块
· CV : 主要OpenCV函数,即:核心函数库
· CVAUX : 辅助函数库
· CXCORE : 数据结构与线性代数库(包含CvPoint、CvRect、CvSize、CvMat及lpiImage等常用数据结构);
· HIGHUI : GUI函数库(用户交互界面,如图像显示、接受鼠标键盘事件等。已经包含视频、摄像头简单操作);
· ML : 机器学习函数库,包含模式分类和回归分析等;
· CVCAM :视频图像处理模块(一般还需要安装DirectShow。此模块在2.0之后的版本好像不再包含,而直接使用highgui)。
在windows下较低版本(2.0以下)的OpenCV中包含此模块,一般用于处理和操作摄像头和视频流的跨平台模块,在windows下 被封装成.dll动态链接库,在Linux中被以so(共享库,和动态链接库类似)的形式使用。
然而,自从2.2版开始,OpenCV库便被划分为多个模块。这些模块编译成库文件后,位于lib文件夹中。
图2 OpenCV2.X库模块
· opencv_core模块,其中包括库中核心函数结构,特别是基础的数据结构和算术函数。
· opencv_imgproc模块,包含图像处理函数。
· opencv_highgui模块,包含读写图像及视频的函数,以及操作图形用户界面函数。
· opencv_features2d模块,包含兴趣点检测子、描述子以及兴趣点匹配框架。
· opencv_calib3d模块,包含相机标定、双目几何估算以及立体视觉函数。
· opencv_video模块,包含运动估算、特征跟踪以及前景提取函数与类。
· opencv_objdetect模块,包括物体检测函数,如脸部与行人检测。
库中还有其他的工具模块,如机器学习(opencv_ml)、计算几何(opencv_flann),第三方代码 (opencv_contrib),废弃的代码 (opencv_legacy)及GPU加速度过的代码 (opencv_gpu).这些模块都有一个单独的头文件(位于include)。
OpenCV2.X架构图
如下图所示:
参考资料
[1] Robert Laganiere ,"OpenCV 2 Computer Vision Application Programming Cookbook",Packt Publishing 2011.
源码裁剪
Cv
cv.h 图像处理函数库的声明
Cvcore
cxtypes.h Array allocation, deallocation, initialization and access to elements Mat , IplImage 等数据结构的定义
cvcore.h
数据内存分配,释放,初始化,访问等操作函数的声明 Array allocation, deallocation, initialization and access to elements
cxarray.cpp
// CvMat, CvMatND, CvSparceMat and IplImage support functions
// (creation, deletion, copying, retrieving and setting elements etc.)
cxdatastruct.cpp
Functions for manipulating memory storage - list of memory blocks
Cxcopy.cpp CV_IMPL void cvFlip( const CvArr* srcarr, CvArr* dstarr, int flip_mode ) 在saveImage中调用,还可裁剪
Highgui loadsave.cpp //加载图片Loading and saving IPL images.
Cxpersistence.cpp 很大,需裁剪 留下 cvRelease
数字提取与分割
数字提取与分割这种一般根据特定环境来分析,这里就不多介绍了
数字训练与识别
训练样本如下所示
由于bmp图片比较大,最终移植到手机上的是采用png 格式的(作为一个sdk,包还是不能太大)
识别:
设计一个好的分类器,opencv里面在机器学习那个模块已经提供了很多相关实现,k邻近,支持向量等。或者自己设计一个分类器也可以。