2015-11-13 4 views
1

У меня есть код C++ OpenCV в моей папке jni приложения Android hello-jni.cpp. Я просто хочу найти и нарисовать convexhull, но причина hull[i] метод convexhull генерирует ошибку «недопустимые аргументы». Если я бросаю (vector<point>(hull[i])) программа работает и генерирует сообщение об ошибке:Недопустимые аргументы в ConvexHull Android ndk и Opencv

libc "Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)"

Любая помощь действительно очень ценится.

#include <jni.h> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <android/log.h> 
#include <opencv/cv.h> 
#include <vector> 
#include <cmath> 
#include <opencv2/opencv.hpp> 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define LOG_TAG "hellojni" 
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) 
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) 
#define ORIGCOL2ANDROIDORGCOL CV_BGR2BGRA 

using namespace std; 
using namespace cv; 

extern "C" { 

    JNIEXPORT jint JNICALL  Java_com_elmira_getconvexhull_MainActivity_convertNativeGray(
     JNIEnv*, jobject, jlong addrRgba, jlong addrGray); 
    JNIEXPORT jint JNICALL  Java_com_elmira_getconvexhull_MainActivity_convertNativeGray(
     JNIEnv*, jobject, jlong addrRgba, jlong addrGray) { 

     Mat& mRgb = *(Mat*)addrRgba; 
     Mat& mGray = *(Mat*)addrGray; 

     int conv = 0; 
     jint retVal; 

     Mat src; Mat src_gray; 
     src = mRgb; 

     cvtColor(src, src_gray, CV_BGR2GRAY); 
     blur(src_gray, src_gray, Size(3, 3)); 

     Mat src_copy = src.clone(); 
     Mat threshold_output; 
     vector<vector<Point> > contours; 
     vector<vector<Point> > hull(contours.size()); 
     vector<Vec4i> hierarchy; 
     int thresh = 100; 

     threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY || CV_THRESH_OTSU); 

     /// Find contours 
     findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 


     __android_log_print(ANDROID_LOG_INFO, "inmethod", "size %d *** %d", contours.size(), threshold_output.cols); 

     for (int i = 0; i < contours.size(); i++) 
     { 
      convexHull(Mat(contours[i]), hull[i], false, false); 
     } 
     retVal = (jint)conv; 
     return retVal; 
    } 
} 

ответ

2

При инициализации hull

vector<vector<Point> > contours; 
vector<vector<Point> > hull(contours.size()); 

hull размер 0, так как contours размер равен 0. Таким образом, при доступе к hull[i] вы обращаетесь за пределы.

Объявить hull после findContours:

findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
vector<vector<Point> > hull(contours.size()); 

Вы также можете просто позвонить convexHull как:

convexHull(contours[i], hull[i]); 

поскольку третий аргумент orientation ложен по умолчанию, и четвёртый аргумент returnPoints игнорируется, если Второй аргумент - std::vector.


thresh значение игнорируется при использовании THRESH_OTSU.


UPDATE

кажется, что есть некоторые проблемы с Android NDK. Простое решение является:

  • отключить ошибку недействительных аргументов или
  • использовать следующую

Код:

Mat mHull; 
convexHull(Mat(contours[i]), mHull, false, true); 
hull[i].assign(mHull.begin<Point>(), mHull.end<Point>()); 
+0

спасибо за вашу response сделала то, что вы сказали, но теперь программа запускается и генерирует эту ошибку: Ошибка OpenCV: утверждение не выполнено (! fixedSize() || len == ((vector *) v) -> size()/esz) в вирту al void cv :: _ OutputArray :: create (int, int const *, int, int, bool, int) const, file/hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/core/src/matrix. cpp, строка 1489 –

+0

@ elnaz.bfrhn работает нормально для меня. Где ваша ошибка? – Miki

+0

точно в этой линии выпуклыйHull (мат (контуры [i]), (вектор (корпус [i]))); –

Смежные вопросы