一、OpenCV Android開發環境的搭建
Android Studio3.5.2
OpenCV Android Sdk 3.4.10版本
JDK8:64位
Android NDK r17c
從官網下載的SDK後解壓如下所示
- apk文件夾中存儲的是對應不同cpu的代理(manager)應用
- samples中存儲的是官方給出Demo源碼示例,但是遺憾的是這裏都是Eclipse項目
- sdk中存儲的就是我們接下來搭建環境需要使用的一些材料
1、新建一個項目OpenCVTest工程,然後選擇Empty Activity,然後一直點擊下一步。
2、將下載的OpenCV-android-sdk\sdk\中的java模塊導入到該項目中,點擊 File -> new -> Import Module, 選中 OpenCV-Android-SDK/sdk/java 文件夾,點擊確定,就會自動識別處模塊,如下圖所示:
3、將OpenCV的SDK導入進來後,就修改openCVLibrary3410項目中的build.gradle文件,修改內容如下所示:
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion "26"
defaultConfig {
minSdkVersion 14
targetSdkVersion 26
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
4、修改openCVLibrary3410項目中的AndroidManifest.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.opencv"
android:versionCode="34100"
android:versionName="3.4.10">
//該行註釋掉
//<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="26" />
</manifest>
5、在Mouble app中修改build.gradle文件
dependencies {
implementation project(path: ':openCVLibrary3410')
implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
6、點擊 File -> Project Structure,在 Modules app下點擊依賴 openCVLibrary3410的模塊,然後點擊Dependencies中 Module dependency 後選擇 openCVLibrary341 後點擊完成。
二、代碼示例測試
1、先寫一個佈局文件,裏面一個按鈕是選擇本地相冊裏面的圖片,另外一個按鈕是實現圖片的處理。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/select_btn"
android:text="選擇圖片"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/process_btn"
android:text="處理"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/imageView"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
2、MainActivity.java中代碼如下
public class MainActivity extends AppCompatActivity {
private static final String TAG = "wq892373445";
private double max_size = 1024;
private int PICK_IMAGE_REQUEST = 1;
private ImageView myImageView;
private Bitmap selectbp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
staticLoadCVLibraries();
myImageView = (ImageView)findViewById(R.id.imageView);
myImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Button selectImageBtn = (Button)findViewById(R.id.select_btn);
selectImageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// makeText(MainActivity.this.getApplicationContext(), "start to browser image", Toast.LENGTH_SHORT).show();
selectImage();
}
});
Button processBtn = (Button)findViewById(R.id.process_btn);
processBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// makeText(MainActivity.this.getApplicationContext(), "hello, image process", Toast.LENGTH_SHORT).show();
convertGray();
}
});
}
//OpenCV庫靜態加載並初始化
private void staticLoadCVLibraries(){
boolean load = OpenCVLoader.initDebug();
if(load) {
Log.e(TAG, "Open CV Libraries loaded...");
}
}
private void convertGray() {
Mat src = new Mat();
Mat temp = new Mat();
Mat dst = new Mat();
Utils.bitmapToMat(selectbp, src);
Imgproc.cvtColor(src, temp, Imgproc.COLOR_BGRA2BGR);
Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));
Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
Utils.matToBitmap(dst, selectbp);
myImageView.setImageBitmap(selectbp);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
Uri uri = data.getData();
try {
Log.d("image-tag", "start to decode selected image now...");
InputStream input = getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, null, options);
int raw_width = options.outWidth;
int raw_height = options.outHeight;
int max = Math.max(raw_width, raw_height);
int newWidth = raw_width;
int newHeight = raw_height;
int inSampleSize = 1;
if(max > max_size) {
newWidth = raw_width / 2;
newHeight = raw_height / 2;
while((newWidth/inSampleSize) > max_size || (newHeight/inSampleSize) > max_size) {
inSampleSize *=2;
}
}
options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
selectbp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
myImageView.setImageBitmap(selectbp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 跳轉到系統相冊選擇圖片
*/
private void selectImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"選擇圖像..."), PICK_IMAGE_REQUEST);
}
}
備註:本想下載最新的SDK爲4.3.0的,但是不知道爲什麼SDK的依賴不顯示,所以就用OpenCV Android Sdk 3.4.10版本