学习笔记—Android studio导入OpenCV配置使用

Android导入OpenCV配置使用

1.下载OpenCV-android-sdk

官网下载sdk,打开opencv官网,点击Android,完成后解压
https://opencv.org/
在这里插入图片描述
解压后,文件夹下有这些文件

  • samples Android代码工程
  • sdk 包含opencv的Java的接口和JNI接口等
    请添加图片描述

2.新建工程

打开Android studio,选择模板,这时选择最后一项Native C++,然后进入配置界面。
在这里插入图片描述

  • 这里注意你下载的Android-sdk版本来选择API

在这里插入图片描述

  • 选择C++14,finish

在这里插入图片描述

3.环境配置

  1. 将OpenCV库作为Module导入。具体步骤为:File->New->Import Module,然后将OpenCV-android-sdk\sdk目录导入,最好顺便将模块名改成opencv+版本号。如下图,然后Next->Finish。
    在这里插入图片描述在这里插入图片描述
  2. 修改OpenCV下的gradle文件, apply plugin: 'com.android.library,并将API改为与app一致
    在这里插入图片描述
  3. 添加依赖,菜单栏选择File->Project Structure,在Dependencies选项中选择app,点击+,选择Module dependency,如下图:
    在这里插入图片描述
    勾选OpenCV,点击OK,等待同步
    在这里插入图片描述
  4. 新建jinLibs文件夹, 右键main,选择New-Folder-JNI Folder,如下图,并改名为jniLibs
    在这里插入图片描述在这里插入图片描述
  • 打开解压缩后的opencv-android-sdk文件,将sdk\native\jni\include文件夹下的opencv2文件夹复制到cpp下将sdk\native\libs下的文件夹复制到jniLibs下,如下图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  1. 配置参数,打开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'
            }
        }

这时环境就算配置好了,接下来用一个简单的灰度化来验证一下

灰度化

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) {
        //用户操作完成,结果返回码是-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{
            //操作错误,或没有选择图片
            Log.i("MainActivity", "操作错误");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()){
            Log.i("cv","未找到内部的opencv库,使用OpenCV Manager进行初始化");
        }else {
            Log.i("cv","发现了内置的opencv库,使用它来进行操作");
        }
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);

            switch (msg.what){
                case 1:
                    img.setImageBitmap(bitmap);
                    break;
            }
        }
    };
}
页面布局代码
<?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>

请添加图片描述
请添加图片描述

  • 17
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
### 回答1: 要在Android Studio导入OpenCV,您需要执行以下步骤: 1. 下载OpenCV Android SDK并解压缩。 2. 打开Android Studio并创建一个新项目。 3. 在项目的根目录下创建一个名为“libs”的文件夹。 4. 将解压缩的OpenCV Android SDK中的“libs”文件夹中的所有文件复制到您创建的“libs”文件夹中。 5. 在项目的根目录下创建一个名为“jniLibs”的文件夹。 6. 将解压缩的OpenCV Android SDK中的“jni”文件夹中的所有文件复制到您创建的“jniLibs”文件夹中。 7. 在项目的根目录下创建一个名为“build.gradle”的文件。 8. 在“build.gradle”文件中添加以下代码: ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'jniLibs', include: ['*.so']) } ``` 9. 在您的项目中使用OpenCV库。 以上就是在Android Studio导入OpenCV的步骤。 ### 回答2: Android Studio是一款广泛使用Android应用程序开发工具,而OpenCV是一个开放源代码的计算机视觉和机器学习库,通过它可以在Android应用中实现许多现实世界的计算机视觉应用。目前,越来越多的开发者开始使用OpenCVAndroid应用中实现激进建模、人脸识别、物体检测等功能。接下来,将详细介绍如何在Android Studio导入OpenCV。 1.下载OpenCV SDK:首先需要到OpenCV官网下载OpenCV SDK,下载页面提供了多个版本的OpenCV SDK,我们需要选择最适合我们的版本; 2.创建Android工程:在Android Studio上创建一个空白Android工程,依次选择File -> New -> New Project,填写工程名、包名、保存路径等信息,最后点击Finish完成创建; 3.导入OpenCV SDK:将下载好的OpenCV SDK解压,复制其中的两个文件夹(Java和native)到新建的Android工程的主模块目录下; 4.配置工程:在build.gradle配置文件中添加OpenCV库; 在build.gradle(Module:app)中添加以下代码: ``` import org.gradle.internal.os.OperatingSystem def opencvdir = "$rootDir/OpenCV-android-sdk" def libname_first = "libopencv_java4" android { // ... } dependencies { // ... if (!isWindows()) { implementation files("$opencvdir/native/libs/${getOpenCvArch()}/$libname_first.so") } else { implementation files("$opencvdir/native/libs/${getOpenCvArch()}/$libname_first.dll") } } static def isWindows() { return OperatingSystem.current().windows } static def getOpenCvArch() { def arch = System.getProperty('os.arch') switch (arch) { case 'x86': case 'i386': case 'i486': case 'i586': case 'i686': return "x86" case 'amd64': case 'x86_64': return "x86_64" case 'arm': case 'armv5': return "armeabi-v7a" case 'armv6': return "armeabi-v6" case 'arm64': case 'aarch64': return "arm64-v8a" default: println "WARNING: CPU arch '$arch' was not recognized as official OpenCV arch" return null } } ``` 5.测试OpenCV:在MainActivity中测试导入OpenCV库,例如调用OpenCV中的imread函数读取一张图像: ``` public void testOpenCV() { String imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/test.jpg"; Mat srcMat = Imgcodecs.imread(imagePath, Imgcodecs.CV_LOAD_IMAGE_COLOR); if (srcMat.empty()) { return; } Bitmap srcBitmap = Bitmap.createBitmap(srcMat.width(), srcMat.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(srcMat, srcBitmap); ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(srcBitmap); } ``` 通过以上方法,我们可以成功在Android Studio导入OpenCV,实现相应的计算机视觉应用。在使用过程中,需要根据自己的需求调用OpenCV中的相应函数,实现自己的功能。 ### 回答3: Android Studio是一个用于开发Android应用程序的集成开发环境(IDE)。如果你想使用图像处理功能,例如人脸识别或条形码扫描,就可以使用OpenCV库。 以下是在Android Studio导入OpenCV的步骤: 1. 下载OpenCV安卓库 首先,在OpenCV网站上下载OpenCV安卓库。打开下载页面,选择适合你的OpenCV版本和Android Studio版本的库,然后下载该压缩文件。 2. 新建Android studio工程 在Android Studio中新建工程。 3. 在app的gradle文件中添加OpenCV库 解压下载的OpenCV安卓压缩文件后,在Android Studio工程的app的gradle文件中添加代码: ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':opencv') } ``` 其中'opencv'表示OpenCV库的名称。 4. 将OpenCV库文件放入工程中 在解压后的OpenCV安卓库文件夹中,找到libs文件夹。在Android Studio工程的app的main文件夹中,创建一个文件夹名为'jniLibs',随后把OpenCV库文件复制/剪切粘贴到该文件夹中。 5. 配置OpenCV库文件路径 在工程目录下,找到build.gradle文件,并在文件中添加如下代码: ``` sourceSets { main{ jniLibs.srcDirs=[ 'src/main/jniLibs', 'src/main/jniLibs/<平台对应的OpenCV文件夹>' ] } } ``` 将<>里的内容替换为你所下载的OpenCV版本对应的平台文件夹。 6. 在Java代码中调用OpenCV库 在你想要使用OpenCV库的Java文件中,导入OpenCV库并使用相关函数,例如: ``` import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.CvType; ... Mat m = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0)); Log.i(TAG, "OpenCV Mat: " + m); Core.transpose(m, m); Log.i(TAG, "OpenCV Mat after transpose: " + m); ``` 以上是在Android Studio导入OpenCV的步骤。导入后,你可以使用OpenCV的函数进行图像处理,例如图像滤波、图像平滑、边缘检测等等。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ANIMZLS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值