2013-12-05 2 views
0

Я использую opencv-sdk-android. Я хочу, чтобы мой родной код возвращал ключевой вектор. Является ли это правильно использовать такой код ..Получение ключевой точки от исходного кода

Vector<KeyPoint> keypoint = FindFeatures(Gray1.getNativeObjAddr(),descriptor.getNativeObjAddr());

и

public native Vector<KeyPoint> FindFeatures(long matAddrGr1, long matAddrGr2); 

Мой natice код

extern "C" { 
JNIEXPORT Vector<KeyPoint> JNICALL Java_com_example_xyz_MainActivity_FindFeatures(JNIEnv*, jobject, jlong addrGray1, jlong addrdescrptor); 

JNIEXPORT Vector<KeyPoint> JNICALL Java_com_example_xyz_MainActivity_FindFeatures(JNIEnv*, jobject, jlong addrGray1, jlong addrdescrptor) 
{ 
    Mat& mGr1 = *(Mat*)addrGray1; 
    Mat& descriptors_1 = *(Mat*)addrdescrptor; 
    vector<KeyPoint> keypoint_1; 

    //Do some processing here.. 

    return keypoint_1; 
} 
} 

Если нет, пожалуйста, предложить мне способ заселение вместо себя иного достижения. я новичок в opencv.

+0

Да, это должно работать нормально. вы получили какие-либо ошибки, когда пытаетесь его реализовать? – Darshan

+0

Да, после вызова метода native приложение получает сбой. –

+0

Прошу прощения, я не полностью проверил код. Это не сработает, потому что Vector не является стандартным JNI [type] (http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html#wp9502). вам нужно будет использовать указатели (* env), чтобы получить данные на стороне java. – Darshan

ответ

4

У меня была такая же проблема, и я решил ее с помощью этой части кода.

Прежде всего в Java коде я объявил функции FindFeatures, как это:

public native KeyPoint[] FindFeatures(long matAddrGr1, long matAddrGr2); 

И мой родной код:

JNIEXPORT jobjectArray JNICALL Java_com_example_mipatternrecognition_Reconocimiento_FindFeatures(
    JNIEnv* env, jobject, jlong matAddrGr1, jlong matAddrGr2) { 
    Mat& mGr = *(Mat*) matAddrGr1; 
    Mat& mRgb = *(Mat*) matAddrGr2; 
    vector <KeyPoint> keyPoints_1; 

    //Do some processing... 

    // Get a class reference for org/opencv/features2d/KeyPoint 
    jclass cls = env->FindClass("org/opencv/features2d/KeyPoint"); 
    // Get the Method ID of the constructor (Float,Float,Float,Float,Float,Integer,Integer) 
    jmethodID midInit = env->GetMethodID(cls, "<init>", "(FFFFFII)V"); 
    // Call back constructor to allocate a new instance 
    jobjectArray newKeyPointArr = env->NewObjectArray(keyPoints_1.size(), cls, NULL); 

    for (unsigned int i = 0; i < keyPoints_1.size(); i++) { 
     jobject newKeyPoint = env->NewObject(cls, midInit, keyPoints_1[i].pt.x, 
      keyPoints_1[i].pt.y, keyPoints_1[i].size, keyPoints_1[i].angle, 
      keyPoints_1[i].response, keyPoints_1[i].octave, 
      keyPoints_1[i].class_id); 
     env->SetObjectArrayElement(newKeyPointArr, i, newKeyPoint); 
    } 

    return newKeyPointArr; 
} 

Я надеюсь, что это помогает вам ...

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