gpt4 book ai didi

java - imgproc 模块中某些函数的 OpenCV Android React Native 未知异常

转载 作者:行者123 更新时间:2023-12-02 16:24:10 26 4
gpt4 key购买 nike

我正在尝试在使用 React Native 编写的移动应用程序中使用 OpenCV。现在我只关注Android部分。我使用 Android 版的官方 OpenCV。我确实添加了 sdk,修改了我的 MainApplication.java并编写了一些可以从 React Native 调用的包装方法。到目前为止,这可以按预期编译和工作。
现在的问题是,如果得到 unknown exception从一些 OpenCV 功能,其他工作正常。例如。当我调用 blur() , medianBlur()warpAffine()来自 Imgproc 的函数模块一切都很好。当我尝试打电话时,例如gaussianBlur()Canny()我得到一个 unknown exception 的函数从 OpenCV 抛出。
我真的不知道问题是什么。 sdk 似乎链接正确,因为我可以编译应用程序并运行多个功能。
我的设置:

  • Arch Linux 开发
  • 适用于 Android 的 OpenCV 4.3.0
  • react 原生 0.62.2
  • 从终端
  • 使用 gradle/react-native 编译
  • 安卓 10

  • 当我尝试运行 Canny() 时的示例错误功能:
    org.opencv.imgproc: imgproc::Canny_12() caught unknown exception
    unknown exception
    java.lang.Exception: unknown exception
    at org.opencv.imgproc.Imgproc.Canny_2(Native Method)
    at org.opencv.imgproc.Imgproc.Canny(Imgproc.java:2662)
    at com.rnopencv.RNOpenCvLibraryModule.cannyEdges(RNOpenCvLibraryModule.java:110)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.facebook.react.bridge.JavaMethodWrapper.invoke(JavaMethodWrapper.java:372)
    at com.facebook.react.bridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:151)
    at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
    at android.os.Looper.loop(Looper.java:214)
    at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
    at java.lang.Thread.run(Thread.java:919)
    调用以下包装器:
    @ReactMethod
    public void cannyEdges(String imageAsBase64, int treshold, Promise promise) {
    try {
    // Constants
    Size BLUR_SIZE = new Size(3,3);
    int KERNEL_SIZE = 3;
    int RATIO = 3;
    int MAX_LOW_THRESHOLD = 100;

    int lowTreshold = (treshold <= MAX_LOW_THRESHOLD) ? treshold : MAX_LOW_THRESHOLD;

    // decode base64 string to matrix
    Bitmap srcImage = base64ImageToBitmap(imageAsBase64);
    Mat srcMat = new Mat();
    Utils.bitmapToMat(srcImage, srcMat);

    // rotate image to be portrait
    Mat orientedMat = rotateBoxed(srcMat, -90);

    // blur the image
    Mat bluredMat = new Mat();
    Mat cannyMat = new Mat();
    Imgproc.blur(orientedMat, bluredMat, BLUR_SIZE);
    // NEXT LINE THROWS THE ERROR
    Imgproc.Canny(bluredMat, cannyMat, lowTreshold, lowTreshold * RATIO, KERNEL_SIZE, false);

    // return blured image wrapped in promise
    Bitmap dstImage = Bitmap.createBitmap(cannyMat.cols(), cannyMat.rows(), srcImage.getConfig());
    Utils.matToBitmap(cannyMat, dstImage);
    promise.resolve(bitmapToBase64(dstImage));
    } catch (Exception e) {
    System.out.println("Oh snap, some Exception occured!");
    System.out.println(e.getMessage());
    e.printStackTrace(System.out);
    promise.reject("Could not perform canny edge detection on image!", e);
    }
    }
    包装器将图像作为 base64 编码的字符串(目前还没有更好的解决方案)并以 js Promise 的形式返回结果。我还使用仿射变换将图像旋转到正确的方向(这部分的工作原理如上所述)。我尝试了各种阈值值,gaussianBlur() 方法也是如此。结果总是无效参数的断言失败(这是预期的)或神秘的未知异常。
    关于问题可能是什么的任何线索?
    更新 :当我使用旧版本的 openCV 例如3.4.10 for Android 它将工作。

    最佳答案

    上次我遇到了这个问题,所以我选择了 Open CV API 而不是这个。
    我希望这对你有所帮助。

    关于java - imgproc 模块中某些函数的 OpenCV Android React Native 未知异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62623994/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com