Android Studio中配置OpenCV

1,034 阅读3分钟
原文链接: blog.csdn.net

Android Studio中配置OpenCV

配置时软件库的版本:Android Studio版本3.1.2,OpenCV版本3.4.0

  最近在做数字手势识别的APP,把TensorFlow训练好的模型迁移到Android studio上进行相应APP的开发,因为要把摄像头拍到的图片压缩到64*64大小,而TensorFlow Lite并没有pc端提供的压缩函数。因为使用的area interpolation(面积插值法),搜了很久并没有找到这个算法的java实现,而且为了最大可能算法实现和TensorFlow中保持一致,因为不一致会导致识别准确率大幅下降,仔细查看TensorFlow官方文档,发现这么一句话:

Each output pixel is computed by first transforming the pixel’s footprint into the input tensor and then averaging the pixels that intersect the footprint. An input pixel’s contribution to the average is weighted by the fraction of its area that intersects the footprint. This is the same as OpenCV’s INTER_AREA.

  所以开启了在Android Studio中的OpenCV配置之路,先去官网下载OpenCV的AndroidSDK即opencv-3.4.0-android-sdk.zip,然后解压。
  我以我这里的Android project作为示例, *请确保你的Android project的compileSdkVersion版本大于等于21,否则的话会报 package android.hardware.camera2不存在错误,这是因为camera2是在sdkAPI21中引入的。

第一步,选择file->new->import module 导入刚刚解压的opencv-3.4.0-android-sdk,选择OpenCV-android-sdk\sdk\java,如下图所示,此时能够看到OpenCVLibrary340被导入进来,然后next->finish即可。导入后,我们的project目录下有一个OpenCVLibrary340的目录。

导入OpenCV模块

第二步,在project中添加依赖,具体步骤如下图所示:
添加依赖

按照上图步骤第5步后,在弹窗中选择OpenCVLibrary340,点击OK即可。

第三步,把opencv-3.4.0-android-sdk\OpenCV-android-sdk\sdk\native\libs目录下的库复制到我们的project的app\libs目录下,具体如图所示:

复制库

这个目录下其实存放的是CPU架构相关的库,可以符合自己CPU架构的复制进去。我这里复制了armeabi和armeabi-v7a两个。(注:如果你是X86的架构就把x86的放进去,对应自己CPU架构。我模拟器设的X86,原来没放X86的导致没法在模拟器中安装apk)

还要更改下OpenCV的build.gradle里的内容,主要是sdk版本问题,改成和我们app里(build.gradle)的一致就好了,如下图所示:

OpenCV

第四步,在 app (别搞错了)的gradle.build里配置引用刚刚复制进来的库,即把下面的代码添加到gradle.build文件里的android结点下:

sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['libs']
        }
    }
gradle配置

然后点击 sync now同步下。正常情况gradle编译都是一路成功的。 上面配置过程一路坐下来,如果你的gradle没有报错信息,那么恭喜你,配置成功了。下面就可以调用OpenCV库进行开发了。


在开发的时候,要先在用到的java文件里先加载OpenCV初始化库,即添加下面代码:

static {
        if(!OpenCVLoader.initDebug())
        {
            Log.d("opencv","初始化失败");
        }
    }
初试化

下面来小试牛刀一下,用OpenCV的area interpolation算法把图片压缩。 代码:

package com.example.hc.test;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

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

public class MainActivity extends AppCompatActivity {
    static {
        if(!OpenCVLoader.initDebug())
        {
            Log.d("opencv","初始化失败");
        }
    }
    private ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView)findViewById(R.id.image);
        Bitmap bitmap = BitmapFactory.decodeResource(this.getApplicationContext().getResources(), R.drawable.aomei1);
        Mat src = new Mat();
        Mat dst = new Mat();
        Utils.bitmapToMat(bitmap, src);
        //new Size(width, height)
        Imgproc.resize(src, dst, new Size(400,600),0,0,Imgproc.INTER_AREA);
        Bitmap bitmap1 = Bitmap.createBitmap(dst.cols(),dst.rows(),Bitmap.Config.RGB_565);
        Utils.matToBitmap(dst, bitmap1);
        imageView.setImageBitmap(bitmap1);
    }
}

拿张奥妹的照片,来看看效果,原图:

奥妹

压缩图:

奥妹压缩



感谢 拍码屁 的博客 Android Studio OpenCV环境的简单搭建,当时配置的时候参考了很多。