OpenCV-android-sdk 配置以及使用(Java)

OpenCV是Open Source Computer Vision Library 缩写, 主要由Intel公司的一些大佬写的, 功能是提供大量的图形图形处理(计算机视觉)的库, 并且提供 iOS 和 Android 的 SDK, 由于我主要工作是和Camera以及算法集成有关, 所以经常会用到这个工具, 在此记录下 Android 端的 SDK 使用和配置

OpenCV-android-sdk下载

下载地址(官网): https://opencv.org/releases.html
最新的版本是4.0.0 beta, 我们下载稳定版本3.4.3, 直接点击Android pack进行下载, 下载后解压即可.

导入Java SDK到Android Studio

  • 打开Android Studio后新建一个项目 OpencvDemo,建好后, 依次点击
    File --> New --> Import Module , 如图所示:
  • 编写 Demo, 做法是一个 ImageView 显示清晰的图片, 点击 Button 后将图片进行高斯模糊, 并重新显示出来, 高斯模糊使用代码如下:

    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 {
        private ImageView mImageView;
        // opencv相关功能实现所需要的so库
        static {
            System.loadLibrary("opencv_java3");
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            mImageView = findViewById(R.id.iv_image);
            final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_bg);
            mImageView.setImageBitmap(bitmap);
            FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    blurImage(bitmap);
                    mImageView.setImageBitmap(bitmap);
        //传入任意bitmap, 返回模糊过后的bitmap
        private Bitmap blurImage(Bitmap origin) {
            Mat mat = new Mat();
            Utils.bitmapToMat(origin, mat);
            Imgproc.GaussianBlur(mat, mat, new Size(15, 15), 0);
            Utils.matToBitmap(mat, origin);
            return origin;
    

    重复点击 Button 可让图片越来越模糊, 效果图片:

  • 从上面 Demo 中可以看到, 调用了 System.loadLibrary("opencv_java3");, 其实 OpenCV 核心功能都是通过C++实现的, android sdk 基本上就是封装了 JNI 的调用, 所以运行时候必须加载核心库 libopencv_java3.so, so库的位置为 OpenCV-android-sdk\sdk\native\libs, 此目录下有多个 CPU 架构的算法库, 上面 Demo 默认将所有的库都打包到 apk 中了, 编译完后 apk 体积会有 80M 左右, 但正常情况我们只需要 armeabi-v7a 和 arm64-v8a 这两个目录的库, 因为现在手机端几乎所有 CPU 都是 ARM 架构的.