如何将 OpenCV 库导入 React-Native 项目

Posted

技术标签:

【中文标题】如何将 OpenCV 库导入 React-Native 项目【英文标题】:How can I import OpenCV library to React-Native project 【发布时间】:2020-01-18 12:51:55 【问题描述】:

我尝试通过本机代码导入 OpenCV,但没有成功,我还尝试了 react-native-opencv 库,但该库不包含所有 OpenCV 方法。

如何在我的 react-native 项目中使用 OpenCV?

提前致谢。

【问题讨论】:

我正在研究同样的事情。车牌识别系统是我的项目。解决客户端的工作以进行离线工作会很好。我现在想到的方法;在服务器上处理后删除图像。我的研究还在继续。如果你解决了,你会分享吗? 【参考方案1】:

我已经在 react-native 中使用 OpenCV 苦苦挣扎了一周,终于让它工作了。有这篇非常好的文章 https://brainhub.eu/blog/opencv-react-native-image-processing/ 和这个 repo https://github.com/brainhubeu/react-native-opencv-tutorial 详细描述了如何让它运行。但是,我无法通过按照描述的步骤或按照我能找到的任何其他教程/视频来使这个 repo 中的代码工作。因此,如果有人遇到同样的问题,您可以尝试这些步骤,使上述存储库中的应用程序在我的 android 10 设备上与 OpenCV v4.5 一起使用。

    打开终端并初始化新的 React-Native 项目

    npx react-native init NAME_OF_YOUR_PROJECT
    

    导航到路径 /main

    cd NAME_OF_YOUR_PROJECT/android/app/src/main
    

    创建名为 jniLibs 的新文件夹

    mkdir jniLibs
    

    从https://opencv.org/releases/ 下载并提取最新的适用于 Android 的 OpenCV(使用 OpenCV 4.5 测试)

    将解压文件夹(OpenCV-android-sdk)中的“sdk”文件夹重命名为“opencv”

    将提取的文件夹(OpenCV-android-sdk/opencv/native/libs/)中的内容复制到新创建的./jniLibs

    cp -r /PATH_TO_EXTRACTED_OPENCV_FOLDER/OpenCV-android-sdk/opencv/native/libs/ ./jniLibs
    

    打开 Android Studio 并打开项目目录的 Android 文件夹

    文件 -> 打开 -> 选择 */NAME_OF_YOUR_PROJECT/android

    将 OpenCV 导入您的项目

    文件->新建->导入模块->选择你重命名为opencv的文件夹

    重要!一些教程说要选择此文件夹中的“java”文件夹 - 不要那样做)

    在 Gradle 脚本下:打开 build.gradle(:opencv) 和 build.gradle(YOUR_PROJECT_NAME) 将两者都更改为匹配的数字 - 在我的情况下:

    minSdkVersion = 21
    
    compileSdkVersion = 29
    

    将 opencv 添加到项目依赖项

    文件->项目结构->依赖项->选择应用程序并按“+”号(位于“所有依赖项下方”)->选中opencv旁边的复选框->按OK

    在 build.gradle(YOUR_APP_NAME) 中将 gradle 版本更改为 4.1.0

    dependencies 
        classpath("com.android.tools.build:gradle:4.1.0")
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    
    

    现在打开 build.gradle(Project: NAME_OF_YOUR_PROJECT .app) 并在编译选项中更改 java 版本并添加带有一些 pickfirst 选项的 packagin 选项。还启用 multidex 选项,如果您希望使用 react-native-camera 添加缺少的维度策略。应该看起来像这样:

    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8   
    
    
    
    
     packagingOptions 
           pickFirst 'lib/x86/libc++_shared.so'
           pickFirst 'lib/x86_64/libc++_shared.so'
           pickFirst 'lib/armeabi-v7a/libc++_shared.so'
           pickFirst 'lib/arm64-v8a/libc++_shared.so'
       
    
       defaultConfig 
           applicationId "com.***" // !!! if copy-pasting change applicationId to yours
           minSdkVersion rootProject.ext.minSdkVersion
           targetSdkVersion rootProject.ext.targetSdkVersion
           versionCode 1
           versionName "1.0"
           multiDexEnabled true
           missingDimensionStrategy 'react-native-camera', 'general'
       
    

    打开 build.gradle(:opencv) 并在默认配置中启用 multidex 选项。如果您想使用 react-native-camera ,那么还要添加缺失维度策略。应该是这样的

    defaultConfig 
        minSdkVersion 21
        targetSdkVersion 29
    
        versionCode openCVersionCode
        versionName openCVersionName
        multiDexEnabled true
        missingDimensionStrategy 'react-native-camera', 'general'
    
        externalNativeBuild 
            cmake 
                arguments "-DANDROID_STL=c++_shared"
                targets "opencv_jni_shared"
            
        
    
    

    还要在编译选项中更改 java 的版本(必须与 build.gradle(:app) 中的相同。应该看起来像这样

    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    
    

    将以下用户权限添加到您的 /PATH_TO_YOUR_PROJECT/android/app/src/main/AndroidManifest.xml

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

    打开 gradle 包装器属性 (/PATH_TO_YOUR_PROJECT/android/gradle/wrapper/gradle.properties) 并更改 gradle 的版本号

    distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
    

    转到 /YOUR_PROJECT_PATH/android/app/src/main/java/com/ 并创建 reactlibrary 文件夹,然后在该文件夹中创建两个文件:

    RNOpenCvLibraryModule.java

    RNOpenCvLibraryPackage.java

    使用与此 GIT 存储库 https://github.com/brainhubeu/react-native-opencv-tutorial/tree/master/android/app/src/main/java/com/reactlibrary 中相同的内容填充它们

    打开 MainApplication.java 并添加这个“packages.add(new RNOpenCvLibraryPackage());”到 getPackage() 方法。应该看起来像这样:

    @Override
    protected List<ReactPackage> getPackages() 
      @SuppressWarnings("UnnecessaryLocalVariable")
      List<ReactPackage> packages = new PackageList(this).getPackages();
      packages.add(new RNOpenCvLibraryPackage()); // ADD THIS
      // Packages that cannot be autolinked yet can be added manually here, for example:
      // packages.add(new MyReactNativePackage());
      return packages;
    
    

    还将这个添加到 onCreate() 方法中:

      @Override
      public void onCreate() 
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
        initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
        if (!OpenCVLoader.initDebug())  // ADD THIS
          Log.d("OpenCv", "Error while init"); // AND THIS
         // DON'T FORGET THE ""
      
    

    不要忘记在“MainApplication.java”的开头添加正确的导入

    import org.opencv.android.OpenCVLoader;
    import java.lang.reflect.InvocationTargetException;
    import java.util.List;
    

    同步您的项目

    文件 -> 使用 Gradle 文件同步您的项目

    打开终端并导航到您的项目。添加这个包

    cd /PATH_TO_YOUR_PROJECT/
    npm i react-native-easy-toast --save
    npm i react-native-svg --save
    npm install --save react-native-camera@git+https://git@github.com/react-native-community/react-native-camera.git 
    

    (确保 react-native-camera 是从 GIT repo 安装的,否则会遇到错误)

    在您的 PROJECT_PATH 中创建名为“src”的新文件夹并复制此 repos 的内容(“https://github.com/brainhubeu/react-native-opencv-tutorial/tree/master/src”)“src”文件夹到你的 (/PATH_TO_YOUR_PROJECT/src/)

    mkdir src
    

    复制此 repos “https://github.com/brainhubeu/react-native-opencv-tutorial/blob/master/App.js” App.js 文件的内容并替换您的 App.js 文件中的内容(位于 YOUR_PROJECT_PATH 中)

    启动 react-native

    npx react-native start
    

    在安卓设备上运行

    npx react-native run-android
    

【讨论】:

【参考方案2】:

你可以使用这个库 react-native-opencv3 或者你可以利用这个project 在 react-native 中为 OpenCV 使用原生 Java 和 Objective-C 绑定

【讨论】:

【参考方案3】:

如果有人仍然想知道这里的解决方案。设置它是相当多的工作。您必须用 Java 编写 OpenCV 代码。 https://***.com/a/63116300/10333905

【讨论】:

以上是关于如何将 OpenCV 库导入 React-Native 项目的主要内容,如果未能解决你的问题,请参考以下文章

如何安装opencv

如何利用openCV做灰度图片

如何将 openCV 导入 iOS 8 项目

将经过训练的 SVM 从 scikit-learn 导入到 OpenCV

Arm Compute Library - Canny Edge 从导入的 opencv 图像返回不可用的数据

OpenCV4.x图像处理实例-张嘴和闭嘴检测