今回は前回編集したonCameraFrameメソッドの中の、2つのImgproc.resizeおよびif文の間に以下の文を加えます。
int imagewidth=mat.cols();//①
int imageheight=mat.rows();//①
byte[] ba=mat2ba(mat);//②
mat = null;
ba=ba4toba3(ba);//③
int imageArray[]=ba2ia(ba);//④
//ここで画像処理
ba=ia2ba(imageArray);//⑤
mat=ba2mat(imagewidth,imageheight,ba);//⑥
ba=null;
①はそれぞれ、matから画像の幅と高さを取得しています。この値は実機によって異なる値です。また、リサイズしている場合にはリサイズ後の値が入ります。
②はmatをbyte配列に変換するメソッドです。詳しいメソッド内容は後述します。この時点でのbyte配列は、一つの画素・ピクセルを4個のbyteで表しており、配列上ではred、green、blue、alphaの順に並んでいます。
③ではこのバイト配列を変換し、一つのピクセルを3個のbyteで表すように変換します。ここではbyte配列からalphaを削除します。
④ではbyte配列をint配列に変換します。このint配列は一つの画素を一つのintで表しており、255*16777216を固定のalpha値、65536の倍数をred、256の倍数をgreen、1の倍数をblueで表しています。このint配列が、このブログで行う画像処理の基本的な処理対象となります。
⑤では画像処理した後のint配列を一度byte配列に戻します。この時点でのbyte配列は③と同じく一つのピクセルを3個のbyteで表しています。
⑥ではbyte配列をmatに変換しています。この際、必ず画像の幅と高さが必要になります。
以上が今回の編集部分です。次に、各メソッドの内容を記載します。
mat2ba
public static byte[] mat2ba(Mat mat){
int dataSize=mat.cols()*mat.rows()*(int)mat.elemSize();
byte[] data = new byte[dataSize];
mat.get(0, 0,data);
mat=null;
return data;
}
ba4toba3
public byte[] ba4toba3(byte ba[]){
int length=ba.length;
int slash=length/4;
byte result[]=new byte[slash*3];
for(int i =0;i < slash;i++){
result[i*3]=ba[i*4];//r
result[i*3+1]=ba[i*4+1];//g
result[i*3+2]=ba[i*4+2];//b
}
ba=null;
return result;
}
ba2ia
public static int[] ba2ia(byte ba[]){
int length = ba.length/3;
int result[]=new int[length];
int r,g,b;
for(int i =0;i < length;i++){
r=ba[i*3]& 0xFF;
g=ba[i*3+1]& 0xFF;
b=ba[i*3+2]& 0xFF;
result[i]=rgb2int(r, g, b);
}
ba=null;
return result;
}
ba2iaで使用しているrgb2int (r、g、bの値をint型に変換する)
public static int rgb2int(int r,int g,int b){
return 255*16777216+r*65536+g*256+b;
}
ia2ba
public static byte[] ia2ba(int ia[]){
int length=ia.length;
int red,green,blue;
byte result[]=new byte[length*3];
int rgb=0;
for(int i =0;i < length;i++){
rgb = ia[i];
red = (rgb >> 16) & 0xff;
green = (rgb >> 8) & 0xff;
blue = (rgb) & 0xff;
result[i*3]=(byte)red;
result[i*3+1]=(byte)green;
result[i*3+2]=(byte)blue;
}
ia=null;
return result;
}
ba2mat (CvTypeでorg.opencv.core.CVTypeのインポートが必要)
public Mat ba2mat(int width,int height,byte pixels[]){
Mat mat = new Mat(height,width, CvType.CV_8UC3);
mat.put(0,0,pixels);
return mat;
}
以上が今回必要なメソッドです。実機で実行すると、これまでよりフレームレートの落ちたプレビューがみられるでしょうが、それ以外に変化はありません。
0 件のコメント:
コメントを投稿