本文講述Android NDK中使用OpenCV2.4.2的詳細過程(不使用OpenCV的java封裝)java
1. 前期準備:android
a. 下載 opencv-android-sdk,解壓;(或者能夠從OpenCV源代碼本身編譯,先設置ANDROID_NDK變量,而後使用cmake -DCMAKE_TOOLCHAIN_FILE=...,便可編譯arm平臺下的opencv庫,生成的文件同下載的android-sdk是同樣的)c++
b. 配置好Android開發環境和NDK環境;spa
2. 開始整合:.net
a. 新建android工程,聲明native方法,生成頭文件,建立cpp源文件: 圖片
#include "com_tristan_first_demo_Util.h"開發
#include <opencv2/opencv.hpp>get
#include <vector>android-sdk
using namespace std;it
using namespace cv;
JNIEXPORT void JNICALL Java_com_tristan_first_demo_Util_test
(JNIEnv *env, jclass object) {
Mat image = imread("/sdcard/lena.jpg");
if (!image.data) {
return;
}
Mat dest(image.size(), image.type());
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
for (int c = 0; c < 3; c++) {
dest.at<Vec3b>(i,j)[c] = saturate_cast<uchar>(5 * image.at<Vec3b>(i,j)[c] + 50);
}
}
}
vector<int> parameters;
parameters.push_back(CV_IMWRITE_JPEG_QUALITY);
parameters.push_back(100);
imwrite("/sdcard/out.jpg", dest, parameters);
}
這個文件的做用是讀取sdcard上的lena.jpg文件,調節對比度和亮度後輸出out.jpg文件
b. jni目錄下建立Application.mk文件:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
CPU_ABI := armeabi
c. jni目錄下建立Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE := static
# 此路徑爲android-sdk中OpenCV.mk的絕對路徑
include /Users/tristan/Tools/opencv-2.4.2-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
d. 編譯,運行,即可正常生成文件out.jpg,打開發現圖片已經處理過了
e. 上面一種方式爲靜態連接opencv,若是要動態連接的話,將OPENCV_LIB_TYPE改成shared,默認值即爲shared,不過修改發現,shared和static的處理方式是同樣的。。。都是把opencv各個模塊的一堆.a文件打到要生成的so中,囧。。。
工程示例和配置可參見opencv-android-sdk sample的tutorial-4-mixed項目