2014-04-17 10 views
6

Mam zaimplementowałem aplikację Android, która uruchamia kamerę i wysyła cały bufor podglądu do natywnych komponentów przy użyciu interfejsu JNI. Ponieważ dane podglądu są w formacie obrazu NV21, muszę utworzyć z niego instancję cv :: Mat. Szukałem go i znalazłem poniższe rozwiązanie:opencv C++ tworzenie obiektu Mat z Android NV21 bufor danych obrazu

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

where imagebuffer is jbyte* 

Nie należy jednak oczekiwać oczekiwanego obrazu na wyjściowym obrazie. Wszystko jest wypełnione losowymi liniami itp. Czy ktoś wie, jak dokładnie mogę to zrobić?

Odpowiedz

13

Konieczna jest konwersja obrazu YUV na obraz RGBA.

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

Zazwyczaj obrazy YUV się 1 obrazów z kanałów 1.5*height (jeśli były RGB skali szarości).

Można też utworzyć nową Matę i przekazać tablicę Jint do natywnej funkcji i użyć tej tablicy do ustawienia pikseli bitmapy.

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

W Javie

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

Po wykonaniu tej czynności obraz jest cały zielony. Jak to poprawić? –

+0

Mam ten sam problem (cały zielony). Czy możesz rozwiązać ten problem? – isra60

0

1-szy odpowiedź może nie działa jako właściwy kolor obrazu. ten kod jest moją odpowiedzią.

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