日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

使用Java api 和 jni混合方式调用OpenCV

發(fā)布時間:2025/7/25 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Java api 和 jni混合方式调用OpenCV 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
from: http://blog.csdn.net/lingyun_blog/article/details/50733331

int a =b;

如果想在項目中直接使用opencv的java api 并且也需要自己編寫c++,那么就需要Java Api與Jni混用,下面就以人臉檢測為例,實驗一些混合方式 一、創(chuàng)建項目 創(chuàng)建項目FaceDetection

二、添加opencv的java api 1、再項目中創(chuàng)建文件夾libopencv用來存放opencv的庫module 2、將 Android/OpenCV-android-sdk/sdk/java?復(fù)制到libopencv目錄中,并將其改名opencv ? 3、打開settings.gradle添加include?':libopencv:opencv并點擊Sync Now 4、在opencv中創(chuàng)建build.gradle文件,并將以下內(nèi)容復(fù)制進去,注意按要求替換內(nèi)容然后點擊Sync Now apply?plugin:'android-library'
buildscript{ ? ? repositories{ ? ? ? ? mavenCentral() ? ? } ? ? dependencies{ ? ? ? ? classpath?'com.android.tools.build:gradle:1.3.0'?//?和項目/build.gradle中的一致 ? ? } }
android{ ? ? compileSdkVersion?22? ? ? ? ? ?//與?app/build.gradle中的一致 ? ? buildToolsVersion?"22.0.1"? ? ? ?//與?app/build.gradle中的一致
? ? defaultConfig?{ ? ? ? ? minSdkVersion?15? ? ? ? ? ? ?//與?app/build.gradle中的一致 ? ? ? ? targetSdkVersion?22? ? ? ? ?//與?app/build.gradle中的一致 ? ? ? ? versionCode?2411? ? ? ? ? ?//改成自己下的opencv的版本 ? ? ? ? versionName?"2.4.11"? ? ? ?//改成自己下的opencv的版本 ? ? }
? ? sourceSets{ ? ? ? ? main{ ? ? ? ? ? ? manifest.srcFile?'AndroidManifest.xml' ? ? ? ? ? ? java.srcDirs?=?['src'] ? ? ? ? ? ? resources.srcDirs?=?['src'] ? ? ? ? ? ? res.srcDirs?=?['res'] ? ? ? ? ? ? aidl.srcDirs?=?['src'] ? ? ? ? } ? ? } } 5、為app添加opencv依賴,在app上右鍵 open module settings,將opencv加進去
三、添加Opencv Face Detection Jni 1、打開opencv提供的人臉識別示例,將samples/face-detectioin/src/org/opencv/samples/facedetect/DetectionBasedTracker.java文件拷貝到app中包下,注意java文件package修改成當(dāng)前的包 錯誤是因為并沒有native文件與之關(guān)聯(lián) 2、在app中創(chuàng)建autojavah.sh文件,用來創(chuàng)建jni文件夾及.h文件,內(nèi)容如下:
#!/bin/sh
export?ProjectPath=$(cd?"../$(dirname?"$1")";?pwd)
export?TargetClassName="com.lingyun.facedetection.DetectionBasedTracker"?#換成你的包名.含有native方法的類名 export?SourceFile="${ProjectPath}/app/src/main/java"? ?#java源文件目錄 export?TargetPath="${ProjectPath}/app/src/main/jni"? ? ?#輸出jni文件目錄 cd?"${SourceFile}"
javah?-d?${TargetPath}?-classpath?"${SourceFile}"?"${TargetClassName}"
echo?-d?${TargetPath}?-classpath?
"${SourceFile}"?"${TargetClassName}"
3、右鍵運行autojavah.sh文件,如果沒有插件,android Studio會提示是否下載安裝插件 此時可以看到多了jni目錄以及一個.h文件
4、將 OpenCV-android-sdk/samples/face-detection/jni中的.cpp 和.mk文件復(fù)制到j(luò)ni目錄中 修改.cpp中的include頭文件#include?<com_lingyun_facedetection_DetectionBasedTracker.h> 修改函數(shù)名為.h中的函數(shù)名,這里有6個函數(shù) 修改Android.mk文件: LOCAL_PATH?:=?$(call?my-dir) include?$(CLEAR_VARS) OPENCV_CAMERA_MODULES:=on OPENCV_INSTALL_MODULES:=off OPENCV_LIB_TYPE:=STATIC 下面一行換成自己的opencvsdk include?/Users/lichuanpeng/Documents/Program_File/Android/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk LOCAL_SRC_FILES? :=?DetectionBasedTracker_jni.cpp LOCAL_C_INCLUDES?+=?$(LOCAL_PATH) LOCAL_LDLIBS? ? ?+=?-lm?-llog LOCAL_MODULE? ? ?:=?detection_based_tracker include?$(BUILD_SHARED_LIBRARY) 修改Application.mk文件 APP_STL:=gnustl_static APP_CPPFLAGS:=-frtti?-fexceptions APP_ABI?:=?armeabi?armeabi-v7a?x86?mips APP_PLATFORM?:=?android-8
5、配置app的build.gradle 我的配置是 apply?plugin:?'com.android.application'
android?{ ? ? compileSdkVersion?22 ? ? buildToolsVersion?"22.0.1"
? ? defaultConfig?{ ? ? ? ? applicationId?"com.lingyun.facedetecttest" ? ? ? ? minSdkVersion?15 ? ? ? ? targetSdkVersion?22 ? ? ? ? versionCode?1 ? ? ? ? versionName?"1.0" ? ? ? ? ? 這是添加的
? ? ? ? ndk{ ? ? ? ? ? ? moduleName?"app" ? ? ? ? } ? ? } ? ? ? 這是添加的 ? ? sourceSets.main?{ ? ? ? ? jniLibs.srcDir?'src/main/jnilibs' ? ? ? ? jni.srcDirs?=?[]?//disable?automatic?ndk-build?call ? ? }
? ? buildTypes?{ ? ? ? ? release?{ ? ? ? ? ? ? minifyEnabled?false ? ? ? ? ? ? proguardFiles?getDefaultProguardFile('proguard-android.txt'),?'proguard-rules.pro' ? ? ? ? } ? ? }
}
dependencies?{ ? ? compile?fileTree(dir:?'libs',?include:?['*.jar']) ? ? compile?'com.android.support:appcompat-v7:22+' ? ? compile?project(':opencvlibs:opencv') }

6、新增NDK_BUILD 工具 點擊Android Studio->Preferences->External Tools 點擊+新增 新增?NDK?Build Name:?NDK?Build Group:?NDK Description:?NDK?Build Options:?全打勾 Show?in:?全打勾 Tools?Settings: Program:?NDK目錄/ndk-build Parameters:?NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk?NDK_LIBS_OUT=$ModuleFileDir$/src/main/jniLibs?NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk?APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk?V=1 Working?directory:?$SourcepathEntry$?
7、在app上右鍵點擊NDK NDK Build 可以看到多出來jniLibs目錄 8、將 OpenCV-android-sdk/sdk/native/libs??目錄里面四個文件夾中的libopencv_java.so分別對應(yīng)放在剛才生成的目錄中,因為java api需要這些。
四、添加布局文件及activity和權(quán)限 1、將 OpenCV-android-sdk/samples/face-detection/res/layout/face_detect_surface_view.xml?文件復(fù)制到app中的layout目錄中 2、在res中創(chuàng)建raw目錄,并將 OpenCV-android-sdk/samples/face-detection/res/raw/lbpcascade_frontalface.xml?文件復(fù)制到raw中 3、修改MainActivity ? ? ?

[java] view plaincopy
  • import?java.io.File;??
  • import?java.io.FileOutputStream;??
  • import?java.io.IOException;??
  • import?java.io.InputStream;??
  • ??
  • import?org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;??
  • import?org.opencv.android.OpenCVLoader;??
  • import?org.opencv.core.Core;??
  • import?org.opencv.core.Mat;??
  • import?org.opencv.core.MatOfRect;??
  • import?org.opencv.core.Rect;??
  • import?org.opencv.core.Scalar;??
  • import?org.opencv.core.Size;??
  • import?org.opencv.android.CameraBridgeViewBase;??
  • import?org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;??
  • import?org.opencv.objdetect.CascadeClassifier;??
  • ??
  • import?android.content.Context;??
  • import?android.os.Bundle;??
  • import?android.support.v7.app.AppCompatActivity;??
  • import?android.util.Log;??
  • import?android.view.Menu;??
  • import?android.view.MenuItem;??
  • import?android.view.WindowManager;??
  • import?com.lingyun.facedetection.R;??
  • ??
  • public?class?MainActivity?extends?AppCompatActivity?implements?CvCameraViewListener2{??
  • ??
  • ????private?static?final?String????TAG?????????????????=?"OCVSample::Activity";??
  • ????private?static?final?Scalar????FACE_RECT_COLOR?????=?new?Scalar(0,?255,?0,?255);??
  • ????public?static?final?int????????JAVA_DETECTOR???????=?0;??
  • ????public?static?final?int????????NATIVE_DETECTOR?????=?1;??
  • ??
  • ????private?MenuItem???????????????mItemFace50;??
  • ????private?MenuItem???????????????mItemFace40;??
  • ????private?MenuItem???????????????mItemFace30;??
  • ????private?MenuItem???????????????mItemFace20;??
  • ????private?MenuItem???????????????mItemType;??
  • ??
  • ????private?Mat????????????????????mRgba;??
  • ????private?Mat????????????????????mGray;??
  • ????private?File???????????????????mCascadeFile;??
  • ????private?CascadeClassifier??????mJavaDetector;??
  • ????private?DetectionBasedTracker??mNativeDetector;??
  • ??
  • ????private?int????????????????????mDetectorType???????=?JAVA_DETECTOR;??
  • ????private?String[]???????????????mDetectorName;??
  • ??
  • ????private?float??????????????????mRelativeFaceSize???=?0.2f;??
  • ????private?int????????????????????mAbsoluteFaceSize???=?0;??
  • ??
  • ????private?CameraBridgeViewBase???mOpenCvCameraView;??
  • ??
  • ????static?{??
  • ????????if(!OpenCVLoader.initDebug()){??
  • ????????????Log.d("MyDebug","Falied");??
  • ????????}else{??
  • ????????????Log.d("MyDebug","success");??
  • ????????????System.loadLibrary("opencv_java");??
  • ????????}??
  • ????}??
  • ??
  • ????public?void?doDetect(){??
  • ????????//?Load?native?library?after(!)?OpenCV?initialization??
  • ????????System.loadLibrary("detection_based_tracker");//??
  • ??
  • ????????try?{??
  • ????????????//?load?cascade?file?from?application?resources??
  • ????????????InputStream?is?=?getResources().openRawResource(R.raw.lbpcascade_frontalface);??
  • ????????????File?cascadeDir?=?getDir("cascade",?Context.MODE_PRIVATE);??
  • ????????????mCascadeFile?=?new?File(cascadeDir,?"lbpcascade_frontalface.xml");??
  • ????????????FileOutputStream?os?=?new?FileOutputStream(mCascadeFile);??
  • ??
  • ????????????byte[]?buffer?=?new?byte[4096];??
  • ????????????int?bytesRead;??
  • ????????????while?((bytesRead?=?is.read(buffer))?!=?-1)?{??
  • ????????????????os.write(buffer,?0,?bytesRead);??
  • ????????????}??
  • ????????????is.close();??
  • ????????????os.close();??
  • ??
  • ????????????mJavaDetector?=?new?CascadeClassifier(mCascadeFile.getAbsolutePath());??
  • ????????????if?(mJavaDetector.empty())?{??
  • ????????????????Log.e(TAG,?"Failed?to?load?cascade?classifier");??
  • ????????????????mJavaDetector?=?null;??
  • ????????????}?else??
  • ????????????????Log.i(TAG,?"Loaded?cascade?classifier?from?"?+?mCascadeFile.getAbsolutePath());??
  • ??
  • ????????????mNativeDetector?=?new?DetectionBasedTracker(mCascadeFile.getAbsolutePath(),?0);??
  • ??
  • ????????????cascadeDir.delete();??
  • ??
  • ????????}?catch?(IOException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????????Log.e(TAG,?"Failed?to?load?cascade.?Exception?thrown:?"?+?e);??
  • ????????}??
  • ??
  • ????????mOpenCvCameraView.enableView();??
  • ????}??
  • ??
  • ????public?MainActivity()?{??
  • ????????mDetectorName?=?new?String[2];??
  • ????????mDetectorName[JAVA_DETECTOR]?=?"Java";??
  • ????????mDetectorName[NATIVE_DETECTOR]?=?"Native?(tracking)";??
  • ??
  • ????????Log.i(TAG,?"Instantiated?new?"?+?this.getClass());??
  • ????}??
  • ??
  • ????/**?Called?when?the?activity?is?first?created.?*/??
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????Log.i(TAG,?"called?onCreate");??
  • ????????super.onCreate(savedInstanceState);??
  • ????????getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);??
  • ??
  • ????????setContentView(R.layout.face_detect_surface_view);??
  • ??
  • ????????mOpenCvCameraView?=?(CameraBridgeViewBase)?findViewById(R.id.fd_activity_surface_view);??
  • ????????mOpenCvCameraView.setCvCameraViewListener(this);??
  • ????????doDetect();??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?onPause()??
  • ????{??
  • ????????super.onPause();??
  • ????????if?(mOpenCvCameraView?!=?null)??
  • ????????????mOpenCvCameraView.disableView();??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?onResume()??
  • ????{??
  • ????????super.onResume();??
  • ????????//?OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3,?this,?mLoaderCallback);??
  • ????}??
  • ??
  • ????public?void?onDestroy()?{??
  • ????????super.onDestroy();??
  • ????????mOpenCvCameraView.disableView();??
  • ????}??
  • ??
  • ????public?void?onCameraViewStarted(int?width,?int?height)?{??
  • ????????mGray?=?new?Mat();??
  • ????????mRgba?=?new?Mat();??
  • ????}??
  • ??
  • ????public?void?onCameraViewStopped()?{??
  • ????????mGray.release();??
  • ????????mRgba.release();??
  • ????}??
  • ??
  • ????public?Mat?onCameraFrame(CvCameraViewFrame?inputFrame)?{??
  • ??
  • ????????mRgba?=?inputFrame.rgba();??
  • ????????mGray?=?inputFrame.gray();??
  • ??
  • ????????if?(mAbsoluteFaceSize?==?0)?{??
  • ????????????int?height?=?mGray.rows();??
  • ????????????if?(Math.round(height?*?mRelativeFaceSize)?>?0)?{??
  • ????????????????mAbsoluteFaceSize?=?Math.round(height?*?mRelativeFaceSize);??
  • ????????????}??
  • ????????????mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);??
  • ????????}??
  • ??
  • ????????MatOfRect?faces?=?new?MatOfRect();??
  • ??
  • ????????if?(mDetectorType?==?JAVA_DETECTOR)?{??
  • ????????????if?(mJavaDetector?!=?null)??
  • ????????????????mJavaDetector.detectMultiScale(mGray,?faces,?1.1,?2,?2,?//?TODO:?objdetect.CV_HAAR_SCALE_IMAGE??
  • ????????????????????????new?Size(mAbsoluteFaceSize,?mAbsoluteFaceSize),?new?Size());??
  • ????????}??
  • ????????else?if?(mDetectorType?==?NATIVE_DETECTOR)?{??
  • ????????????if?(mNativeDetector?!=?null)??
  • ????????????????mNativeDetector.detect(mGray,?faces);??
  • ????????}??
  • ????????else?{??
  • ????????????Log.e(TAG,?"Detection?method?is?not?selected!");??
  • ????????}??
  • ??
  • ????????Rect[]?facesArray?=?faces.toArray();??
  • ????????for?(int?i?=?0;?i?<?facesArray.length;?i++)??
  • ????????????Core.rectangle(mRgba,?facesArray[i].tl(),?facesArray[i].br(),?FACE_RECT_COLOR,?3);??
  • ??
  • ????????return?mRgba;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?boolean?onCreateOptionsMenu(Menu?menu)?{??
  • ????????Log.i(TAG,?"called?onCreateOptionsMenu");??
  • ????????mItemFace50?=?menu.add("Face?size?50%");??
  • ????????mItemFace40?=?menu.add("Face?size?40%");??
  • ????????mItemFace30?=?menu.add("Face?size?30%");??
  • ????????mItemFace20?=?menu.add("Face?size?20%");??
  • ????????mItemType???=?menu.add(mDetectorName[mDetectorType]);??
  • ????????return?true;??
  • ????}??
  • ??
  • ????@Override??
  • ????public?boolean?onOptionsItemSelected(MenuItem?item)?{??
  • ????????Log.i(TAG,?"called?onOptionsItemSelected;?selected?item:?"?+?item);??
  • ????????if?(item?==?mItemFace50)??
  • ????????????setMinFaceSize(0.5f);??
  • ????????else?if?(item?==?mItemFace40)??
  • ????????????setMinFaceSize(0.4f);??
  • ????????else?if?(item?==?mItemFace30)??
  • ????????????setMinFaceSize(0.3f);??
  • ????????else?if?(item?==?mItemFace20)??
  • ????????????setMinFaceSize(0.2f);??
  • ????????else?if?(item?==?mItemType)?{??
  • ????????????int?tmpDetectorType?=?(mDetectorType?+?1)?%?mDetectorName.length;??
  • ????????????item.setTitle(mDetectorName[tmpDetectorType]);??
  • ????????????setDetectorType(tmpDetectorType);??
  • ????????}??
  • ????????return?true;??
  • ????}??
  • ??
  • ????private?void?setMinFaceSize(float?faceSize)?{??
  • ????????mRelativeFaceSize?=?faceSize;??
  • ????????mAbsoluteFaceSize?=?0;??
  • ????}??
  • ??
  • ????private?void?setDetectorType(int?type)?{??
  • ????????if?(mDetectorType?!=?type)?{??
  • ????????????mDetectorType?=?type;??
  • ??
  • ????????????if?(type?==?NATIVE_DETECTOR)?{??
  • ????????????????Log.i(TAG,?"Detection?Based?Tracker?enabled");??
  • ????????????????mNativeDetector.start();??
  • ????????????}?else?{??
  • ????????????????Log.i(TAG,?"Cascade?detector?enabled");??
  • ????????????????mNativeDetector.stop();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ?????}??

  • 4、添加攝像機權(quán)限 [html] view plaincopy
  • <?xml?version="1.0"?encoding="utf-8"?>??
  • <manifest?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????package="com.lingyun.facedetection"?>??
  • ??
  • ????<application??
  • ????????android:allowBackup="true"??
  • ????????android:icon="@mipmap/ic_launcher"??
  • ????????android:label="@string/app_name"??
  • ????????android:theme="@style/AppTheme"?>??
  • ????????<activity??
  • ????????????android:name=".MainActivity"??
  • ????????????android:label="@string/app_name"?>??
  • ????????????<intent-filter>??
  • ????????????????<action?android:name="android.intent.action.MAIN"?/>??
  • ??
  • ????????????????<category?android:name="android.intent.category.LAUNCHER"?/>??
  • ????????????</intent-filter>??
  • ????????</activity>??
  • ????</application>??
  • ????<supports-screens?android:resizeable="true"??
  • ????????android:smallScreens="true"??
  • ????????android:normalScreens="true"??
  • ????????android:largeScreens="true"??
  • ????????android:anyDensity="true"?/>??
  • ??
  • ????<uses-sdk?android:minSdkVersion="8"?/>??
  • ??
  • ????<uses-permission?android:name="android.permission.CAMERA"/>??
  • ??
  • ????<uses-feature?android:name="android.hardware.camera"?android:required="false"/>??
  • ????<uses-feature?android:name="android.hardware.camera.autofocus"?android:required="false"/>??
  • ????<uses-feature?android:name="android.hardware.camera.front"?android:required="false"/>??
  • ????<uses-feature?android:name="android.hardware.camera.front.autofocus"?android:required="false"/>??
  • ??
  • </manifest>??

  • 五、調(diào)試 ? ? ?運行項目 ? ?






    總結(jié)

    以上是生活随笔為你收集整理的使用Java api 和 jni混合方式调用OpenCV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。