需要解释OpenCV Android行为

时间:2016-04-23 04:30:13

标签: java android c++ opencv android-ndk

我正在尝试为Android编写一个图像拼接应用程序。我正在使用Android NDK作为OpenCV的原生部分。有3种不同的行为不应该发生,我希望能解释为什么它们会发生。

  1. 只有部分图像(来自设备上的同一相机/相同分辨率)不会崩溃。崩溃时的错误低于我的C ++代码。

  2. 图像针迹的结果看起来只是一个图像桶。 (我在20%的时间内得到这个结果,而其他80%的人崩溃)。我认为这与 for循环中的resize行有关。本书中的示例将列和行分为10.当我这样做时,图像只是略微桶化但非常像素化。同样,在这种情况下,它看起来只有一个图像。

  3. 如果我没有像这样设置拼接设置:

    stitcher.setRegistrationResol(-1); /// 0.6
    stitcher.setSeamEstimationResol(-1);   /// 0.1
    stitcher.setCompositingResol(-1);   //1
    stitcher.setPanoConfidenceThresh(-1);   //1
    stitcher.setWaveCorrection(true);
    stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
    

    输出图像将为空。这对我来说很奇怪,因为书中的例子没有它们就可以正常工作。

  4. 我一直在使用this book中的第6章作为我项目的C ++部分。这是我的C ++代码:

    #include <jni.h>
    #include "aaron_picstitch_MyNDK.h"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include <opencv2/stitching/stitcher.hpp>
    #include <opencv2/core/mat.hpp>
    
    #include <vector>
    #include <android/log.h>
    
    using namespace std;
    using namespace cv;
    
    char FILEPATH[100] = "/storage/emulated/0/PicStitch/cppResult.jpg";
    //char FILEPATH1[100] = "/storage/emulated/0/PicStitch/cppTesta.jpg";
    //char FILEPATH2[100] = "/storage/emulated/0/PicStitch/cppTestb.jpg";
    
    JNIEXPORT void JNICALL Java_aaron_picstitch_CameraActivity_stitchImages(JNIEnv *env, jobject , jobjectArray images, jint size, jlong panoAddr)
    {
    
           vector <Mat> imgs = vector<Mat>();
           Mat pano = Mat();
           Mat temp = Mat();
           Mat &srcRes = *(Mat *)panoAddr, img;
    
           jclass clazz = (env)->FindClass("org/opencv/core/Mat");
           jmethodID getNativeObjAddr = (env)->GetMethodID(clazz, "getNativeObjAddr", "()J");
    
           __android_log_print(ANDROID_LOG_VERBOSE, "IN CPP TESTTEST", "ADDR: %lld", panoAddr);
    
           int i = 0;
           for (i = 0; i < size; i++)
           {
                jobject obj = (env->GetObjectArrayElement(images, i));
                jlong result = (env)->CallLongMethod(obj, getNativeObjAddr, NULL);
                img = *(Mat *)result;
                resize(img, temp, Size(img.rows/2, img.cols/2));
                imgs.push_back(temp);
                env->DeleteLocalRef(obj);
           }
           env->DeleteLocalRef(images);
    
           Stitcher stitcher = Stitcher::createDefault();
           __android_log_print(ANDROID_LOG_VERBOSE, "IN CPP", "HERE 1 temp rows is: %d", temp.rows);
    
           stitcher.setRegistrationResol(-1); /// 0.6
           stitcher.setSeamEstimationResol(-1);   /// 0.1
           stitcher.setCompositingResol(-1);   //1
           stitcher.setPanoConfidenceThresh(-1);   //1
           stitcher.setWaveCorrection(true);
           stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
    
            __android_log_print(ANDROID_LOG_VERBOSE, "IN CPP", "Right before .stitch");
           Stitcher::Status status = stitcher.stitch(imgs, pano);
           __android_log_print(ANDROID_LOG_VERBOSE, "IN CPP", "HERE 2 Pano rows is : %d", pano.rows);
    
           if (status == Stitcher::OK)
           {
             __android_log_print(ANDROID_LOG_VERBOSE, "IN CPP", "STITCHING SHOULD WORK");
           }
    
    
           //pano.copyTo(srcRes);
    
           imwrite(FILEPATH, pano);
    
    }
    

    以下是项目符号#1的错误:

    04-22 20:51:47.192 32115-32651/aaron.picstitch E/cv::error(): OpenCVError Assertion failed (s >= 0) in void cv::setSize(cv::Mat&, int, int const*, const size_t*, bool), file /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/core/src/matrix.cpp, line 116
    04-22 20:51:47.192 32115-32651/aaron.picstitch A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 32651 (AsyncTask #1)
    

    另一个不是很大问题的奇怪问题是我在项目的Java部分使用 getNativeObjAddr()作为 Mat 对象,所以我可以将结果放入其中,但每当我尝试访问它时,我都会遇到段错误。不知道为什么会发生这种情况,但这个问题可以解决。

    对我的问题的任何想法都表示赞赏!

1 个答案:

答案 0 :(得分:0)

没有找出问题的解决方案。相反,我使用来自this example的代码重写了很多代码,然后一切都神奇地起作用。我仍然不知道出了什么问题,但至少我有工作代码。