範例load image from resource (raw)
1. create new project(OpenCVLibTest)| Blank Activity| OpenCVLib
Application name: OpenCVLibTest
Activity: OpenCVLib
2. import openCVLib300.lib
3. create raw folder in android studio| res
4. copy image from your folder (ctrl+c) and paste on android studio| res|raw (ctrl+v)
5. remove TextView
6. add ImageView
layout:width | match parent |
layout:height | match parent |
id | igv |
7. add member data in OpenCVLibActivity class
ImageView mIgv;
Mat srcBGR, srcRGBA;
8. add code in onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_open_cvlib);
mIgv = (ImageView) findViewById(R.id.igv);
// you cannot use any opencv - related code, until the manager finished loading.
try {
srcBGR = Utils.loadResource(OpenCVLibActivity.this, R.raw.anderson);
} catch (IOException e) {
e.printStackTrace();
}
srcRGBA = new Mat(); //RGBA format
Imgproc.cvtColor(srcBGR, srcRGBA, Imgproc.COLOR_BGR2RGBA);
Bitmap bm = Bitmap.createBitmap(srcRGBA.cols(), srcRGBA.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(srcRGBA, bm);
mIgv.setImageBitmap(bm);
}
9. build and run
error message:
09-18 22:19:25.537 28692-28692/com.example.home.opencvlibtest I/art﹕ Late-enabling -Xcheck:jni
09-18 22:19:25.716 28692-28692/com.example.home.opencvlibtest V/Monotype﹕ SetAppTypeFace- try to flip, app = com.example.home.opencvlibtest
09-18 22:19:25.716 28692-28692/com.example.home.opencvlibtest V/Monotype﹕ Typeface getFontPathFlipFont - systemFont = default
09-18 22:19:25.736 28692-28692/com.example.home.opencvlibtest V/Monotype﹕ SetAppTypeFace- try to flip, app = com.example.home.opencvlibtest
09-18 22:19:25.737 28692-28692/com.example.home.opencvlibtest V/Monotype﹕ Typeface getFontPathFlipFont - systemFont = default
09-18 22:19:25.816 28692-28692/com.example.home.opencvlibtest E/art﹕ No implementation found for long org.opencv.core.Mat.n_Mat(int, int, int) (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__III)
09-18 22:19:25.817 28692-28692/com.example.home.opencvlibtest D/AndroidRuntime﹕ Shutting down VM
09-18 22:19:25.817 28692-28692/com.example.home.opencvlibtest E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.home.opencvlibtest, PID: 28692
java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat(int, int, int) (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__III)
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.
at org.opencv.android.Utils.loadResource(Utils.java:66)
at org.opencv.android.Utils.loadResource(Utils.java:51)
at com.example.home.opencvlibtest.OpenCVLibActivity.onCreate(OpenCVLibActivity.java:48)
at android.app.Activity.performCreate(Activity.java:6018)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2273)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2380)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
10. google 一下
http://stackoverflow.com/questions/17860472/android-opencv-utils-bitmaptomat-crashes
you cannot use any opencv - related code, until the manager finished loading
代表onCreate()中的opencv manager還沒有載入,就使用opencv function.
11. 修改code
remove code from onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_open_cvlib);
mIgv = (ImageView) findViewById(R.id.igv);
// you cannot use any opencv - related code, until the manager finished loading.
}
add code in onManagerConnected()
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
try {
srcBGR = Utils.loadResource(OpenCVLibActivity.this, R.raw.anderson);
} catch (IOException e) {
e.printStackTrace();
}
srcRGBA = new Mat(); //RGBA format
Imgproc.cvtColor(srcBGR, srcRGBA, Imgproc.COLOR_BGR2RGBA);
Bitmap bm = Bitmap.createBitmap(srcRGBA.cols(), srcRGBA.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(srcRGBA, bm);
mIgv.setImageBitmap(bm);
break;
default:
super.onManagerConnected(status);
}
}
12. build and run
13. opencv load image from resource(raw)
google一下
參考opencv online document:
loadResource
public static Mat loadResource(Context context, int resourceId) throws java.io.IOException
- Throws:
java.io.IOException
srcBGR = Utils.loadResource(OpenCVLibActivity.this, R.raw.anderson);
opencv load image的format是BGR, 但是ImageView接受的是RGBA format. 所以需要做color 轉換
Imgproc.cvtColor(srcBGR,srcRGBA,Imgproc.COLOR_BGR2RGBA);
如果沒有做轉換,其結果如下
ImageView無法接收Mat資料型態,必須要轉換
Bitmap bm=Bitmap.createBitmap(srcRGBA.cols(),srcRGBA.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(srcRGBA,bm);
sample code:
ImageView mIgv;
Mat srcBGR, srcRGBA;
mIgv = (ImageView) findViewById(R.id.igv);
try {
srcBGR = Utils.loadResource(OpenCVLibActivity.this, R.raw.anderson);
} catch (IOException e) {
e.printStackTrace();
}
srcRGBA = new Mat(); //RGBA format
Imgproc.cvtColor(srcBGR, srcRGBA, Imgproc.COLOR_BGR2RGBA);
Bitmap bm = Bitmap.createBitmap(srcRGBA.cols(), srcRGBA.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(srcRGBA, bm);
mIgv.setImageBitmap(bm);
完整的source code:
OpenCVActivity.java
package com.example.home.opencvlibtest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import java.io.IOException;
public class OpenCVLibActivity extends Activity {
ImageView mIgv;
Mat srcBGR, srcRGBA;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
try {
srcBGR = Utils.loadResource(OpenCVLibActivity.this, R.raw.anderson);
} catch (IOException e) {
e.printStackTrace();
}
srcRGBA = new Mat(); //RGBA format
Imgproc.cvtColor(srcBGR, srcRGBA, Imgproc.COLOR_BGR2RGBA);
Bitmap bm = Bitmap.createBitmap(srcRGBA.cols(), srcRGBA.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(srcRGBA, bm);
mIgv.setImageBitmap(bm);
break;
default:
super.onManagerConnected(status);
}
}
};
@Override
public void onResume() {
super.onResume();
//Internal OpenCV library not found. Using OpenCV Manager for initialization
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_open_cvlib);
mIgv = (ImageView) findViewById(R.id.igv);
// you cannot use any opencv - related code, until the manager finished loading.
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_open_cvlib, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
activity_open_cvlib.xml
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".OpenCVLibActivity">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/igv"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
AndroidManifest.xml
xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.home.opencvlibtest" >
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
android:name=".OpenCVLibActivity"
android:label="@string/app_name" >
android:name="android.intent.action.MAIN" />
android:name="android.intent.category.LAUNCHER" />
build.gradle (Module:app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.example.home.opencvlibtest"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':openCVLibrary300')
}
補充:
使用機台: ASUS ZE500KL 8916 64-bit CPU and 64-bit OS
配合使用機台,採用OpenCV_3.0.0_Manager_3.00_arm64-v8a.apk
參考: https://developer.android.com/ndk/guides/abis.html
其中arm64-v8a 代表使用AArch64(ARMv8), 使用64-bit 指令處理