1. 介绍
主要介绍通过https://github.com/opencv/opencv/releases 下载的 SDK的目录结构。
基于当前最新opencv-4.6.0-android-sdk
版进行的介绍。
2. SDK
主要介绍大功能和目录,一些Android Studio或者配置文件就不进行介绍了。
当我们解押SDK压缩包后,通常会见到两个目录:
- samples :官方实例,各种功能模块的Demo,让我们可以了解相关API和功能的实现。
- sdk:openCV 核心SDK,我们主要通过该SDK来使用OpenCV 提供的功能。
2.1 samples 目录
OpenCV 提供的官方实例,每个独立的module模块代表了openCV的一种使用场景。我们可以通过导入到Android Studio中进行编译成App了解具体的功能作用。
- 15-puzzle:15个拼图实例,展示了如何通过OpenCV来实现一个简单的游戏。主要就是Imgproc绘制线条,文字以及响应触摸。
- camera-calibration:摄像机校准实例,通过calibrate(校准),设置calibration(标定),undistortion(不失真),comparison(比较)类型,实现摄像头的校准。
- color-blob-detection:斑点检测实例(色斑识别),介绍了选择一个色块后(触摸)然后openCV就会查找图片中对应颜色的轮廓,并用红色的细线进行框出。
- face-detection:人脸识别实例,识别摄像头中的人脸,并用矩形框标注。(精度并不是很好)
- image-manipulations:图像操作实例,例如:hist,canny,sobel,transform,resize,rectangle,canvertScaleAbs,cvtColor等api的使用。(上面api都是通过Core 或 Imgproc类进行调用)
- tutorial-1-camerapreview:相机预览实例,介绍了如何使用OpenCV实现相机调用和预览显示。
- turorial-2-mixedprocessing:混合处理实例,介绍了使用 Java 和 C 调用 OpenCV 来预处理相机预览帧的方法。
- tutorial-3-cameracontrol:摄像头控制实例,介绍了基于OpenCV实现摄像头的基本操作,可以更改相机预览分辨率,调用相机内置效果,拍摄和保存图片,等一些相机的操作。
都是一些实例Demo。我们可以通过上面的例子了解一下。
2.2 sdk 目录
整个库最重要的内容就是sdk库了。
- etc:各类模型文件存储地址,我们编译时不会编译到app中
- haarcascades:人脸检测的模型数据,harr特征训练的文件。
- lbpcascades:人脸检测的模型数据,lbp特征训练的文件。
- licenses:存放opencv的各种开源许可证,包括开源项目的版权声明,使用条件,免责声明等等。
- valgrind.supp:Valgrind内存泄漏检测工具配置文件。(我们使用SDK时并不会用上)
- valgrind_3rdparty.supp:针对3rdparty模块的内存泄漏检测工具配置文件。(我们使用SDK时并不会用上)
- java java版本api信息
- android:一些基于Android的配置,例如自定义JavaCamera2View,Util工具(Bitmap与mat互转),OpenCVLoader(so库初始化等等)
- calib3d:这个模块主要是相机定标校准和三维重建,立体视觉等功能。
- core:该模块包含 OpenCV 库的基础结构以及基本操作。例如Mat,Core(基础运算操作),MatOfPoint,Rect2d,Size类等。
- dnn:主要是深度神经网络模块。包括构建神经网络,加载序列化网络模型等。
- engine:主要是处理dnn的引擎映射(现在只是一个aidl接口)
- features2d:这个模块包含用于检测、描述以及匹配特征点的算法。也就是物体的2D特征。
- imgcodecs:这个模块主要包括各种图形的读写操作。
- imgproc:图像处理模块包含基本的图像转换,包括滤波以及类似的卷积操作。
- ml:主要是机器学习算法的实现,并且这些算法都能和 OpenCV 的数据类型自然交互。是一些视觉中最常用的传统机器学习算法
- objdetect:这个模块包含检测特定目标,比如人脸或者行人的算法。也可以训练检测器并用来检测其他物体。
- osgi:主要是加载OpenCV native库的。
- photo:这是一个相当新的模块,包含计算摄影学的一些函数工具。现在主要是处理图像修复和降噪等。
- utils:Converters 工具类,主要处理各类数据(Byte,Point,RotatedRect,MatOfByte,Double)添加到Mat中。或者多Mat合成一个Mat等。
- video:主要是对视频进行分析处理处理,例如运动估计,背景分离,对象跟踪等视频处理。
- videoio:主要包括视频的读写操作。
- javadoc :java API 帮助文档
- src/org.opencv 关键目录
- libcxx_helper :主要编译打包libc _shared.so 这个库。
- native 原生代码
- abi-xxxx:各类环境的cmake编译脚本。
- include:对应的java的代码,java代码对应的jni实现 (更多的在java层进行了介绍。这里再加上一些java层没有的包)
- flann:这个模块是高维的近似近邻快速搜索算法库,主要包含快速近似最近邻搜索与聚类等。
- gapi:在加速常规的图像处理,这个模块主要充当框架而不是某些特定的计算机视觉算法。
- highgui:高层GUI图形用户界面,包含创建和操作显示图像的窗口、处理鼠标事件以及键盘命令、提供图形交互可视化界面等等。
- 3rdparty:第三方库(OpenCV中使用的其他第三方库的静态库)
- jni:opencv jni层
- libs:存放各种cpu类型的编译后的libopencv_java4.so动态库
- staticlibs:存储各类静态库 libopencv_xxx.a文件
大概的目录结构就是这样的了。
而我们普通使用OpenCV的话,接触更多的应该是Core
类,Mat
类和Imgproc
类吧。
OpenCV 在更新迭代过程中,目录结构也随时会发生变化。可能会有新增或者减少。当弄明白了大部分的目录结构,新增或者减少的部分,对我们影响并不大。