Android项目集成OpenCV

  看过几篇关于集成OpenCV的博文,感觉大部分写不是那么简洁,而我恰恰又是懒于看长文的那种,在前后成功集成过两次之后,我决定亲自写一篇关于集成OpenCV的文章,虽然不是什么博客高手,但我会尽力写的简洁而有用,尽量实用到让像我这样的菜鸟也能快速上手。
  使用这种方法无需NDK以及安装OpenCV Manager。
  废话不多说了,开始吧。

第一步:下载OpenCV

  去官网下载OpenCV4AndroidSDK,这里不多说了,直接附上OpenCV3.4.1 ,点击链接去下载吧。
  下载解压之后是这样的:
这里写图片描述
这里写图片描述
这里写图片描述

注意:

  1. samples文件夹下放的是OpenCV4Android的演示代码,参考价值大,值得关注;
  2. sdk文件夹下是我们本次要重点关注的东西,有些是要集成到项目中的:

第二步:创建自己的工程,并在项目中添加依赖。

1. 在Android Studio中创建自己的项目:

这里写图片描述

2. 把OpenCV导入到项目中:

这里写图片描述
  到这里一般会出现编译错误,打开openCVLibrary341下的build.gradle文件,就可以看到错误原因
这里写图片描述
  这里需要手动改一下openCVLibrary341下build.gradle中的sdk版本,修改到和自己的项目一致即可编译通过,我这里修改后如下:
这里写图片描述
  导入成功并且编译通过之后,打开Module Settings,设置Module依赖。
这里写图片描述
这里写图片描述
  依赖成功之后,在自己项目的build.gradle中会多出这样一句,很好辨认。
这里写图片描述

第三步:添加OpenCV的so库到项目中

  其实到第二步之后,也可以使用OpenCV,但前提条件是,你手机中必须安装一个OpenCV Manager,显然这个是不能忍的,不可能我用使用了OpenCV之后,我的用户还要多装一个OpenCV Manager,这不是作死吗。
  那么,解决方法就在之前要大家重点关注的sdk文件夹,我们要将sdk/native/libs下的so库导入到项目中。
这里写图片描述

方法有二:

  没错,两个方法,看了这么多篇博文,我总结了两种方法,并且亲测可行,任选一种即可。

  方法一:

  1. sdk/native/libs下的文件全部粘贴到自己项目的libs文件夹下:
  2. 在自己项目的build.gradle中添加如下脚本:
    task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
        destinationDir file("$buildDir/native-libs")
        baseName 'native-libs'
        from fileTree(dir: 'libs', include: '**/*.so')
        into 'lib/'
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }
  1. 在build.gradle的dependencies代码块里添加依赖声明:
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')

  经过以上操作之后,结果如下图所示:
这里写图片描述

然后build整个项目,即可正常使用。

  方法二:

  直接复制sdk/native/libs整个文件夹到项目openCVLibrary341/src/main/目录下,重命名为jniLibs,如图所示:
这里写图片描述
然后build整个项目,即可正常使用。

第四步:使用OpenCV,验证可用性(必看,省的采坑):

  直接贴出我的测试代码:通过调用OpenCV API实现了灰度转换
  一定要注意:使用OpenCV之前,一定要调用OpenCVLoader.initDebug(),加载OpenCV库,否则,忽略了这一步你就掉坑里了,保证你绕半天找不出原因,还以为自己哪一步做的有问题呢。。。

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private ImageView mIvSrc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!OpenCVLoader.initDebug()) {
            Log.e(TAG, "  OpenCVLoader.initDebug(), not working.");
        } else {
            Log.e(TAG, "  OpenCVLoader.initDebug(), working.");
        }

        mIvSrc = findViewById(R.id.iv_src);
        mIvSrc.setImageResource(R.drawable.a);
    }

    public void onClick(View view) {
        Mat src = new Mat();
        Mat temp = new Mat();
        Mat dst = new Mat();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);
        Utils.bitmapToMat(bitmap, src);
        Imgproc.cvtColor(src, temp, Imgproc.COLOR_BGRA2BGR);
        Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));
        Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
        Utils.matToBitmap(dst, bitmap);
        mIvSrc.setImageBitmap(bitmap);
    }
}

效果如下:
这里写图片描述

第五步:根据需要,适当裁剪so库:

  其实我们的正文到这里已经结束了,但是忍不住在这里多扯上几句。
  如果细心一点就会发现,我们还没有做什么呢,这样编译出来的apk大小就已经超过80M了,这里是因为我们将OpenCV的so全部引入导致的,正常我们开发时,基本上是不需要全部使用的,可以根据我们需要适配的平台,适当的裁剪掉不需要的so库。

结束语

  本来是本着实用和简洁的初衷去写的,但是写完之后发现也就变成这样了,不知道是否真的达到了简洁预期,不过重新检查了一下,暂时没有发现疏漏,达到实用性的预期应该没问题。
  如果有疑问请在评论区提出或者私信我,看到后会尽量解答。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值