Android studio 3.0配置OpenCV初探

简介: 前言之前一直想对OpenCV进行学习和使用,一直没有实践。这次痛下决心,一定要搞定。经过两天的折腾,遇到各种bug终于搞定了,希望能帮助到初学者,如果里面有那些写的不对的地方,还希望各位看官指正。

前言

之前一直想对OpenCV进行学习和使用,一直没有实践。这次痛下决心,一定要搞定。经过两天的折腾,遇到各种bug终于搞定了,希望能帮助到初学者,如果里面有那些写的不对的地方,还希望各位看官指正。

简介

  • 准备条件
  • Android Studio NDK环境搭建
  • Android Studio OpenCV使用
  • 常见问题

准备条件

NDK环境搭建

   首先,在Android Studio中打开File->setting->Android SDK->SDK Tools
选择CMake和NDK然后点击Apply等待下载完成即可。
AI 代码解读
img_2a5e60e8fa9ec533c9643ae4d2decaaf.png
Android Studio Ndk配置.png
  • 首先

       OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以
     运行在LinuxWindowsAndroidMac OS操作系统上。它轻量级而且
     高效——由一系列 C 函数和少量 C++ 类,同时提供了PythonRubyMATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
     OpenCVC++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。
     该库也有大量的PythonJava and MATLAB/OCTAVE(版本2.5)的接口。
     这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#ChRuby的支持。
    
    AI 代码解读
  • 其次

        在Android Studio中新建Project,选中Include c++ support,之后一直默认选择,
    在C++版本选中c++11,然后finish完成创建,如下图所示。
    
    AI 代码解读
img_6d11f81c643f7b3c30de25dfdd8bc57c.png
Android Studio创建工程.png
  • 然后

       导入OpenCV中的Java库,这个库是OpenCV-android-sdk --->sdk--->java,选择java之后直接导入。
    之后点击Android Studio中的Project Structure,或者直接按ctrl+alt+shift+s打开库依赖面板,
    选择moudle Dependency,选择OpenCVLibrary330添加即可,如下图所示。
    
    AI 代码解读
img_2d50fb2d2ca1b67fa0c80fe43628f0a9.png
Android Studio 依赖项目.png
  • 再次

    在AS中打开CMakeLists.txt设置OpenCV的路径(此路径为你本地的路径)
    # ##################### OpenCV 环境 
    
    #设置OpenCV-android-sdk路径
    set( OpenCV_DIR E:/Source/OpenCV-android-sdk/sdk/native/jni )
    
    find_package(OpenCV REQUIRED )
    if(OpenCV_FOUND)
    include_directories(${OpenCV_INCLUDE_DIRS})
    message(STATUS "OpenCV library status:")
    message(STATUS "    version: ${OpenCV_VERSION}")
    message(STATUS "    libraries: ${OpenCV_LIBS}")
    message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
    else(OpenCV_FOUND)
    message(FATAL_ERROR "OpenCV library not found")
    endif(OpenCV_FOUND)
    
    AI 代码解读

注意: 上面的set( OpenCV_DIR E:/Source/OpenCV-android-sdk/sdk/native/jni)把此路径换成你本地的路径。

  • 最后

        将OpenCV-android-sdk下面的sdk-->native-->libs下面的文件复制到AS中libs路径下。
     然后在app 的build.gradle的android下添加如下代码:
    
      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)
     }
    
      最后还需要在dependencies添加 
     implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
    
    AI 代码解读

提示 :到这里OpenCV的环境已经配置完了,下面我们来写一个简单的DEMO验证一下。

简单DEMO验证

注意 :本demo只是简单验证,6.0的运行时权限等等没有进行配置。

  • 新建MainActivity

    public class MainActivity extends AppCompatActivity implements 
     View.OnClickListener { 
      //最大
       private double max_size = 1024;
      //回调
       private int PICK_IMAGE_REQUEST = 1;
      //原图、处理后的图片
       private ImageView mImgOriginal, mImgDeals;
      //原始Bitmap、处理后的Bitmap
      private Bitmap mOriginalBitmap,mDealBitmap;
     //选择图片、处理
      private Button mBtnChoose, mBtnDeals;
      @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      onLoadOpenCVLibrary();
      initView();
     }
    
    /**
     * 初始化
     */
     private void initView() {
    mImgDeals = findViewById(R.id.img_deals);
    mImgOriginal = findViewById(R.id.img_original);
    mBtnChoose = findViewById(R.id.btn_choose);
    mBtnDeals = findViewById(R.id.btn_deals);
    
    mBtnDeals.setOnClickListener(this);
    mBtnChoose.setOnClickListener(this);
    
     }
    
    
     @Override
    public void onClick(View view) {
    switch (view.getId()) {
        case R.id.btn_choose: {//选择
            selectImage();
            break;
        }
        case R.id.btn_deals: {//处理
            convertGray();
            break;
        }
    }
    }
    
      @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null
            && data.getData() != null) {
        Uri uri = data.getData();
        try {
            Log.e("image-tag", "start to decode selected image now...");
            InputStream input = getContentResolver().openInputStream(uri);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(input, null, options);
            int raw_width = options.outWidth;
            int raw_height = options.outHeight;
            int max = Math.max(raw_width, raw_height);
            int newWidth = raw_width;
            int newHeight = raw_height;
            int inSampleSize = 1;
            if (max > max_size) {
                newWidth = raw_width / 2;
                newHeight = raw_height / 2;
                while ((newWidth / inSampleSize) > max_size || (newHeight / inSampleSize) > max_size) {
                    inSampleSize *= 2;
                }
            }
    
            options.inSampleSize = inSampleSize;
            options.inJustDecodeBounds = false;
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            mOriginalBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri),
                    null, options);
            mDealBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri),
                    null, options);
            mImgOriginal.setImageBitmap(mOriginalBitmap);
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    }
    
    /**
     * OpenCV库静态加载并初始化
     */
     private void onLoadOpenCVLibrary() {
      boolean load = OpenCVLoader.initDebug();
      if (load) {
        Log.e("CV", "Open CV Libraries loaded...");
       }
     }
    
     /**
      * 选择图片
      */
    private void selectImage() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "选择图像"), PICK_IMAGE_REQUEST);
     }
    
    /**
     * 转换
     */
     private void convertGray(){
    Mat src = new Mat();
    Mat temp = new Mat();
    Mat dst = new Mat();
    Utils.bitmapToMat(mDealBitmap, src);
    Imgproc.cvtColor(src, temp, Imgproc.COLOR_BGRA2BGR);
    Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
    Utils.matToBitmap(dst, mDealBitmap);
    mImgDeals.setImageBitmap(mDealBitmap);
     }
     }
    
    AI 代码解读
  • 新建资源文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <LinearLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="horizontal">
    
      <Button
          android:id="@+id/btn_choose"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="10dp"
          android:text="@string/btn_choose"
          android:textSize="16sp" />
    
      <Button
          android:id="@+id/btn_deals"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_margin="10dp"
          android:text="@string/btn_deals"
          android:textSize="16sp" />
    
    </LinearLayout>
    
    <ImageView
      android:id="@+id/img_original"
      android:layout_width="200dp"
      android:layout_height="200dp"
      android:layout_gravity="center"
      android:layout_margin="16dp"
      android:scaleType="fitCenter"
      android:src="@mipmap/ic_launcher" />
    
    <ImageView
      android:id="@+id/img_deals"
      android:layout_width="200dp"
      android:layout_height="200dp"
      android:layout_gravity="center"
      android:layout_margin="16dp"
      android:scaleType="fitCenter"
      android:src="@mipmap/ic_launcher" />
    </LinearLayout>
    
    AI 代码解读
  • 资源文件的效果如下图所示


    img_7d5bba25c0cbab05086ed5ccf14be18d.png
    AS资源文件.png
  • 最终运行的效果如下图所示


    img_d876a3d4a28ed102ed9a5a995375a503.png
    AS效果图.png

感言

相关文章
|
4月前
|
Android Studio的插件生态非常丰富
Android Studio的插件生态非常丰富
206 1
Android Studio支持多种操作系统
Android Studio支持多种操作系统
212 1
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
80 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
54 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
103 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
42 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
97 8
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
1134 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
82 4

热门文章

最新文章

  • 1
    基于OpenCV的车牌识别系统源码分享
  • 2
    Android历史版本与APK文件结构
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 4
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 1
    android FragmentManager 删除所有Fragment 重建
    18
  • 2
    Android实战经验之Kotlin中快速实现MVI架构
    31
  • 3
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    36
  • 4
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    147
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    47
  • 7
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    59
  • 8
    Android历史版本与APK文件结构
    164
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    48
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    42
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等