Android導(dǎo)入OpenCV配置使用
1.下載OpenCV-android-sdk
官網(wǎng)下載sdk,打開(kāi)opencv官網(wǎng),點(diǎn)擊Android,完成后解壓
https://opencv.org/
解壓后,文件夾下有這些文件
- samples Android代碼工程
- sdk 包含opencv的Java的接口和JNI接口等
2.新建工程
打開(kāi)Android studio,選擇模板,這時(shí)選擇最后一項(xiàng)Native C++,然后進(jìn)入配置界面。
- 這里注意你下載的Android-sdk版本來(lái)選擇API
- 選擇C++14,finish
3.環(huán)境配置
- 將OpenCV庫(kù)作為Module導(dǎo)入。具體步驟為:File->New->Import Module,然后將OpenCV-android-sdk\sdk目錄導(dǎo)入,最好順便將模塊名改成opencv+版本號(hào)。如下圖,然后Next->Finish。
- 修改OpenCV下的gradle文件,
apply plugin: 'com.android.library
,并將API改為與app一致 - 添加依賴(lài),菜單欄選擇File->Project Structure,在Dependencies選項(xiàng)中選擇app,點(diǎn)擊+,選擇Module dependency,如下圖:
勾選OpenCV,點(diǎn)擊OK,等待同步 - 新建jinLibs文件夾, 右鍵main,選擇New-Folder-JNI Folder,如下圖,并改名為jniLibs
- 打開(kāi)解壓縮后的opencv-android-sdk文件,將sdk\native\jni\include文件夾下的opencv2文件夾復(fù)制到cpp下將sdk\native\libs下的文件夾復(fù)制到j(luò)niLibs下,如下圖
- 配置參數(shù),打開(kāi)app的gradle,添加sourceSets
sourceSets {
main{
jni.srcDirs = ['src/main/jniLibs']
}
}
在externalNativeBuild下添加以下代碼
externalNativeBuild {
cmake {
cppFlags '-std=c++14 -frtti -fexceptions'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
arguments '-DANDROID_STL=c++_shared'
}
}
這時(shí)環(huán)境就算配置好了,接下來(lái)用一個(gè)簡(jiǎn)單的灰度化來(lái)驗(yàn)證一下文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-469032.html
灰度化
java代碼
package com.example.myandroidopencv;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.myandroidopencv.databinding.ActivityMainBinding;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import java.io.File;
import java.io.FileNotFoundException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView img;
private Button btn_load, btn_gray;
private Bitmap bitmap;
// Used to load the 'myandroidopencv' library on application startup.
static {
System.loadLibrary("myandroidopencv");
}
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
img = findViewById(R.id.img);
btn_load = findViewById(R.id.btn_load);
btn_gray = findViewById(R.id.btn_gray);
btn_load.setOnClickListener(this);
btn_gray.setOnClickListener(this);
}
/**
* A native method that is implemented by the 'myandroidopencv' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btn_load:
loadImg();
break;
case R.id.btn_gray:
doChgGray();
break;
}
}
private void loadImg(){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,1);
}
private void doChgGray(){
if (bitmap==null){
return;
}
Bitmap bit = bitmap.copy(Bitmap.Config.ARGB_8888,false);
Mat src = new Mat(bit.getHeight(), bit.getWidth(), CvType.CV_8UC(3));
Utils.bitmapToMat(bit,src);
Imgproc.cvtColor(src,src,Imgproc.COLOR_BGR2GRAY);
Utils.matToBitmap(src,bitmap);
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//用戶(hù)操作完成,結(jié)果返回碼是-1
if (resultCode==RESULT_OK){
Uri uri = data.getData();
Log.e("uri",uri.toString());
ContentResolver cr = this.getContentResolver();
try {
bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
img.setImageBitmap(bitmap);
}catch(FileNotFoundException ex){
Log.e("Exception",ex.getMessage(),ex);
}
}else{
//操作錯(cuò)誤,或沒(méi)有選擇圖片
Log.i("MainActivity", "操作錯(cuò)誤");
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()){
Log.i("cv","未找到內(nèi)部的opencv庫(kù),使用OpenCV Manager進(jìn)行初始化");
}else {
Log.i("cv","發(fā)現(xiàn)了內(nèi)置的opencv庫(kù),使用它來(lái)進(jìn)行操作");
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
img.setImageBitmap(bitmap);
break;
}
}
};
}
頁(yè)面布局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="300dp"/>
<LinearLayout
android:paddingTop="250dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_load"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="加載圖片"
android:textSize="25sp"/>
<Button
android:id="@+id/btn_gray"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="灰度化"
android:textSize="25sp"/>
</LinearLayout>
</LinearLayout>
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-469032.html
到了這里,關(guān)于學(xué)習(xí)筆記—Android studio導(dǎo)入OpenCV配置使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!