0
我正在Android中構建圖像處理項目。我通過相機捕獲位圖圖片,並通過JNI將其提供給opencv C++函數。將位圖轉換爲JNI中的Opencv :: Mat
首先,我使用保存的位圖圖片(PNG格式)測試我的opencv C++函數,並且它成功。
// in Android, save bitmap
Bitmap bmp = YUV_420_888_toRGB(img,img.getWidth(),img.getHeight());
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
Log.e(TAG,"saved successfully.)");
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d(TAG, "Error accessing file: " + e.getMessage());
}
// in opencv c++ function
Mat im = imread("/Users/Jun/Downloads/20170227/P9/1488167433596_frame.PNG");
// processing im
然後我將每個捕獲的位圖圖片送到同一個opencv C++函數。但是,檢測結果完全不同。我認爲在通過JNI將Java中的位圖轉換爲C++中的opencv mat時必定存在一些錯誤。請找到以下轉換代碼:
//Java side:
public static int[] detector(Bitmap bitmap) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int []pixels = new int[w*h];
bitmap.getPixels(pixels,0,w,0,0,w,h);
return detect(pixels,w,h);
}
private static native int[] detect(int pixels[],int w,int h);
// c++ side:
JNIEXPORT jintArray JNICALL Java_com_example_jun_helloworld_JNIUtils_detect(JNIEnv *env, jclass cls, jintArray buf, jint w, jint h) {
jint* cbuf = env->GetIntArrayElements(buf, false);
if (cbuf == NULL) {
return NULL;
}
Mat im(h, w, CV_8UC4, (unsigned char *) cbuf);
// processing im
這兩個「im」應該不同。有人能告訴我轉換中有什麼問題嗎?謝謝。
請注意,jint是32位長,而字符只是16. – mko
所以你的意思是「CV_8UC4」不正確? –
不可以,這一個:(無符號字符*)cbuf – mko