画像から浮動小数点座標を生成する際に問題が発生しました。
元の問題は次のとおりです。入力画像は手書きのテキストです。これから、個々の文字を構成する一連のポイント (x、y 座標のみ) を生成したいと考えています。
最初に、ポイントを生成するために findContours を使用しました。これは文字のエッジを検出するため、最初に細線化アルゴリズムを実行する必要があります。これは、文字の形状には関心がなく、線のみ、またはこの場合のようにポイントであるためです。
入力:
薄化:
したがって、間引きアルゴリズムを使用して入力を実行すると、すべて問題なく、出力は良好に見えます。ただし、これで findContours を実行してもうまくいきません。多くのものがスキップされ、使用できないものになってしまいます。
2 番目のアイデアは、バウンディング ボックスを (findContours を使用して) 生成し、これらのバウンディング ボックスを使用して細線化プロセスから文字を取得し、白以外のすべてのピクセル インデックスを「ポイント」として取得し、それらをバウンディング ボックスの位置でオフセットすることでした。これはさらに悪い出力を生成し、悪い方法のように思えます。
このための恐ろしいコード:
Mat temp = new Mat(edges, bb);
byte roi_buff[] = new byte[(int) (temp.total() * temp.channels())];
temp.get(0, 0, roi_buff);
int COLS = temp.cols();
List<Point> preArrayList = new ArrayList<Point>();
for(int i = 0; i < roi_buff.length; i++)
{
if(roi_buff[i] != 0)
{
Point tempP = bb.tl();
tempP.x += i%COLS;
tempP.y += i/COLS;
preArrayList.add(tempP);
}
}
代替手段はありますか、それとも何かを見落としていますか?
アップデート:
ポイント (ピクセル) を並べ替える必要があるという事実を見落としていました。上記の方法では、すべてのピクセルを取得するためのスキャンライン アプローチを実行するだけです。たとえば、「o」を見ると、最初に左側のポイントが取得され、次に右側のポイントが取得されます。後で(opencvの外で)ポイントでパスを描画したいので、それらを隣接するピクセルで並べ替える必要があります。これは可能ですか?