2016-06-20 13 views
5

Próbuję rozszyfrować android pictureCallback do skali szarości maty:Android jpeg pictureCallback do skali szarości OpenCV Mat

Najpierw próbowałem użyć rawPicture zwrotnego ale zawsze dostaję pustego wskaźnika.

mCamera.takePicture(null, mPicture, null); 

JpegCalback daje mi not null byte [] tablicy, ale konwersja cvtColor nie działa.

mCamera.takePicture(null, null, mPicture); 

Moja podgląd zwrotna jest to

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

Znalazłem kilka odpowiedzi, ale żaden z nich nie działa.

piszę obraz na sdcard z powodu testów, ale pisze pusty wizerunek 0 bajtów.

Więc, czy ktoś wie, jak ustawić piksele jpeg w szarym formacie?

+1

Jaka wartość zawiera len? Myślę, że mam podobny problem w przeszłości, ponieważ czas powrotu czasami zwraca 0, prawy len można obliczyć int mnożenia szerokości x wysokość – vgonisanz

+0

Masz rację, len to 0, nie zwracałem uwagi, ponieważ obraz był uszkodzony, ale , Nie widziałem żadnego błędu SIGSEV. Dzięki. – uelordi

Odpowiedz

1

Być może czas trwania nie działa poprawnie i powraca 0. Zwykle używam długości jako szerokości x wysokości, parametry podane do obliczenia rozmiaru tablicy. Spowoduje to prawidłowe skopiowanie danych z bufora aparatu do pamięci.

Ostrzeżenie: Jeśli coś jest nie tak z rozmiarem, otrzymasz wyjątek Signal 11!

Powiązane problemy