【问题标题】:No implementation found for long org.opencv.core.Mat.n_Mat() error Using OpenCVNo implementation found for long org.opencv.core.Mat.n_Mat() 错误使用 OpenCV
【发布时间】:2016-05-07 13:28:02
【问题描述】:

我正在为adaptiveThreshold 使用 OpenCV。我使用 OpenCV 进行图像处理的代码是这样的:

imageMat=new Mat();
Utils.bitmapToMat(bmp, imageMat);
Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(imageMat, imageMat, new Size(3, 3), 0);
Imgproc.adaptiveThreshold(imageMat, imageMat, 255,Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 4);

但我在声明 Mat 时遇到错误:

No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
        at org.opencv.core.Mat.n_Mat(Native Method)
        at org.opencv.core.Mat.<init>(Mat.java:24)
        at com.example.pial_pc.instantbookreview.ImageCapture$3.onPictureTaken(ImageCapture.java:105)

由于我是 OpenCV 的新手,我并不清楚这个错误。这段代码所属的整个Java类是here

我应该怎么做才能消除错误?

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    我已经成功消除了错误并且我的应用在执行这行imageMat=new Mat();时没有崩溃

    错误的原因是Android在加载OpenCV4Android库之前调用了"onCreate"方法。所以我使用了OpenCVManager的OpenCV异步初始化。我在 onCreate 方法之前创建了 BaseLoaderCallback。在里面我已经声明了 new Mat() 像这样:

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i("OpenCV", "OpenCV loaded successfully");
                    imageMat=new Mat();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };
    

    然后在 onResume() 我检查了 OpenCV 库是否已从当前应用程序包中加载和初始化。代码如下:

    public void onResume()
    {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        } else {
            Log.d("OpenCV", "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }
    

    我的错误消失了。我完整更新的 java 类是here

    参考链接:

    1. Async Initialization of OpenCV on Android using OpenCVManager
    2. Tutorial1Activity.java

    【讨论】:

    【解决方案2】:

    在您的活动中初始化 openCV 库 在 onCreate() 方法之前添加这段代码

    static {
        if (!OpenCVLoader.initDebug()) {
            // Handle initialization error
        }
    }
    

    在你的项目中添加这个库:https://github.com/hschott/Camdroid

    【讨论】:

      【解决方案3】:

      也许您忘记包含 openCV 库。

      包括

      static { 
           System.loadLibrary("opencv_java");
      }
      

      对于 OpenCV 版本 3,您应该添加:

      static { 
           System.loadLibrary("opencv_java3");
      }
      

      祝你好运:)

      【讨论】:

      • 这对我有用。感谢 Siddharth Bhatheja!
      • 我应该在我的活动课程中使用此代码吗? Kotlin 的等效代码是什么?
      【解决方案4】:

      我将这一行放在 onCreate 方法上,并确保安装了 openCvManager。这对我来说很好。

      OpenCVLoader.initDebug();

      【讨论】:

        【解决方案5】:

        使用它来解决错误。

        public class MainActivity : Activity
            {
        
                Mat m;
                Mat grayM;
                ImageView imageView;
                public MainActivity()
                {
                    if (!OpenCVLoader.InitDebug())
                    {
                        System.Console.WriteLine("GG");
                    }
        
                }
        }
        

        【讨论】:

          【解决方案6】:

          这对我有用:

          确保在链接模块依赖项时将 native/libs opencv 中的文件复制到项目中的 jniLibs 目录,然后在 build.gradle(app) 构建中设置以下内容。

              sourceSets {
                  main {
                      jni {
                          srcDirs 'src/main/jni', 'src/main/jniLibs'
                      }
                  }
              }
          

          然后将此添加到您的主要活动中

          OpenCVLoader.initDebug()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-19
            • 1970-01-01
            • 1970-01-01
            • 2021-01-17
            • 1970-01-01
            • 2019-01-13
            • 1970-01-01
            相关资源
            最近更新 更多