4

画像から浮動小数点座標を生成する際に問題が発生しました。

元の問題は次のとおりです。入力画像は手書きのテキストです。これから、個々の文字を構成する一連のポイント (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の外で)ポイントでパスを描画したいので、それらを隣接するピクセルで並べ替える必要があります。これは可能ですか?

4

1 に答える 1

1

独自の接続されたコンポーネントのラベル付けの実装を検討する必要があります。概念は非常に単純です。最初の行をスキャンし、水平方向に接続されたピクセルの各ストリップに固有のラベルを割り当てます。基本的に、すべてのピクセルが左隣に接続されているかどうかを確認し、その隣のラベルまたは新しいラベルを割り当てます。2 行目でも同じことを行いますが、その上のピクセルもチェックします。ラベルのマージが必要になる場合があります。前の行で接続されていなかった 2 つのストリップが現在の行で結合されます。これに対処する方法は、ラベルの等価性のリストを保持するか、ラベルへのポインターを使用することです (オブジェクトの完全なラベル変更を簡単に行うことができます)。

これは基本的に findContours が行うことですが、自分で実装すると、8 連結性を実現し、1 ピクセルまたは 2 ピクセルのギャップを埋める自由さえあります。そうすれば、「ほぼ接続されたコンポーネントのラベル付け」が得られます。例の写真の「w」にはこれが必要なようです。

このように画像にラベルを付けたら、1 つのラベルのすべてのピクセルをベクトルにプッシュし、次のように並べ替えることができます。左上のピクセルを見つけて新しいベクトルにプッシュし、元のベクトルから消去します。元のベクトルで最も近いピクセルを見つけ、それを新しいベクトルにプッシュして、元のベクトルから消去します。すべてのピクセルが転送されるまで続行します。

この方法ではそれほど速くはありませんが、開始する必要があります。

于 2013-08-20T15:05:15.083 に答える