一:OpenCV概述
1.opencv相关概念
图像处理 利用计算机对图像进行分析处理,达到所需结果的技术,一般指的是数字图像处理,通过数码设备得到的数字图像是一个很大的二维数组,数组的元素叫像素,像素的值叫灰度值。主要的处理方法有去噪,增强,复原,分割,提取特征等等。
计算机视觉 是研究如何使计算机可以像人一样“看”的一门科学,属于人工智能的范畴,是用计算机来识别、追踪、测量等等收集信息的科学。
图像处理侧重于处理图像,而计算机视觉侧重于模拟人的视觉。
OpenCV 是一个基于开源的跨平台计算机视觉库,实现了许多图像处理和计算机视觉方面的通用算法,是计算机视觉领域最有力的研究工具之一
2.OpenCV的诞生
OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Mac OS、android、iOS等操作系统上。由一系列 C 函数和少量 C++ 类构成,所以它轻量级而且高效。还支持C#、Ch、ruby等语言进行编程,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是3.3 ,2017年8月3日发布。
3.OpenCV应用领域
人机互动 物体识别 图像分割 人脸识别 动作识别 运动跟踪 机器人 运动分析 机器视觉 结构分析 汽车安全驾驶 自动驾驶………………
4.opencv模块
1)-core,核心功能模块,主要包含如下的内容:
OpenCV基本数据结构(Basic Structures);
基本的C语言数据结构和操作(Basic C Structures and Operations);
动态数据结构(Dynamic Structures);
数组操作相关函数(Operations on Arrays);
绘图功能(Drawing Functions);
XML和YAML语法的支持(XML/YAML Persistence);
XML和YAML语法的支持的C语言接口(XML/YAML Persistence (C API));
聚类(Clustering);
辅助功能与系统函数和宏(Utility and System Functions and Macros);
与OpenGL的互操作(OpenGL interoperability);
2)-imgproc,是Image Processing的简写。图像处理模块,主要包含以下内容:
线性和非线性的图像滤波(Image Filtering);
图像的几何变换(Geometric Image Transformations);
图像的其他变换(Miscellaneous Image Transformations);
直方图(Histograms);
结构分析和形状描述(Structural Analysis and Shape Descriptors);
运动分析和目标跟踪(Motion Analysis and Object Tracking);
特征检测(Feature Detection);
目标检测(Object Detection);
3)-highgui,是High-level GUI and Media I/O的简写。高层用户界面模块和媒体输入/输出模块,主要包含以下内容:
用户界面(User Interface);
图片和视频的读写(Reading and Writing Images and Video);
QT新功能(Qt New Functions);
4)-features2d,是2D Features Framework的简写。二维特征框架模块,主要包含以下内容:
人脸识别
VR和AR
特征的检测和描述(Feature Detection and Description);
特征检测器的通用接口(Common Interfaces of Feature Detectors);
描述符提取器的通用接口(Common Interfaces of Descriptor Extractors);
描述符匹配器的通用接口(Common Interfaces of Descriptor Matchers);
通用描述符匹配器通用接口(Common Interfaces of Generic Descriptor Matchers);
关键点和匹配结果的绘制功能(Drawing Function of Keypoints and Matches);
目标分类(Object Categorization);
5)-flann,Clustering and Search in Multi-Dimensional Spaces,多维空间聚类和搜索模块,主要包含以下内容:
快速近视最近邻搜索(Fast Approximate Nearest Neighbor Search);
聚类(Clustering);
6)-video,是Video Analysis的简写。视频分析模块,主要包含以下内容:
运动分析和目标跟踪(Motion Analysis and Object Tracking),视频相关的,上面提到的是图片相关的;
7)-calib3d ,是Camera Calibration and 3D Reconstruction的简写。这个模块主要是相机校准和三维重建相关的内容,包括基本的多视角几何算法、单个立体摄像头标定、物体姿态估计、立体相似性算法,3D信息的重建等。
5.下载OpenCV
https://opencv.org/
6.OpenCV-android-SDK目录结构
apk OpenCV manager针对各个架构的cup的manager安装包
samples android平台下的案例源码和安装包(java调用方式的)
sdk sdk文件夹
7.Mat
Mat是OpenCV的核心数据结构,用来表示任意N维矩阵。图像是二维矩阵的一个特殊场景,所以也是使用Mat来表示的。Mat是OpenCV中用到最多的类
二:android studio下ndk OpenCV环境搭建
1,新建项目的时候注意的地方
勾选后会在build.gradlle中显示
2,修改当前model下的build.graddle文件,有注释的地方就是需要改动的地方
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.example.acer.test_2018_02_27opencv_test"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
//加入C+11的支持
cppFlags "-std=c++11 -frtti -fexceptions"
//我们的APP要支持的CPU架构
abiFilters'x86','x86_64','armeabi','arm64-v8a','armeabi-v7a','mips','mips64'
}
}
}
//加上
sourceSets{
main{
//当前这个目录下的库文件会被调用并且被打包进apk中
jniLibs.srcDirs = ['D:/opencv/OpenCV-android-sdk/sdk/native/libs'];
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
看下D:\opencv\OpenCV-android-sdk\sdk\native\libs中的文件
3,修改CMakeLists.txt文件中需要改动的地方(汉语注释就是需要改动的地方)
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#该变量为真时会创建完整版本的Makefile
set(CMAKE_VERBOSE_MAKEFILE on)
#定义变量ocvlibs使后面的命令可以使用定位具体的库文件
set(ocvlibs "D:/opencv/OpenCV-android-sdk/sdk/native/libs")
#调用头文件的具体路径
include_directories(D:/opencv/OpenCV-android-sdk/sdk/native/jni/include)
#增加我们的动态库
add_library(libopencv_java3 SHARED IMPORTED )
#建立链接
set_target_properties(libopencv_java3 PROPERTIES
IMPORTED_LOCATION
"${ocvlibs}/${ANDROID_ABI}/libopencv_java3.so")
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library增加库的链接
native-lib libopencv_java3 android log
# Links the target library to the log library
# included in the NDK.
${log-lib} )
三:简单实例