3

OpenCV で Mat を操作する最も速い方法は、最初に次のような適切なプリミティブ型の配列にコピーすることです。

byte[][] array = new byte[rows][cols];
for (int i = 0; i < rows; i++) {
    mat.get(i, 0, array[i]);
}

ただし、Java には符号なしの型がないため、これは符号なしの Mat 型 (例: ) を持つ OpenCV4Android では機能しません8U。すべての要素に 256 を追加しながら、次に大きいプリミティブ型 (ここでは short) の配列にコピーできます。

byte[] buf = new byte[cols];
short[][] array = new short[rows][cols];
for (int i = 0; i < rows; i++) {
    mat.get(i, 0, buf);
    for (int j = 0; j < cols; j++) {
        array[i][j] = (short) (buf[i]+256);
    }
}

もっと速い方法はありますか?

4

2 に答える 2

2

実際、Java は符号なしのプリミティブ型をサポートしていませんが、値を実際に算術演算する場合にのみ違いが生じます。8 ビットは、符号付きまたは符号なしの 8 ビットです。値を使用して何かを計算する必要がある場合は、はい - オーバーフローを回避するために、より大きな型 (実際には元の 2 倍) を使用する必要があり (符号付きバイト -127:128、符号なし: 0:255)、何らかの変換を行う必要があります。 「符号部分」を取り除きます (バイト & 0xFF の場合)。編集:これは一般的な回答です。私は OpenCV4Android を使用していません。特定のケースでは、メモリ消費の理由から符号なしの型を使用することが理にかなっているかもしれませんが、ライブラリは実際に必要な値をプラットフォームの正しい形式で出力すると思いますか?

于 2012-12-03T00:17:35.150 に答える