June 30, 2022
lhppx
を使ってビンゴボール最初と2回目の露出のためのグループ。 これは、今度は2つの露光だけでなく、照明後のCMOSセンサの回復と宿泊施設を可能にするために、2つの露光間のダミーフレーム時間も有意に遅くなります。そのため、撮像プロセス全体が実質的に100 msにかかる理由です。 スキャンされた画像の解像度は、8ビットのピクセル深さを持つ220×220ピクセルです。アナロググレースケールの画像は6ビットから構成され、グレースケールは実際にはグリーンスケールであるため、残りの2ビットはモニタの青と赤の色表現に使用されています。これらの追加のピクセルは、処理ステップ間の特殊なフラグピクセルとして、単一のステップモードで、青と赤の領域として使用されます。プログラムの開発とデバッグ中には、このことが非常に役立ちました。 プロセス全体を17ステップに分割します。これは、開発とデバッグの目的でシングルステップモードで実行することもできます。ステップ番号は、画面の左上隅に表示されます(下記参照)、右上の1 msの解像度のストップウォッチの現在の状態が表示されます。このようにして実行時間に従って各ステップを最適化するのが簡単でした。 ボールの場所と伸張 ボールを正確に位置決めするために、CX =ΣCixai/ΣAiおよびCy =ΣCiyai/ΣAiを使用して、重心(幾何学的中心)のX、Y座標が計算され、ここでCX、CYはX、Y座標、およびAはすべてのピクセルの値。このステップの前に背景が主に黒くなるにつれて、CX、CYは大まかにボールの中央になります。次に、フレームバッファ全体を2Dブロックとして移動させるので、重心はフレームの中心にある座標x = 110、y = 110にある。多くの場合、現像剤の利便性のための2×2赤ピクセル(ビット7)でマークされているため、多くの場合ビット6と7は無視されます。 次に、ボール径を測定し、異なる直径について周囲計の平均画素値を算出する。そして、背景(直径の外側のピクセル全てのピクセル)は、黒い領域のより良い絶縁を保証するために、「白」またはより具体的には緑(値0x3f)に設定される。バックグラウンドは、加工中に数倍以上に設定され、毎回黒(インク)または白(紙)の区域の選択が必要とされる。 球を平らな表面に完璧に変換することは不可能であるが、ステップ3の画像のように画像が非線形変形している場合、形状を改善することができる。小さい16ビットマイクロコントローラは算術演算コプロセッサーを持ち、標準の三角ライブラリを使用すると、プロセッサ時間が多すぎると消費されます。そのため、三角調ル検索テーブルが使用されていて、この場合、ストレッチ手順の実行時間がわずか11 msであったストップウォッチ(最上位の青い数字)で見ることができます。また、ボールの中央部分がほとんど変わらず、辺が非線形に伸びていることもわかり、球面変形が最小限に抑えられる。 ステップ4では、Photoshopのアンシャープマスク機能と同様に、新しいぼやけた画像が作成されます。他のフルフレームバッファ用の十分なRAMスペースがないので、44×44の解像度にスケールダウンされる補助画像上で行われる。 「紙」ピクセルに対する「インク」ピクセルのより良い選択を保証するので、アンシャープマスクの機能は非常に重要です。 「ビット7の設定」を選択すると、VGA画面上の赤い領域が発生します。 同じフレームバッファには、グレースケールの1つ(ビット0~5)と2進数が2つの画像があります(ビット7)。後者は前処理ステップ6で使用され、そこで小さな穴および引っかき傷が排除される。選択された画像は最初に拡張され縮小され、次に操作の購入が繰り返された状態でプロセスが繰り返されます。 コンポーネント操作 もっと多くの前処理ステップの後、もっと大きな操作が起こります。最初のものは「接続されたコンポーネント」として知られています。ここで、絶縁領域が選択され、それぞれのパラメータが取得されます。これには、XおよびYの寸法、XおよびY中心座標、選択されたピクセル数、およびフレームの中心からのユークリッドの距離が含まれます。これにより、すべてのコンポーネントを桁、大きな円、下線、または背景として並べ替えます。この段階では、数字に1桁または2桁が含まれている場合はまた明確になります。 このステップでは、約200ミリ秒の処理時間がかかります。もう1つの問題は、接続されたコンポーネントの標準アルゴリズムに同じサイズの補助フレームバッファを必要とするため、同じフレームバッファを利用する新しいアルゴリズムと短期座標のための小さなテーブルを作成しなければなりませんでした。 この時点で、プロセッサが認識のための最良の候補者を選択するのは簡単です – それはボールの中心から最小のユークリッドの距離を持つ円です。この円の内側に接続されたコンポーネントが考慮され、他のすべてが伸縮されます。 問題のボールは、下線が引かれた数字の特別なOCRボールです。o回転角を測定することができる。サークルの中心が既知であるので、プログラムは、360°の円を中心とした512のステップで、下線の形状に対応する仮想「T」形式を回転させ、それが含まれている「インク」ピクセルを数えた数値を数えます。最高の定格カウントは回転角を決定し、次にフレームバッファの2Dブロックを画像の最下隅に移動させ(左端の画像のステップ12)、ビットマップを反対側のコーナーに移動させる。フレームバッファの。対数検索テーブルのおかげで、この操作グループは50ミリ秒しかかかりません。 それはあらゆるステップで良くなるのを続けます。数字は異なる色で選択され、次に1桁の数字が安全な距離に移動され、次に各桁が30×46の既知の解像度にスケーリングされます。 認識 この読者が私の最初のOCRプロジェクトだったので、私は認識プロセスは解決するために最も難しい部分になるだろうとすべきです。各ステップが完全にデバッグされ、1つずつチェックされた後、私は17番目と最後のステップに達しました。私がすでに指摘したように、私の最初の計画はニューラルネットワークを選ぶことでしたが、私は簡単なアルゴリズムを試し、それを使って演奏しました。私はそれをいくつかのボールで評価し、私がそれが完全に動作しているのを見たときに私がどれほど衝撃を与えたのか想像できません!ついにビットマップは2つのASCII番号に正しくレンダリングされました。 アルゴリズムは非常に簡単です。各数字のビットマップは、最初に水平方向に、次に垂直に3つの部分に実際に分割されました。その後、アクティブピクセルをすべての列または行ごとにカウントし、ヒストグラムを作成しました。桁4および7でのクロスカット線のより良い検出を助けるために傾斜した第7のヒストグラムも追加されている。 各桁ごとに7つのヒストグラムを構築し、それらを事前に記録されたテーブルと比較するには、2つのヒストグラムを構築し、正規の誤差の合計を計算して結果をソートします。開発とデバッグを容易にするために、すべてのヒストグラムが画面にプロットされます。 比較結果が分類された後、私たちは各桁の勝者(この場合は8と5)を取得しますが、私たちの仕事はもっと多くのことが起こるまでは終わっていません。読み取りの質は評価されなければならないので、結果が十分に信頼性がある場合、コントローラは推定できるようになります。 ボールの数字が1桁しかない場合は、各桁のエラーのテーブル(0