2014-04-17 12 views
6

Tôi đã triển khai ứng dụng android khởi động máy ảnh và gửi tất cả bộ đệm xem trước đến các thành phần gốc bằng giao diện JNI. Vì dữ liệu xem trước ở định dạng hình ảnh NV21, tôi cần tạo một cá thể cv :: Mat từ nó. Tôi đã tìm kiếm và tìm thấy giải pháp dưới đây:opencv C++ tạo đối tượng Mat từ bộ đệm dữ liệu hình ảnh NV21 android

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

where imagebuffer is jbyte* 

Tuy nhiên, không lấy được hình ảnh mong muốn trong hình ảnh đầu ra. Tất cả mọi người đều biết chính xác tôi có thể làm được điều đó?

Trả lời

13

Bạn cần chuyển đổi hình ảnh YUV thành hình ảnh RGBA.

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

Thông thường, hình ảnh YUV là 1 hình ảnh kênh với 1.5*height (nếu đó là hình ảnh RGB hoặc thang độ xám).

Hoặc bạn có thể tạo một mảng Mat và vượt qua jint mới cho hàm gốc và sử dụng mảng đó để đặt pixel của 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); 

Trong 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

Sau khi thực hiện việc này, hình ảnh có màu xanh lục. Làm thế nào để sửa lỗi này? –

+0

Tôi có cùng một vấn đề (tất cả màu xanh lá cây) Bạn có thể giải quyết vấn đề này không ?? – isra60

0

câu trả lời 1 có thể không làm việc hình ảnh màu sắc như chính xác. mã này là câu trả lời của tôi.

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); 
Các vấn đề liên quan