2014-04-17 8 views
6

Ho implementato un'applicazione Android che avvia la fotocamera e invia tutto il buffer di anteprima ai componenti nativi utilizzando l'interfaccia JNI. Poiché i dati di anteprima sono in formato immagine NV21, devo creare un'istanza cv :: Mat da esso. L'ho cercata e ho trovato la soluzione seguente:opencv C++ crea oggetto Mat da Android NV21 image data buffer

cv::Mat _yuv(height, width, CV_8UC1, (uchar *) imagebuffer); 

where imagebuffer is jbyte* 

Tuttavia, non ottenere l'immagine prevista nell'immagine di output. È tutto pieno di righe casuali, ecc. Qualcuno sa esattamente come posso farlo?

risposta

13

È necessario convertire l'immagine YUV in immagine RGBA.

cv::Mat _yuv(height+height/2, width, CV_8UC1, (uchar *)imagebuffer); 
cv::cvtColor(_yuv, _yuv, CV_YUV2RGBA_NV21); 

Solitamente, le immagini sono YUV 1 immagini canale con 1.5*height (se fosse un RGB o scala di grigi).

Oppure è possibile creare un nuovo Mat e passare l'array Jint alla funzione nativa e utilizzare tale array per impostare i pixel di bitmap.

jint *_out = env->GetIntArrayElements(out, 0);  

cv::Mat _yuv(height + height/2, width, CV_8UC1, (uchar*)imagebuffer); 
cv::Mat _rgba(height, width, CV_8UC4, (uchar *)_out); 

cv::cvtColor(_yuv, _rgba, CV_YUV2RGBA_NV21); 

env->ReleaseIntArrayElements(out, _out, 0); 

In Java,

bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
pixels = new int[width * height]; 

native_function(height, width, bytedata, pixels); 

bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
+0

Dopo aver eseguito questa operazione, l'immagine è tutta verde. Come correggere questo? –

+0

Ho lo stesso problema (tutto verde) Potresti risolvere questo ?? – isra60

0

prima risposta non può funziona come immagine a colori corretta. questo codice è la mia risposta.

cv::Mat yuv(height+height/2, width, CV_8UC1,(uchar *)nv21ImageBuffer); 
    cv::Mat converted(height, width, CV_8UC3); 
    cv::cvtColor(yuv, converted, CV_YUV2BGR_NV21); 
    cv::imwrite("anywhere/colorImage.jpg",converted);