1. 程式人生 > >王學崗NDK系列(七)OpenCV概述及android studio下ndk OpenCV環境搭建+簡單例項

王學崗NDK系列(七)OpenCV概述及android studio下ndk OpenCV環境搭建+簡單例項

一: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} )

三:簡單例項