私は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++関数に送ります。ただし、検出された結果はまったく異なります。 JavaのビットマップをC++のopencv matにJNIを通して変換するときに、いくつかのエラーがあるはずです。下記の変換コードをご覧ください:
//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
2つの "im"は異なるはずです。誰かが変換で間違っていることを教えてもらえますか?ありがとう。
jintの長さは32ビットで、charは16であることに注意してください。 – mko
"CV_8UC4"は間違っていますか? –
いいえ、この1つ:(unsigned char *)cbuf – mko