Android Studio中安装使用OpenCV

参考链接:

(1) https://zhuanlan.zhihu.com/p/666307982
(2) https://forum.opencv.org/t/opencv-4-8-0-cannot-resolve-symbol-opencv-engine-interface/14307/2

以下操作以张思民老师的《Android Studio应用程序设计》第3版中的例9-2为例进行操作。

1. 下载OpenCV Android SDK

(1) 进入OpenCV 官网:https://opencv.org/releases/

(2) 点击下方的Android开始下载

在这里插入图片描述

(3) 下载的OpenCV Android SDK为如图所示的压缩包

在这里插入图片描述

(4) 解压以上压缩包

2. 搭建开发环境

(1) 新建一个空白项目

在这里插入图片描述
在这里插入图片描述

(2) 选择菜单File→New→Import Module

在这里插入图片描述

(3) 在Import module from source对话框中选择OpenCV-android-sdk解压目录下的sdk

注意:是目录下的sdk而不是课本中sdk/java

在这里插入图片描述

(4)稍等,运行项目出现以下报错

Plugin [id: ‘com.android.application’, version: ‘8.1.0’, apply: false] was not found in any of the following sources:
在这里插入图片描述

(5)解决以上问题

① 查看以下信息
在这里插入图片描述

② 打开opencv/build.gradle
③ 修改方框中的参数与步骤①中参数一致,修改后如下图所示
④ 将apply plugin: ‘kotlin-android’ 注释掉
⑤ 添加namespace “org.opencv”
在这里插入图片描述

⑥ 打开项目目录中的settings.gradle和settings.gradle.kts
在这里插入图片描述

⑦ 将settings.gradle.kts中的内容复制到settings.gradle
settings.gradle.kts 内容保持不变
settings.gradle 在末尾添加一行include(“:opencv”)
在这里插入图片描述

重新编译,报错消失

3. 编写代码

(1) 在res/drawable文件夹下放置一张图片

在这里插入图片描述

(2) 将布局文件复制到res/layout/activity_main.xml文件中

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="289dp"
        android:layout_height="324dp"
        android:layout_marginStart="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginTop="4dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/dog" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="12dp"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="12dp"
        android:text="图像模糊"
        app:layout_constraintStart_toStartOf="@+id/imageView"
        app:layout_constraintTop_toBottomOf="@+id/imageView" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="24dp"
        android:layout_marginLeft="24dp"
        android:text="图像锐化"
        app:layout_constraintStart_toEndOf="@+id/button"
        app:layout_constraintTop_toTopOf="@+id/button" />

</androidx.constraintlayout.widget.ConstraintLayout>

(3) 将JAVA主程序复制到MainActivity文件中

在这里插入图片描述

package com.example.example_9_2;


import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

public class MainActivity extends AppCompatActivity {
    ImageView imgView;
    Button btn1, btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgView = findViewById(R.id.imageView);
        btn1 = findViewById(R.id.button);
        btn2 = findViewById(R.id.button2);
        btn1.setOnClickListener(new mClick1());
        btn2.setOnClickListener(new mClick2());
        boolean success = OpenCVLoader.initDebug();
    }
    class mClick1 implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            /*
             *  */
            Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.flower2);
            //(1)定义3×3模糊卷积核
            Mat kernel = new Mat(3, 3, CvType.CV_32FC1);
            float[] data = new float[]{0,    1.0f/8.0f,    0,
                    1.0f/8.0f,    0.5f,       1.0f/8.0f,
                    0,     1.0f/8.0f,    0};
            kernel.put(0, 0, data);
            //(2)使用上面定义的卷积核实现滤波
            Mat src = new Mat();
            Mat dst = new Mat();
            for( int i=1; i<5; i++) {
                Utils.bitmapToMat(bitmap, src);
                Imgproc.filter2D(src, dst, -1, kernel, new Point(-1, -1), 0.0, Imgproc.CCL_BOLELLI);
                //高斯模糊
                Imgproc.GaussianBlur(src, dst, new Size(5.0, 5.0), 10.0, 20.0);
                Utils.matToBitmap(dst, bitmap);
            }
            imgView.setImageBitmap(bitmap);
            src.release();
            dst.release();
        }
    }

    class mClick2 implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            /*  */
            Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.flower2);
            //(1)定义锐化算子卷积核
            Mat kernel = new Mat(3, 3, CvType.CV_32FC1);
            float[] data = new float[]{-1, -1, -1, -1, 9, -1, -1, -1, -1};
            // float[] data = new float[]{0, -1, 0, -1, 5, -1, 0, -1, 0};
            kernel.put(0, 0, data);
            //(2)使用上面定义的卷积核实现滤波
            Mat src = new Mat();
            Mat dst = new Mat();
            for( int i=1; i<2; i++) {
                Utils.bitmapToMat(bitmap, src);
                Imgproc.filter2D(src, dst, -1, kernel, new Point(-1, -1), 0.0, Imgproc.CCL_BOLELLI);
                Utils.matToBitmap(dst, bitmap);
            }
            imgView.setImageBitmap(bitmap);
            src.release();
            dst.release();
        }
    }

}

(4) 报错 Cannot resolve symbol ‘opencv’

在这里插入图片描述

(5) 点击代码中报错位置的小红灯

在这里插入图片描述

选择其中第一项
在这里插入图片描述

稍等片刻,报错消除

(6) 点击运行,OpenCVEngineInterface报错

在这里插入图片描述

(7) 参考链接:https://forum.opencv.org/t/opencv-4-8-0-cannot-resolve-symbol-opencv-engine-interface/14307/2

在opencv的build.gradle中添加代码

buildFeatures {
        aidl = true
        buildConfig = true
}

(8) 点击上方的“Sync Now”

在这里插入图片描述

(9) 稍等一会儿,重新编译,OpenCVEngineInterface报错消除

4. 运行

(1) 建议使用的图片,即第3-(1)步骤中保存在drawable中的图片分辨率不要太大,不然模糊和锐化不明显,我这里使用图片的分辨率为300*200

(2) 模糊效果

在这里插入图片描述

(3) 锐化效果

在这里插入图片描述

  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值