【问题标题】:Creating new Mat variable crashes android app创建新的 Mat 变量会使 android 应用程序崩溃
【发布时间】:2017-06-10 02:44:53
【问题描述】:

我正在开发一个在部分代码中使用 openCV 的视觉定位系统。其中一个步骤涉及使用 Mats。我使用Mat newMat = Mat()Mat newMat = Mat(2, 2, CvType.CV_8UC3) 以及其他一些Cv 类型创建了一个新垫子。无论我尝试什么,当我运行代码时,只要它到达上述行,应用程序就会完全崩溃。堆栈跟踪报告两件事之一。当使用较长形式的 mat 声明(第二个代码 sn-p)时,它看起来像这样:

E/ActivityThread: Activity org.firstinspires.ftc.robotcontroller.internal.FtcRobotControllerActivity has leaked IntentReceiver com.qualcomm.analytics.Analytics@f31dd7d that was originally registered here. Are you missing a call to unregisterReceiver()?
                  android.app.IntentReceiverLeaked: Activity org.firstinspires.ftc.robotcontroller.internal.FtcRobotControllerActivity has leaked IntentReceiver com.qualcomm.analytics.Analytics@f31dd7d that was originally registered here. Are you missing a call to unregisterReceiver()?
                      at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:918)
                      at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:719)
                      at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1172)
                      at android.app.ContextImpl.registerReceiver(ContextImpl.java:1152)
                      at android.app.ContextImpl.registerReceiver(ContextImpl.java:1146)
                      at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
                      at com.qualcomm.analytics.Analytics.register(SourceFile:209)
                      at com.qualcomm.analytics.Analytics.<init>(SourceFile:235)
                      at com.qualcomm.modernrobotics.ModernRoboticsUsbUtil.init(SourceFile:85)
                      at com.qualcomm.ftccommon.FtcEventLoop.init(FtcEventLoop.java:191)
                      at com.qualcomm.robotcore.eventloop.EventLoopManager.startEventLoop(EventLoopManager.java:571)
                      at com.qualcomm.robotcore.eventloop.EventLoopManager.setEventLoop(EventLoopManager.java:545)
                      at com.qualcomm.robotcore.eventloop.EventLoopManager.start(EventLoopManager.java:489)
                      at com.qualcomm.robotcore.robot.Robot.start(Robot.java:59)
                      at com.qualcomm.ftccommon.FtcRobotControllerService$RobotSetupRunnable$1.run(FtcRobotControllerService.java:186)
                      at com.qualcomm.robotcore.util.ThreadPool.logThreadLifeCycle(ThreadPool.java:513)
                      at com.qualcomm.ftccommon.FtcRobotControllerService$RobotSetupRunnable.run(FtcRobotControllerService.java:128)
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                      at java.lang.Thread.run(Thread.java:818)

但是我应该使用更短的形式(第一个代码 sn-p)吗?我得到这个以及第一个堆栈跟踪的内容

E/art: No implementation found for void org.opencv.core.Mat.n_delete(long) (tried Java_org_opencv_core_Mat_n_1delete and Java_org_opencv_core_Mat_n_1delete__J)
E/System: Uncaught exception thrown by finalizer
E/System: java.lang.UnsatisfiedLinkError: No implementation found for void org.opencv.core.Mat.n_delete(long) (tried Java_org_opencv_core_Mat_n_1delete and Java_org_opencv_core_Mat_n_1delete__J)
              at org.opencv.core.Mat.n_delete(Native Method)
              at org.opencv.core.Mat.finalize(Mat.java:911)
              at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:202)
              at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:185)
              at java.lang.Thread.run(Thread.java:818)

是否有关于代码导致崩溃的原因的简单解释?在我现在运行的代码中,唯一的几行是类声明、函数声明和 mat 声明,但这似乎就是全部。

【问题讨论】:

    标签: java android opencv android-studio image-processing


    【解决方案1】:

    所以事实证明,主要活动中缺少几行代码。他们加载 openCV 库,如果不存在,则使用 openCV 库应用程序。

    这在 OnCreate 中进行

    if(!OpenCVLoader.initDebug()) {
              RobotLog.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for Initialization");
              OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mOpenCVCallBack);
          }else{
              RobotLog.d("OpenCV", "OpenCV library found inside package. Using it!");
              mOpenCVCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
          }
      }
    

    这正好在主要活动类的声明下方:

    private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
    
    
            @Override
              public void onManagerConnected(int status){
                  switch (status){
                      case LoaderCallbackInterface.SUCCESS:
                      {
                          RobotLog.i(TAG, "OpenCV Loaded Sucessfully");
                      }break;
                      default:
                      {
                          super.onManagerConnected(status);
                      }break;
                  }
              }
          };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多