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

打印 上一主题 下一主题

主题 557|帖子 557|积分 1671

媒介

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

新建项目

点击 New Project


选择界面


设置相关参数

创建成功

确保创建成功(真机测试)

前提:手机要打开开发者模式启用USB调试

手机界面出现 Hello World! 即可成功。

导入 OpenCV

先要去OpenCV库官网下载OpenCVAndroid

https://opencv.org/releases/

在这里利用 opencv-4.7.0-android-sdk

解压的OpenCV文件夹


点击file->new->Import Module选择解压之后的opencv-android-sdk文件夹中的SDk文件夹,并将:sdk修改为pencv



等待OpenCV库加载,需要等一会时间

加载好后就会出现下面的错误信息


解决出现的题目1


build.gradleopencv

修改版本

这里的版本要与build.gradle(app)的同等


修改后的内容


注释内容

将 apply plugin: 'kotlin-android' 进行注释


添加 namespace

namespace "org.opencv"


settings.gradleproject


将1 [settings.gradle.kts(OpenCV)]里面的内容复制到2 [settings.gradle(OpenCV)]里面


settings.gradle.ktsOpenCV


settings.gradleOpenCV

注意:在末尾新添加了一行 include("pencv")


编译代码

现在就没有错误信息了

手机验证

正常显示


应用 OpenCV 库到 APP

点击file->project structure ->Dependencies->app->3 Module Dependency,然后给opencv打上对勾,应用即可





编译代码并应用到APP上会出现下述题目
编译时是没有题目标

导出到APP上出现题目


解决出现的题目2

OpenCVEngineInterface


发现找不到这个类 import org.opencv.engine.OpenCVEngineInterface;

由于SDK 里面提供的是aidl文件路径和Android 默认的差别,但是这个需要新建一个路径 aidl/org/opencv/engine。然后把原SDK路径org.opencv.engine包下的aidl文件拷贝到前面你新建的包


build.gradlepencv

在向build.gradle(pencv)中添加下述代码

Plain Text
buildFeatures {
     aidl true
 }

导出到APP上出现下述题目


gradle.properties

向gradle.properties中添加下述代码

Plain Text
android.defaults.buildfeatures.buildconfig=true


再次编译并导出到APP上,这次就没有出现任何题目



实战

图片转黑白

activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:orientation="vertical"
  8.     tools:context=".MainActivity">
  9.     <ImageView
  10.         android:id="@+id/img"
  11.         android:layout_width="match_parent"
  12.         android:layout_marginTop="30dp"
  13.         android:layout_height="300dp" />
  14.     <LinearLayout
  15.         android:layout_width="match_parent"
  16.         android:layout_height="wrap_content"
  17.         android:layout_marginTop="250dp"
  18.         android:orientation="horizontal">
  19.         <Button
  20.             android:id="@+id/btn_load"
  21.             android:layout_width="wrap_content"
  22.             android:layout_height="wrap_content"
  23.             android:layout_weight="1"
  24.             android:text="加载图片"
  25.             android:textSize="25sp"/>
  26.         <Button
  27.             android:id="@+id/btn_gray"
  28.             android:layout_width="wrap_content"
  29.             android:layout_height="wrap_content"
  30.             android:layout_weight="1"
  31.             android:text="灰度化"
  32.             android:textSize="25sp"/>
  33.     </LinearLayout>
  34. </LinearLayout>
复制代码
MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2.     private ImageView img;
  3.     private Button btn_load, btn_gray;
  4.     private Bitmap bitmap;
  5.     @Override
  6.     protected void onCreate(Bundle savedInstanceState) {
  7.         super.onCreate(savedInstanceState);
  8.         setContentView(R.layout.activity_main);
  9.         img = findViewById(R.id.img);
  10.         btn_load = findViewById(R.id.btn_load);
  11.         btn_gray = findViewById(R.id.btn_gray);
  12.         btn_load.setOnClickListener(new View.OnClickListener() {
  13.             @Override
  14.             public void onClick(View view) {
  15.                 loadImg();
  16.             }
  17.         });
  18.         btn_gray.setOnClickListener(new View.OnClickListener() {
  19.             @Override
  20.             public void onClick(View view) {
  21.                 doChgGray();
  22.             }
  23.         });
  24.     }
  25.     private void loadImg(){
  26.         Intent intent = new Intent();
  27.         intent.setType("image/*");
  28.         intent.setAction(Intent.ACTION_GET_CONTENT);
  29.         startActivityForResult(intent,1);
  30.     }
  31.     private void doChgGray(){
  32.         if (bitmap==null){
  33.             return;
  34.         }
  35.         Bitmap bit = bitmap.copy(Bitmap.Config.ARGB_8888,false);
  36.         Mat src = new Mat(bit.getHeight(), bit.getWidth(), CvType.CV_8UC(3));
  37.         Utils.bitmapToMat(bit,src);
  38.         Imgproc.cvtColor(src,src,Imgproc.COLOR_BGR2GRAY);
  39.         Utils.matToBitmap(src,bitmap);
  40.         Message message = new Message();
  41.         message.what = 1;
  42.         handler.sendMessage(message);
  43.     }
  44.     @Override
  45.     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  46.         //用户操作完成,结果返回码是-1
  47.         if (resultCode==RESULT_OK){
  48.             Uri uri = data.getData();
  49.             Log.e("uri",uri.toString());
  50.             ContentResolver cr = this.getContentResolver();
  51.             try {
  52.                 bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
  53.                 img.setImageBitmap(bitmap);
  54.             }catch(FileNotFoundException ex){
  55.                 Log.e("Exception",ex.getMessage(),ex);
  56.             }
  57.         }else{
  58.             //操作错误,或没有选择图片
  59.             Log.i("MainActivity", "操作错误");
  60.         }
  61.         super.onActivityResult(requestCode, resultCode, data);
  62.     }
  63.     @Override
  64.     protected void onResume() {
  65.         super.onResume();
  66.         if (!OpenCVLoader.initDebug()){
  67.             Log.i("cv","未找到内部的opencv库,使用OpenCV Manager进行初始化");
  68.         }else {
  69.             Log.i("cv","发现了内置的opencv库,使用它来进行操作");
  70.         }
  71.     }
  72.     Handler handler = new Handler(){
  73.         @Override
  74.         public void handleMessage(@NonNull Message msg) {
  75.             super.handleMessage(msg);
  76.             switch (msg.what){
  77.                 case 1:
  78.                     img.setImageBitmap(bitmap);
  79.                     break;
  80.             }
  81.         }
  82.     };
  83. }
复制代码
手机效果





结语

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

  硬性的尺度实在限制不了无限可能的我们,以是啊!少年们加油吧!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表