Android JNI画像を伝達パラメータとして2
779 ワード
前編ではAndroid JNIピクチャが伝達パラメータとしてアドレス伝達方式を用いることが望ましいが,ピクチャをint型配列に変換する方法に問題があるのは,一つのピクチャをint型配列に変換する際に
Bitmap img1 = ...;
int[] pix = new int[w * h];
img1.getPixels(pix, 0, w, 0, 0, w, h);
ここでpixの各要素は1つの画素を表し、各要素は4バイトあり、各バイトは1つのチャネルを表し、pixをJNI関数に渡すとき
Mat myimg(h, w, CV_8UC3, (unsigned char*)cbuf);
これは間違っています.まず、3つのチャネルのMatを構築したい場合、cbufのデフォルトは4つのチャネルです.もちろん間違っています.そうすることができます.
Bitmap img1 = ...;
int[] pix = new int[w * h];
img1.getPixels(pix, 0, w, 0, 0, w, h);
ここでpixの各要素は1つの画素を表し、各要素は4バイトあり、各バイトは1つのチャネルを表し、pixをJNI関数に渡すとき
Mat myimg(h, w, CV_8UC3, (unsigned char*)cbuf);
これは間違っています.まず、3つのチャネルのMatを構築したい場合、cbufのデフォルトは4つのチャネルです.もちろん間違っています.そうすることができます.
for (int i=0; i<h; i++)
{
for (int j=0; j<w; j++)
{
myimg.at<Vec3b>(i,j)[0] = (uchar)(cbuf[i*w+j]& 0x000000ff);
myimg.at<Vec3b>(i,j)[1] = (uchar)((cbuf[i*w+j]& 0x0000ff00) >> 8);
myimg.at<Vec3b>(i,j)[2] = (uchar)((cbuf[i*w+j]& 0x00ff0000) >> 16);
}
}