2016-06-20 9 views
5

Ich versuche android pictureCallback in Graustufen Matte zu entschlüsseln:Android jpeg pictureCallback in Graustufen OpenCV Mat

Zuerst habe ich versucht, rawPicture Rückruf zu verwenden, aber immer ich Null-Zeiger zu bekommen.

mCamera.takePicture(null, mPicture, null); 

JpegCalback gibt mir nicht null byte [] Array, aber cvtColor Konvertierung funktioniert nicht.

mCamera.takePicture(null, null, mPicture); 

Meine Vorschau Rückruf ist diese

Camera.PictureCallback mPicture = new Camera.PictureCallback() { 
    @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 

     Toast.makeText(getApplicationContext(),"picture taken",Toast.LENGTH_SHORT); 
     int res=JniManager.setImage(data,m_width,m_height); 
     mCamera.stopPreview(); 
     mCamera.startPreview(); 
    } 
}; 

C++ JNI-Funktion:

Java_pidaas_vicomtech_org_facerec_viulib_JniManager_setImage(JNIEnv *env, 
                jobject instance, 
                jbyteArray image, 
                jint width, 
                jint height) 
    jbyte* _yuv = env->GetByteArrayElements(image, 0); 
    int len = env->GetArrayLength (image); 
    unsigned char* buf = new unsigned char[len]; 
    env->GetByteArrayRegion (image, 0, len, reinterpret_cast<jbyte*>(buf)); 
    Mat rawData (cv::Size(width,height), CV_8UC3, buf); 
      cv::Mat test =imdecode(rawData,CV_LOAD_IMAGE_COLOR); 
      cv::Mat grey; 
      cv::cvtColor(test, grey, cv::COLOR_BGR2GRAY); 
      bool flag = imwrite("/sdcard/graypg.jpg", grey); 
    env->ReleaseByteArrayElements(image, _yuv, 0); 
} 

ich einige Antworten gefunden haben, aber keiner von ihnen arbeitet.

I Bild auf der SD-Karte schreiben, weil der Prüfung, aber es schreibt ein leeres Bild von 0 Byte.

Also, weiß jemand, wie sollte ich JPEG-Pixel als graues Format bekommen?

+1

Welcher Wert enthält len? Ich denke, ich habe ein ähnliches Problem in der Vergangenheit, weil getarraylenght manchmal 0 zurückgibt, das korrekte len könnte int Multiplikation der Breite x Höhe – vgonisanz

+0

berechnen Sie haben Recht, das len ist 0, ich habe nicht aufgepasst, weil das Bild korrupt war aber Ich konnte keinen SIGESEV-Fehler sehen. Vielen Dank. – uelordi

Antwort

1

Vielleicht arbeitet die getarraylenghteigenschaft nicht und gibt 0 zurück. Ich benutze normalerweise Länge als Breite x Höhe, Parameter zur Berechnung der Arraygröße. Dadurch werden die Daten vom Kamerapuffer in den Speicher kopiert.

Warnung: Wenn etwas mit der Größe nicht stimmt, haben Sie eine Signal 11 Ausnahme!