慢吞云雾缓吐愁 发表于 2024-6-11 10:21:25

【图文详解】Android Studio(新版本) 设置OpenCV库,解决出现的各种题目

媒介

写这篇文章的目标就是记录自己在设置OpenCV库时遇到的题目。在网上查找相关资料时,发现很多Android Studio都是老版本,并且出现的题目都不能被解决。自己在设置过程中出现的题目都进行记录下来并一一解决。
新建项目

点击 New Project
https://img-blog.csdnimg.cn/8b27d01c129242b6af909f06079f3ca8.jpeg
选择界面
https://img-blog.csdnimg.cn/3f17e04aeb1a491a970599db9edf6704.jpeg
设置相关参数
https://img-blog.csdnimg.cn/d7b4d8faa23e45e586fac48957f216fc.jpeg
创建成功
https://img-blog.csdnimg.cn/592ace060a764f28b08b6142e718d234.jpeg
确保创建成功(真机测试)
https://img-blog.csdnimg.cn/d6586556722c4b3c92d67da2251f9013.jpeg
前提:手机要打开开发者模式并启用USB调试
手机界面出现 Hello World! 即可成功。
导入 OpenCV 库

先要去OpenCV库官网下载OpenCV的Android库
https://opencv.org/releases/
在这里利用 opencv-4.7.0-android-sdk
解压的OpenCV文件夹
https://img-blog.csdnimg.cn/52625f4cef6e4d1b9e7d61dc1a385eb9.jpeg
点击file->new->Import Module选择解压之后的opencv-android-sdk文件夹中的SDk文件夹,并将:sdk修改为:opencv
https://img-blog.csdnimg.cn/296d4d85b8774448b71e96999d82093b.jpeg
https://img-blog.csdnimg.cn/4d64082bf86443b8bb28d02e86d0121d.jpeg
等待OpenCV库加载,需要等一会时间
加载好后就会出现下面的错误信息
https://img-blog.csdnimg.cn/0b89c39b7d0f4d9598e6a36f6642933f.jpeg
解决出现的题目1

https://img-blog.csdnimg.cn/8d8505ba9c4d48338ee72633cca6024a.jpeg
build.gradle(opencv)

修改版本

这里的版本要与build.gradle(app)的同等
https://img-blog.csdnimg.cn/05b261c1d7b642e08f8b914eae5eb0aa.jpeg
修改后的内容
https://img-blog.csdnimg.cn/37eef733559e451fbb9fefe5a5d9db7d.jpeg
注释内容

将 apply plugin: 'kotlin-android' 进行注释
https://img-blog.csdnimg.cn/ab44481b1829485ba97610b1e35929cf.jpeg
添加 namespace

namespace "org.opencv"
https://img-blog.csdnimg.cn/29e79dfbe7c24721b908cea13fd2117f.jpeg
settings.gradle(project)

https://img-blog.csdnimg.cn/0887466a76b941149381f08a128d62f9.jpeg
将1 里面的内容复制到2 里面
https://img-blog.csdnimg.cn/cfe3050c499d4c3fb4ba42995c4840de.jpeg
settings.gradle.kts(OpenCV)

https://img-blog.csdnimg.cn/acfc8e1f000c4c80b150c06bad1b8ea8.jpeg
settings.gradle(OpenCV)

注意:在末尾新添加了一行 include(":opencv")
https://img-blog.csdnimg.cn/3805fa98048341c19d2f012395d7dc01.jpeg
编译代码

现在就没有错误信息了
https://img-blog.csdnimg.cn/94872b8d61ac4428ad5634a427e7151d.jpeg
手机验证
正常显示
https://img-blog.csdnimg.cn/929025a2cad94afc855fdeb73915348f.jpeg
应用 OpenCV 库到 APP 中

点击file->project structure ->Dependencies->app->3 Module Dependency,然后给opencv打上对勾,应用即可
https://img-blog.csdnimg.cn/fea52cf8c8f7432dada214ee472c2d83.jpeg
https://img-blog.csdnimg.cn/a5e9daf9e93242199006d7aa2adafeb1.jpeg
https://img-blog.csdnimg.cn/3af99930235540f1b1694d436f4666c3.jpeg
https://img-blog.csdnimg.cn/ff42876f15394028bc250b2b751cd5f2.jpeg
编译代码并应用到APP上会出现下述题目
编译时是没有题目标
https://img-blog.csdnimg.cn/baa70990f3704d1999368854293e3d14.jpeg
导出到APP上出现题目
https://img-blog.csdnimg.cn/4ecdbfe92a2546f1a04f54d27589c68e.jpeg
解决出现的题目2

OpenCVEngineInterface

https://img-blog.csdnimg.cn/d6ffcbdd1b9046fca77c09e4e44f206f.jpeg
发现找不到这个类 import org.opencv.engine.OpenCVEngineInterface;
由于SDK 里面提供的是aidl文件路径和Android 默认的差别,但是这个需要新建一个路径 aidl/org/opencv/engine。然后把原SDK路径org.opencv.engine包下的aidl文件拷贝到前面你新建的包
https://img-blog.csdnimg.cn/35872f143e1b418ca64911471c774c9b.jpeg
build.gradle(:opencv)

在向build.gradle(:opencv)中添加下述代码
Plain Text
buildFeatures {
     aidl true
 }
导出到APP上出现下述题目
https://img-blog.csdnimg.cn/0893e41381ba42d3a15c94f1346c814a.jpeg
gradle.properties

向gradle.properties中添加下述代码
Plain Text
android.defaults.buildfeatures.buildconfig=true
https://img-blog.csdnimg.cn/8b87a087252247d3aeaf649af42e293b.jpeg
再次编译并导出到APP上,这次就没有出现任何题目
https://img-blog.csdnimg.cn/05b2281b7e1243169d4ae7f1f93a765b.jpeg
https://img-blog.csdnimg.cn/f49433c9962e4d3994b290fe3094a3e7.jpeg
实战

图片转黑白

activity_main.xml

<?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_marginTop="30dp"
      android:layout_height="300dp" />

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="250dp"
      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> MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ImageView img;
    private Button btn_load, btn_gray;
    private Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      img = findViewById(R.id.img);
      btn_load = findViewById(R.id.btn_load);
      btn_gray = findViewById(R.id.btn_gray);

      btn_load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                loadImg();
            }
      });

      btn_gray.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                doChgGray();
            }
      });
    }

    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;
            }
      }
    };
} 手机效果

https://img-blog.csdnimg.cn/4be9bc39f4e549f6ada819900ad2e2b0.jpeg
https://img-blog.csdnimg.cn/f7bc698a391f409eb3f17956198f1bbc.jpeg
https://img-blog.csdnimg.cn/a6544fa564b8402392d316dad26bcf73.jpeg
https://img-blog.csdnimg.cn/27a16d61977546c29e9a33da6ecc2735.jpeg
结语

    欢迎关注我的公众号:@AI算法与电子竞赛    

https://img-blog.csdnimg.cn/8c5d1e0cb4e04639b4db1836bdddb70b.jpeg​
硬性的尺度实在限制不了无限可能的我们,以是啊!少年们加油吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【图文详解】Android Studio(新版本) 设置OpenCV库,解决出现的各种题目