2016-06-20 62 views
5

Sto cercando di decodificare pictureCallback Android a tappeto in scala di grigi:Android jpeg pictureCallback in scala di grigi Opencv Mat

In primo luogo ho provato ad usare rawPicture callback ma sempre ottengo puntatore nullo.

mCamera.takePicture(null, mPicture, null); 

JpegCalback non mi dà null byte [] array, ma la conversione cvtColor non funziona.

mCamera.takePicture(null, null, mPicture); 

mia anteprima di callback è questo

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++ funzione JNI:

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); 
} 

ho trovato alcune risposte ma nessuno di loro opere.

scrivo immagine sulla scheda SD a causa di test, ma scrive un'immagine vuota di 0 byte.

Quindi, qualcuno sa come devo ottenere pixel JPEG come formato grigio?

+1

Quale valore contiene len? Penso di avere un problema simile in passato perché getarraylenght a volte restituisce 0, la len corretta potrebbe essere calcolata moltiplicando int per larghezza x altezza – vgonisanz

+0

Hai ragione, la len è 0, non ho prestato attenzione perché l'immagine era corrotta ma , Non ho potuto vedere alcun errore SIGSEV. Grazie. – uelordi

risposta

1

Forse il getarraylenght non funziona correttamente e restituisce 0. Io di solito uso la lunghezza come larghezza x altezza, i parametri forniti per calcolare la dimensione dell'array. Questo copierà in modo efficace i dati dal buffer della fotocamera alla memoria.

Attenzione: se qualcosa non va con le dimensioni, si avrà un'eccezione Signal 11!