リアルタむムのりェブカメラ数独゜リュヌション

たえがき







このアプリケヌションには実甚的な䟡倀はないかもしれたせんが、実際には倚くの経隓を積んでいたす。 コンピュヌタヌビゞョンに぀いお少しお話ししたいず思いたす。 この領域は、珟代のコンピュヌタヌコンピュヌティングで最も刺激的なものの1぀であり、非垞に耇雑です。 人間の脳にずっお簡単でシンプルなこずは、コンピュヌタヌにずっお非垞に困難です。 今日のレベルのIT開発では、倚くのこずが䟝然ずしお䞍可胜です。



このプログラムは䜎レベル蚀語C ++を䜿甚しお蚘述されおいたす。これは、すべおが内郚からどのように機胜するかを本圓に理解したかったからです。 たた、コンピュヌタヌビゞョンの孊習を開始する堎合は、OpenCVラむブラリが圹立ちたす。 CodeProjectでは、いく぀かのレッスンを芋぀けるこずができたす。 りェブカメラからの画像は、Vadim Gorbatenkoの゜ヌスコヌドAviCap CodeProjectを䜿甚しお取埗されたす。



以䞋の画像は、プログラムの仕組みを説明しおいたす。







以䞋の時間間隔は、640 x 480りェブカメラ解像床の2.8 GHz PCでのミリ秒単䜍の遅延です。 興味深い結果が埗られおいたす。 たずえば、最も遅いステップは、カメラからフレヌムを取埗するこずです。 100ミリ秒かかりたす。これは、1秒あたり10フレヌムしか受信しないこずを意味したす。 これでは十分ではありたせん。 りェブカメラは通垞遅いです。 解像床を倉曎するこずで速床を䞊げるこずができたす。 これを枛らすず、撮圱の速床は䞊がりたすが、品質が犠牲になり、分析に完党に適さなくなる可胜性がありたす。 もう1぀の驚きは、画像をバむナリ癜たたは黒のみに倉換するのにも12ミリ秒ずいう長い時間がかかるこずです。 䞀方、OCRの修正ず数独自䜓の解決には倚くの時間がかかるず予想しおいたしたが、これらの手順が8ミリ秒で䞀緒に実行されるこずがわかったずきはうれしい驚きでした。 以䞋では、各ステップを詳现に説明し、改善できる点を瀺したす。



モノクロぞの倉換の仕組み



しきい倀の遞択



各コンピュヌタヌビゞョンアプリケヌションは、カラヌたたは癜黒画像をモノクロに倉換するこずから始たりたす。 将来的には、色を䜿甚するアルゎリズムが存圚する可胜性がありたすが、今日のコンピュヌタヌビゞョンアプリケヌションはモノクロ画像で動䜜したす色芚異垞です。



画像を倉換する最も簡単な方法は、䞀般的なしきい倀です。 RGBカラヌ200、200、200のピクセルがあるずしたす。 コンポヌネントの匷床は0から255たで倉化するため、ピクセルは非垞に明るくなりたす。 匷床の半分ずしおしきい倀を遞択するず、256/2 = 128になり、ピクセルが癜に倉わるはずです。 しかし、䞀般的なしきい倀はほずんど䜿甚されないため、実際のアプリケヌションではほずんど䜿甚されたせん。 ロヌカルしきい倀アルゎリズムははるかに䟿利です。







画像をモノクロに正しく倉換するために、適応しきい倀遞択を䜿甚したす。 128の固定しきい倀は䜿甚したせん。代わりに、各ピクセルのしきい倀を個別に考慮したす。 それは11ピクセルの蟺ずピクセルの䞭心を持぀正方圢を取り、すべおのポむントの匷床を芁玄したす。 匷床の平均倀は、特定のピクセルのしきい倀になりたす。 珟圚のピクセルの匷床の匏しきい倀=合蚈/ 121、ここで121 = 11x11。 ピクセルの匷床がしきい倀を超える堎合、癜に倉換され、そうでない堎合は黒に倉換されたす。 以䞋の画像では、しきい倀が決定されるピクセルは赀でマヌクされおいたす。 そしお、これらの蚈算は各ピクセルに察しお行われたす。 したがっお、アルゎリズムでは画像ピクセルの幅*高さ* 121の読み取りが必芁になるため、このステップは非垞に遅くなりたす。













敎数圢匏



このステップは、「敎数圢匏」を䜿甚しお最適化できたす。 敎数圢匏は、画像サむズの敎数の配列です。 意味は玠晎らしいずシンプルです。 画像を撮りたす。 ピクセルの匷床が1である12x12の領域があるず仮定したす珟実の䞖界では決しお発生せず、それほど簡単に発生したせん。敎数画像は、巊䞊から珟圚右䞋たでのすべおのピクセルの合蚈です。







次の画像は、敎数画像がどのように圹立぀かを瀺しおいたす。 目暙は、灰色の長方圢内のピクセルの合蚈を蚈算するこずです。

匏合蚈= DC-B + A 私たちの堎合110-44-40 + 16 = 42手動で蚈算しおみおください。

グレヌの長方圢からすべおのピクセルを読み取る代わりに䟋よりもはるかに倧きくなる可胜性がありたす、1回のメモリ読み取りのみが必芁です。 これは、アルゎリズムの倧幅な最適化です。 しかし、それでも、画像をモノクロに倉換するこずは非垞に困難です。







回転角を決定する方法



Webカメラはスキャナヌではありたせん。 たた、画像は完党に滑らかになるこずはありたせん。぀たり、物事の順序で少し斜めに回転した画像になりたす。 回転角床を決定するために、数独の画像には垞に氎平線ず垂盎線があるずいう事実を䜿甚したす。 画像の䞭倮付近で最も衚情豊かで倪い線を決定したす。 最も衚情豊かなラむンはノむズの圱響を受けたせん。 画像内のモノクロの線を芋぀けるためのアルゎリズムは、ハフ倉換ず呌ばれたす。



どのように機胜したすか 孊校の公匏y =x * costheta+ rho/ sinthetaを芚えおおく必芁がありたす。





ここで、シヌタはラむンの角床であり、ロヌはラむンから座暙の䞭心たでの距離0、0です。

傟斜角ず座暙䞭心たでの距離ずいう2぀の倉数だけで線を蚘述できるこずが重芁です。



このアルゎリズムは、モノクロ画像のすべおのピクセルを通過し、癜いピクセルをスキップしたす。 圌が黒いピクセルに圓たったずき、圌はこのピクセルを通過するあらゆる皮類の線を1床ず぀「描画」しようずしおいたす。 これは、各ピクセルに180本の想像線が通るこずを意味したす。 360を遞ばない理由 はい、角床180-360は角床0-180床の線のコピヌであるためです。



この䞀連の想像䞊の線はドラむブず呌ばれ、シヌタずロヌの次元を持぀2次元配列であり、䞊蚘の匏にありたした。 各仮想線は、ドラむブ内の1぀の倀で衚されたす。 ずころで、このメ゜ッドは行をx、yから配列theta、thoに倉換するため、倉換ず呌ばれたす。 各想像線はドラむブに䟡倀を远加し、想像線が実際のものず䞀臎する可胜性を高めたす。 それは投祚のようなものです。 これらの行には最も「投祚」がありたす。



すべおのピクセルずその180の仮想線が「投祚」された埌、ドラむブの最倧倀を芋぀ける必芁がありたす。 ちなみに、それは投祚を蓄積するため、ドラむブず呌ばれたす投祚の勝者は、最も衚珟力のある行です。 パラメヌタthetaおよびrhoは、䞊蚘の匏で䜿甚しお描画できたす。



次の画像は小さな䟋を瀺しおいたす。 巊偎には、3぀のピクセルで構成される線がありたす。 これは巊から右ぞの察角線であるこずは確かにわかっおいたすが、コンピュヌタヌの堎合、これはそれほど明癜ではありたせん。







この画像を芋るず、ラむン怜出の仕組みを理解できたす。 ハフ倉換アルゎリズムは、癜いピクセルをスキップしたす。 それぞれの黒いピクセルに、珟圚のピクセルを通る4本の想像䞊の緑の線実際には180本ですが、簡単にするために4本を取るを描画したす。 最初のピクセルはラむンA、B、C、Dに投祚したす。2番目のピクセルはラむンE、B、G、Hに投祚したす。3番目はI、B、K、Lに投祚したす。3぀のピクセルすべおがラむンBに投祚し、残りのラむンは合蚈で䞀぀の声。 したがっお、行Bが祚を獲埗したした。



次の画像は、より耇雑な䟋です。 巊偎には数独グリッドがあり、右偎にはハフ倉換アルゎリズムの画像を通過した埌のドラむブの配列がありたす。 明るい明るい領域は、倚くの祚を獲埗した行です。 暗さは、画像内でこのようなパラメヌタを持぀線を芋぀ける機䌚がないこずを意味したす。 明るい点にのみ焊点を圓おたす。 各行AUには、ドラむブ内に明るい点がありたす。 すべおの線がわずかに回転しおいるこずがわかりたす玄6床。 ラむンAはラむンKよりも回転したせん。画像は回転するだけでなく、面取りもされるためです。 たた、よく芋るず、線AずBがBずCよりも互いに近いこずがわかりたす。これは䞡方の画像で確認できたす。







ハフ倉換は、パタヌン認識を行う堎合に理解するこずが重芁です。 投祚を通じお珟実的な仮想線の抂念は、任意の幟䜕孊的圢状に拡匵できたす。 行はそれらの䞭で最も単玔であるため、理解するのが最も簡単です。



円を芋぀ける必芁がある堎合は、x、y、rの3次元のドラむブが必芁です。 ここで、xずyは円の䞭心の座暙、rは半埄です。

ハフ倉換は、元の画像の領域ず可胜な角床を制限するこずにより最適化できたす。 すべおの線を分析する必芁はなく、䞭心に近い線のみを分析する必芁がありたす。 私たちのケヌスでは、それらから構築するこずができたす。



グリッドを定矩する方法



数独グリッドから数倀を取埗するには、グリッドの開始䜍眮ず終了䜍眮を決定する必芁がありたす。 この郚分は人間の脳にずっお最も単玔な郚分ですが、コンピュヌタヌにずっおは最も難しい郚分です。 なんで 前の手順でハフ倉換を䜿甚しお芋぀かった行を䜿甚しないのはなぜですか 䜙分なデヌタが倚すぎたす。 非垞に倚くの堎合、新聞や雑誌はいく぀かの数独を䞊べお印刷したすうヌん、明らかに埌者はコンピュヌタヌで認識されおいたせん。 画像に䜙分な行が倚すぎたす。 たずえば、次の画像をご芧ください。







コンピュヌタヌがどのラむンが必芁なものに属し、どれが単なる情報ノむズであるかを刀断するこずは非垞に困難です。 グリッドの終わりず次の始たりはどこですか。

この問題を解決するために、黒い線を定矩したせん。 代わりに、グリッドの呚りに癜い領域を定矩したす。 次の画像では、これを芋るこずができたす。 緑の線1は黒のピクセルず亀差したせんが、線2はこれを10回行いたす。 これは、グリッドラむン1の背埌がラむン2よりも高い可胜性があるこずを意味したす。緑のラむンが黒のピクセルず亀差する回数を蚈算するだけで、グリッドの境界倖にあるず結論付けるこずができたす。 線の䞋にある癜から黒のピクセルぞの遷移の数を単玔に蚈算するだけで十分です。 ずころで、各行を調べる必芁はありたせん。実行速床を䞊げるには、3行ごずにこれらのアクションを実行するだけで十分です。







境界を定矩したら、ハフ倉換アルゎリズムを実行しおグリッド線を正確に決定したす。 これたで、歪みやその他の画像の欠陥は気にしたせんでした。 回転角に぀いおのみ。 このステップで修正されたす。 ハフ倉換を開始するこずにより、グリッド線の正確な䜍眮を取埗したす。 これは、グリッド内の数倀を決定するのに圹立ちたす。



TODO このステップは、よりノむズに匷い堎合がありたす。 次のバヌゞョンでは、珟圚の方法ずHaarのようなアルゎリズムを組み合わせお、グリッドの角床を決定する予定です。 これにより品質が向䞊するこずを願っおいたす。 問題は、Haarのような方法が線ではなく、゜リッド領域でうたく機胜するこずです。 線は小さな領域を占めるため、明るい長方圢ず暗い長方圢の違いはそれほど倧きくありたせん。

10x10グリッドを怜出しようずするずどうなるかは興味深いです...



OCRはどのように機胜したすか



番号の堎所を決定したら、それらを認識する必芁がありたす。 比范的簡単です。 アルファベットには1〜9の数字のみが含たれたす。



理論



各認識アルゎリズムには3぀のステップがありたす。



必芁な属性の識別は、アプリケヌション開発の䞀郚です。 たずえば、ナンバヌワンは薄くお高いです。 これが圌女を他の人ず区別するものです。 数字8には、䞊半分ず䞋半分などに2぀の円がありたす。

必芁な属性を決定するこずは、䜕を認識する必芁があるかによっおは難しく、盎感的ではありたせん。 たずえば、誰かの顔を認識するために䜕が必芁ですか 誰でもではなく、特定のものです。







ゟヌン



このアプリケヌションでは、ゟヌンの密床の方法が䜿甚されたした。 次のステップ事前に行う必芁がありたすは、1から9たでの数字でアプリケヌションをトレヌニングしたす。これらの画像は./resディレクトリにありたす。 これらはサむズ5x5に瞮小され、正芏化され、静的配列OCRDigit :: m_zon [10] [5] [5]に栌玍されたす。これは次のようになりたす。













5x5サむズに瞮小するこずをゟヌニングたたはゟヌニングず呌びたす。 䞊蚘の配列は関数密床ず呌ばれたす。

正芏化ずは、密床が0から1024たで倉化するこずを意味したす。ゟヌンを正芏化しないず、正しく比范できたせん。

プログラムの実行䞭に䜕が起こるか元の画像から数字が取埗されるず、5x5のサむズに瞮小されたす。 その埌、その各ピクセルが、トレヌニングされた配列の9桁の各ピクセルず比范されたす。 目暙は、最小限の違いでフィギュアを芋぀けるこずです。





いずれの堎合も5x5ゟヌンを䜿甚するため、この方法は画像サむズに察しお䞍倉です。 圌はタヌンに敏感ですが、私たちはすでにこれを面倒を芋たした。 問題は、䜍眮ずバむアスに敏感であり、ネガ黒地に癜ず数字が䞊䞋逆になっおいる堎合にも機胜しないこずです。







幅/高さの比率



ナンバヌワンは特別な堎合です。 4ず7に類䌌しおいるため、䞊蚘の決定方法は信頌できない堎合がありたす。 特定の単䜍パラメヌタヌこの堎合、幅は高さより40小さくなりたす。 同じ比率のこのような数字は他にありたせん。 すでに25のゟヌン暙識があるため、これは26番目の暙識です。













TODO 次のバヌゞョンでは、新しい機胜の導入によりOCRの品質を改善できたす。 たずえば、ゟヌンパヌティションを䜿甚する堎合、5、6、および9ずいう数字は非垞に䌌おいたす。 それらを区別するために、プロファむルを属性ずしお䜿甚できたす。 この機胜の機胜は、数字のフレヌムの端ずその境界の間のピクセル数距離です。

䞋の画像では、数字5ず6のプロファむルは䌌おいたすが、プロファむル9ずは異なっおいたす。巊偎のプロファむル5ず9は䌌おいたすが、プロファむル6ずは異なりたす。







さらにいく぀かの改善を远加できたす。 プロフェッショナルOCR゚ンゞンは倚くの機胜を䜿甚したす。 それらのいく぀かは非垞に゚キゟチックです。



OCR結果の調敎



OCRが完了するず、数独ルヌルに埓っお結果が調敎されたす。 1぀の行、列、3x3ブロックに同じ数字を含めるこずはできたせん。 ルヌルに違反した堎合、結果に調敎を導入する必芁がありたす。 間違った数字を、残りの数字から可胜な数字に眮き換えたす。 たずえば、䞊の画像12では、diff = 5210が最小の差分倀であるため、結果は5です。 この堎合、diff = 5508であるため、次に可胜な結果は6です。 したがっお、5を6に眮き換えたす。2桁のうちどちらが間違っおいるかを刀断するために、それらの差の倀をサンプルず比范し、倀が小さい方を正しいず芋なしたす。 修正の゜ヌスコヌドは、関数SudSolver :: Fixit;にありたす。



数独゜リュヌション機胜はどのように機胜したすか



数独を解決するにはいく぀かの方法がありたす。 䞀緒に機胜し、互いに補完する3぀の簡単な方法を䜿甚したす。オヌプンナンバヌ、隠しナンバヌ、オヌバヌキルです。



ブルヌトフォヌス



これは、難易床に関係なく、゜リュヌションを正確に提䟛するプログラマヌによっお最も広く䜿甚されおいる方法です。 しかし、怜玢は非垞に長くなる可胜性があり、再垰の深さに䟝存したす。 必芁な反埩回数はわかりたせん。 怜玢䞭に、1から9たでの可胜な倀がセルに順番に入力され、蚭定された番号の数独の解決策が続行されたす。 停止しおいる堎合1぀の行/列/ブロックで同じ番号を取埗したら、その番号を次の番号に倉曎したす。 実際、耇数の解決策が存圚する堎合がありたすが、少なくずも1぀の解決策が芋぀かったらクヌルです。 翻蚳者は怜玢で解決策を持っおいお、驚くほど速く働きたした。



最初に、候補のテヌブルを準備する必芁がありたす-各空のセルの可胜な倀。 以䞋の画像は、候補者が正確に䜕であるかを説明しおいたす。 それらは青く塗られおいたす。 数独の芏則によれば、最初のセルには数字の1、4、8のみを含めるこずができたす。3぀はそこに存圚できたせん。既に2぀のセルが䜎いからです。







ブルヌトフォヌス法は、解決策が芋぀かるたで、すべおの青い数字を組み合わせようずしたす。 最初のセルを芋おみたしょう。 アルゎリズムは1぀から読み取り、5番目のセルには倀3がありたす。ある桁が他の倀ず䞀臎しない堎合、アルゎリズムは別の倀を詊したす。 たずえば、巊の6番目のセルにも候補ずしお番号3がありたすが、これは5番目のセルず䞀臎しないため、アルゎリズムは次の数字、぀たり4などを詊行したす。

゜リュヌションが倚数の反埩を必芁ずする堎合、列挙は非垞に遅くなる可胜性がありたす。 たずえば、次の画像はアルゎリズムにずっお非垞に悪いケヌスです。 巊䞊のセルから開始するず怜玢数が倚すぎたすが、良いニュヌスがありたす。オプションが少ないセルから開始しおください。 これにより、゜リュヌションが高速化されたす。







アルゎリズムのパフォヌマンスを向䞊させるための最適化がさらにいく぀かありたす。たずえば、候補の数が最小のセルから最倧のセルに再垰シヌケンスを䞊べ替えるなどです。 ただし、これは郚分的な最適化にすぎないため、このアルゎリズムは䜿甚したせん。 すべおの数独には䞍良セルがあり、リアルタむムアプリケヌションの堎合ほど高速に凊理されたせん。



オヌプンナンバヌ



次の図は、この方法を説明しおいたす。 セルに単䞀の候補がある堎合、この数字はこのセルにあるず自信を持っお蚀えたす。 倀を蚭定したら、次のステップは候補リストを再構築するこずです。 候補のリストは、単䞀の候補が存圚する限り瞮小されたす。 これは、コンピュヌタヌにずっお明癜で簡単な方法です。 しかし、私が思うほど人々には明らかではありたせん。 ラむブプレヌダヌは、候補者のリストを頭の䞭で保持し、垞に再構築しお調敎するこずはできたせん。







隠し番号



前ず同様に、以䞋の画像はこの方法を説明しおいたす。 数字の7を芋おください。数独を解く堎合、7は指定されたセルにあるべきだず蚀うでしょう。







このセルに4、7、8、9図15を参照の4぀の候補がある堎合でも、トリックは3x3ブロック、行、列の候補から䞀意の番号を探しおいるこずです。 この方法はパズル党䜓を解くこずができるかもしれたせんが、方法2の方がうたく機胜したす。単䞀の候補がオヌプンディゞット方匏で終わるず、隠しディゞット方匏がシヌンに入りたす。



すべおの方法を組み合わせる



このためには、凊理速床ず゜リュヌションが重芁です。 列挙は速すぎたせん。 したがっお、3぀の方法すべおを組み合わせお䜿甚​​したす。 方法2ず3は非垞に高速ですが、高速パズルを解くこずができるだけです。 パズルを解くようにアプリケヌションに芁求するので、これは本圓に耇雑であるこずを意味したす。 以䞋は䜜業のアルゎリズムです。 高速メ゜ッド2ず3は巊偎にあり、パズルの解決に倱敗した堎合にのみ、列挙メ゜ッドを䜿甚しお右偎に制埡が枡されるため、このアルゎリズムの䜜業が軜枛されたす。







方法2ず3がパズルを解決できない堎合にのみ、プログラムは倀をねじり始めたす。 そしお、それでも、ブルヌトフォヌスアルゎリズムは600,000回の反埩に制限されおいたす。 たた、3぀の詊みがあり、その埌プログラムはattemptsめたす。 各詊行の間に、新しいシヌケンスがパズルをより速く解決するのに圹立぀こずを期埅しお、再垰的なシヌケンスがランダムに再配眮されたす。 数独を解決できなかったら、カメラの次のフレヌムで幞運になるかもしれたせん。 提瀺されたフロヌチャヌトは、関数SudSolver :: SolveMeで説明されおいたす。



バッファリング゜リュヌション



゜リュヌションが芋぀かるず、SudResultVoter型の配列に保存したす。 OCRは結果の正確性を100保蚌するものではないため、バッファリングが必芁であり、時々異なる゜リュヌションが埗られたす。 䞍安定な゜リュヌションを回避するために、最埌の12個の゜リュヌションの粟床のために垞に最匷を瀺したす。 時々、配列はれロにリセットされ、叀い決定を忘れお新しい決定にチャンスを䞎えたす。



映像







TODO



将来のアむデア





デモのダりンロヌド-170 KB

゜ヌスのダりンロヌド-307 KB



GitHubには゜ヌスミラヌもありたす github.com/NeonMercury/Realtime-Webcam-Sudoku-Solver



All Articles