OpenCV4AndroidでMatの個々の要素にアクセスして変更する標準的な方法は何ですか? また、BGR (デフォルトだと思います) とグレースケールのデータの形式は何ですか?
編集:これをより具体的にしましょう。mat.get(row, col) は double 配列を返します。この配列には何がありますか?
3 に答える
一部のピクセルにアクセスしたいだけの場合は、double[] get(int row, int col)を使用し、 put(int row, int col, double... data)を使用して書き込みます。画像全体にアクセスしたり、画像のデータをループで反復したりすることを考えている場合、Mat データを Java プリミティブ データ型にコピーすることをお勧めします。データ操作が完了したら、データを Mat 構造にコピーするだけです。
画像はCV_8Uを使用します。グレースケール画像の場合はCV_8UC1を使用し、RGB 画像の場合はCV_8UC3 (CV_8U の 3 チャンネル) のマットを使用します。CV_8Uは Java のバイトに相当します。:)
Java (Android プラットフォーム)でグレースケール画像を2 値化するために使用する方法の例を示します。
private Mat featuresVectorBinarization(Mat fv){
int size = (int) fv.total() * fv.channels();
double[] buff = new double[size];
fv.get(0, 0, buff);
for(int i = 0; i < size; i++)
{
buff[i] = (buff[i] >= 0) ? 1 : 0;
}
Mat bv = new Mat(fv.size(), CvType.CV_8U);
bv.put(0, 0, buff);
return bv;
}
それが役立つことを願っています。
OpenCV の Mat オブジェクトについて学んだことで理解できたのは、Mat は W x H ピクセルの任意の画像を表すことができるオブジェクトであるということです。
次に、画像の中心ピクセルにアクセスしたいとしましょう
X = W/2 Y = H/2
次に、次のようにピクセル データにアクセスできます double[] data = matObject.get(x,y);
データは何を表し、データ配列のサイズは何ですか。それは画像の種類によって異なります。画像がグレースケールの場合、 data.length = 1 、チャネルが1つしかないため、 data[0] はそのピクセルの色値を表します。0(黒)~255(白)
画像がカラー画像の場合、 data.length = 4(rgba) 、4 つのチャネルがあり、 data[0-n] がそのピクセルのカラー値を表すため