доступ к MAT через указатель в opencv android JNI [дубликат]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

8
задан Saqib Razaq 30 March 2012 в 01:46
поделиться

2 ответа

Сегодня мне пришлось вернуть Mat из собственного кода. Я начал с «Tutorial 2 Advanced - 2. Mix Java + Native OpenCV», он уже передает два Mat (изображения, снятые с камеры) в собственный код. Но я хотел вернуть извлеченную функцию, поэтому я добавил jlong addrDescriptor к сигнатуре:

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4View_FindFeatures(JNIEnv* env, jobject thiz, jlong addrGray, jlong addrRgba, jlong addrDescriptor)
{
    Mat* pMatGr=(Mat*)addrGray;
    Mat* pMatRgb=(Mat*)addrRgba;
    Mat* pMatDesc=(Mat*)addrDescriptor;
    vector<KeyPoint> v;

    //OrbFeatureDetector detector(50);
    OrbFeatureDetector detector;
    OrbDescriptorExtractor  extractor;
    detector.detect(*pMatGr, v);
    extractor.compute( *pMatGr, v, *pMatDesc );
    circle(*pMatRgb, Point(100,100), 10, Scalar(5,128,255,255));
    for( size_t i = 0; i < v.size(); i++ ) {
        circle(*pMatRgb, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(255,128,0,255));
    }
    }
}

В java-части я добавил Mat

private Mat descriptor;
descriptor = new Mat();

Метод getNativeObjAddr() делает трюк. Мать выделяется в java, и его адрес передается на нативный код, поэтому нет явного возвращения.

FindFeatures(mGraySubmat.getNativeObjAddr(), mRgba.getNativeObjAddr(), descriptor.getNativeObjAddr());
Log.i("desc:"  , descriptor.dump());

Mat был заполнен необходимыми данными и напрямую доступен в java код после возвращения вызова JNI.

Где-то еще в коде Mat выдается:

if ( descriptor != null) 
  descriptor.release();
descriptor = null;
21
ответ дан stacker 28 August 2018 в 02:31
поделиться

в C ++

jlong funC(){
Mat *mat = new Mat();
//...
return (jlong)mat;
}

в java:

long = addr;// addr is return from c method funC()
Mat mat = new Mat(addr);

Внимание: вы должны новый Mat () в C, если вы код: Mat mat (); mat память объекта будет собираться при завершении функции funC ().

1
ответ дан K Lam 28 August 2018 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: