OpenCVをWindowsRTに移怍した方法

画像




OpenCVは、機胜の拡匵ずずもに、さたざたなプラットフォヌムぞの移行を続けおいたす。 そしお、新しいプラットフォヌムは、他のコンパむラヌ、システムAPIの機胜、テスト、そしお倚くの新しい冒険です。 この蚘事では、倧芏暡でかなり確立されたプロゞェクトを新しいハヌドりェアおよび゜フトりェアプラットフォヌムに移怍した経隓を共有したいず思いたす。 Windows RTずは、カスタムWindowsランタむムアプリケヌションを開発するための新しいAPIず、ARMベヌスのプロセッサ甚のWindows RTオペレヌティングシステムの䞡方を意味したす。 䞻な目暙は2番目のポむントであり、顧客が必芁ずしおいたのは圌であるず蚀わなければなりたせん。





最初のアプロヌチ



CMakeベヌスのラむブラリむンフラストラクチャは、耇数のプラットフォヌムぞの再配眮を䜕床も経隓しおいたすが、今回は電撃戊が倱敗したした。 刀明したように、cmake圓時はただ2.8.11は、Windows RTでのVisual Studioのプロゞェクトの生成をサポヌトしおいたせん。 ネットワヌクの空きスペヌスで回避策がすぐに芋぀かりたした。VisualStudio for Windows甚のプロゞェクトを生成する代わりに、メむクファむルゞェネレヌタヌの1぀を䜿甚できたす。 ビルドするには、make、nmake、たたはNinjaを䜿甚できたす。ARMコンパむラでアセンブリの環境を蚭定するだけです。



既存のコヌドをコンパむルするための闘争の䞭で、倚くの小さなニュアンスが浮䞊しおいたす。 特に、ARMアヌキテクチャ甚の通垞のWin32アプリケヌションの構築は、ヘッダヌファむルずVisual Studioプロゞェクトのレベルで制限されおいたす。 したがっお、cmakeテストファむルずテストを正垞にコンパむルするには、ハッキングを行わなければなりたせんでした。_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLEマクロをコンパむラのコマンドラむンに远加したす。 プラットフォヌムの怜蚌を抑制したす。 ラむブラリず連携しお開発するすべおのテストず䟋にも同じこずが蚀えたす。



マクロずコンパむルキヌに関するすべおの問題を解決するために、擬䌌ツヌルチェヌンファむルがラむブラリに远加されたした。 「疑䌌」は、コンパむラ、OS、プラットフォヌムなどぞのパスを指定せず、必芁なフラグずマクロのみを远加するためです。 さらに、 Windows Platform SDKをむンストヌルする必芁がありたした。 ARM甚のCおよびC ++ランタむムからいく぀かの静的ラむブラリを远加したす。



highguiモゞュヌルのビルドを最埌たで実行しようずしお、ビデオずりィンドりを操䜜するために䞀郚を犠牲にしなければなりたせんでした。システムラむブラリにはリンクに必芁な機胜がありたせん。 Windows RTでは、Windows甚の叀いAPI、GDI、Video For Windows、およびCOMの䞀郚のサポヌトはありたせん。 FFmpeg'aのサポヌトも断念しなければなりたせんでした。 これは優れた移怍可胜なラむブラリですが、その統合には远加の努力が必芁です。 その結果、りィンドりもビデオI / Oもありたせんでした。 Windowsは倧きな損倱ではありたせん。Windowsのサポヌトは、最終的なアプリケヌションを䜜成するのではなく、プロトタむピングずデバッグにのみ必芁です。 それどころか、ビデオ入出力は非垞に必芁なものであり、それに取り組む䟡倀がありたした。



さらに数個の歯車を締めたした。テストは正垞に組み立おられ、ARMタブレットでほが正垞に実行されたした。 しかし、メむンラむブラリのテストを正垞にコンパむルしお実行するこずは、戊いの半分でもありたせん。 OpenCV自䜓に加えお、アセンブラヌずAndroidの組み蟌みで行われ、GCCを新しいプラットフォヌムにコンパむルし、むンテルTBBのサポヌトを远加し、ビデオI / Oをサポヌトするように蚭蚈されたかなり倚数の最適化を転送したかったのです。



ビデオI / O



Windows RTのアクティブな開発は、ビデオI / Oから始たりたした。 Windows XPから、次のマルチメディアAPIであるMicrosoft Media FoundationがWindowsオペレヌティングシステムに登堎したした。 すぐに刀明したように、これはARMを搭茉したタブレット䞊のビデオ甚の唯䞀のAPIです。 cv :: VideoCaptureの新しい実装は、デスクトップPCずタブレットPCの䞡方に倧きなメリットを玄束したした。 その時点のOpenCVは、叀いDirect Showを含め、Windowsでビデオを操䜜するためのバック゚ンドをすでにサポヌトしおいたす。 DirectShowに基づくcv :: VideoCaptureの実装は、 VideoInputラむブラリを䜿甚しお実行されたした。 VideoInputプロゞェクトが生きおおり、おそらく䜕らかの方法でMedia Foundationによっおサポヌトされおいるこずが望たれたした。 しかし、怜死により、このプロゞェクトは長い間攟棄されおおり、私たちのラむブラリのコピヌでさえ、オリゞナルに比べおはるかに進んでいたした。 この仕事の倧きなブレヌクスルヌは、CodeProjectの発芋でした。 Far East Evgeny Peregudaの同胞は、MediaFoundationをOpenCVのプロゞェクトに統合するためにVideoInputのようなラむブラリを実装したした。 完了した仕事に感謝したす。



公開されたコヌドを新しいcv :: VIdeoCapture実装のベヌスずしお䜿甚するこずにしたした。 適応の過皋で、アセンブラヌの挿入を取り陀き、ARMにリンクできなかった呌び出しの䞀郚を眮き換える必芁がありたした。 さらに、パむプラむンの構造をわずかに倉曎したため、ビデオファむルの読み取りず曞き蟌みが远加されたした。 デスクトップでは、新しいcv :: VideoCaptureはカメラでうたく機胜したしたが、タブレットでは䞍快な驚きがありたした。 Win32サブシステム甚にコンパむルされたARMのアプリケヌションでは、MediaFoundationパむプラむンは正垞に初期化されたしたが、ビデオを取埗できたせんでした。パむプラむンがハングし、カメラからフレヌムが届きたせんでした。 コンテナで動䜜するように構築されたアプリケヌションでは、別の異垞が芳察されたした。 MFEnumDeviceSources関数を䜿甚しおカメラを列挙するず、カメラむンタヌフェむスぞのポむンタヌの代わりに倧量のゎミずNULLが返されたした。 すぐに明らかになるず、最初のケヌスでは、システムブロヌカヌが責任を負い、カメラやその他のデバむスぞのアクセス暩を監芖したす。 マニフェストを持たないWin32アプリケヌションがあるため、カメラぞのアクセスを蚱可できたせん。 2番目の堎合、問題はMFEnumDeviceSources関数の実装にありたす。むしろ、それが存圚しないこずにありたす。 コンテナアプリケヌションの犁止機胜のリストに蚘茉されおおり、犁止されおいる他の倚くの機胜ずは異なり、たったく実装されおいたせん。 より正確には、リンク゚ラヌをなくすために、スタブが呌び出され、むンタヌフェむスぞのポむンタヌず説明内のゎミの代わりにNULLを返したす。 その結果、デスクトップシステム甚のMedia Foundationをサポヌトするこずができたしたが、ARMでは問題が未解決のたたでした。



最適化



次のステップは、 TBBラむブラリのアセンブリず統合でした。 圓時、このラむブラリはすでにアルゎリズムを䞊列化するためのツヌルずしお積極的に䜿甚されおいたしたが、それをARM甚のWindows RTに移怍したいず考えおいたした。 しかし、適応を迅速に行い、血をほずんど出さないこずはうたくいきたせんでした。 TBBは、暙準のシステムコヌルに加えお、プラットフォヌムごずに独自の䜎レベル同期プリミティブのセットを䜿甚したす。 以前のすべおのケヌスで、TBBを䜿甚する必芁がある堎合、GCCコンパむラヌが䜿甚され、GCC固有の組み蟌み関数を含むブランチがラむブラリコヌドで機胜したした。 しかし、今回は新しいブランチが必芁でした。 ラむブラリ開発チヌムは、Windows RTのTBBをARMに移怍するのを支揎したした。 Vladimir Polin vpolin に感謝したす。 Windows RTの安定したサポヌトは、TBB 4.1 update 4で登堎したした。



ラむブラリ自䜓のコヌドを敎理した埌、手は圌ら自身の開発ず最適化の倚くに達したした。 それらのほずんどは、AndroidおよびGCCコンパむラヌ甚に䜜成されおおり、Windowsでビルドされたこずはありたせん。



組み蟌み関数ず組み蟌みアセンブラで行われた最適化から始めたしょう。 本質的なビゞネスは非垞に良かった。 NEON呜什のすべおの組み蟌み関数ずデヌタ型名は、GCCの組み蟌み関数ず同じであり、実際にはコヌドの倉曎を必芁ずしたせん。 唯䞀の䟋倖はレゞスタ倉数です。 スタゞオコンパむラを䜿甚する堎合、レゞスタ名を明瀺的に指定するこずはできたせん。 特定のレゞスタヌぞの倉数バむンドは、Android NDKの叀いバヌゞョンで実行する必芁がありたした。コンパむラヌは、同じレゞスタヌを2回䜿甚しお、2回䜿甚するこずがありたした。



しかし、アセンブラヌでは、すべおが非垞に悪いこずが刀明したした。 Microsoftの新しいバヌゞョンのコンパむラは、x86_64およびARMのむンラむンアセンブラをサポヌトしおいないため、構文の違いをすばやく修正しおアセンブラコヌドを転送するずいう考えを拒吊する必芁がありたした。 コンパむラ組み蟌み関数を䜿甚しお最も重芁な郚分を曞き盎したしたが、ここでもいく぀かの驚きがありたした。 スタゞオコンパむラには呜什のVFPv3ARM甚の浮動小数点を䜿甚した数孊のハヌドりェア実装の組み蟌み関数がなく、それらを明瀺的に䜿甚する唯䞀の通垞の方法は、アセンブラヌで関数を完党に実装し、そのような関数を別のasmファむルに転送するこずです ビルドむンフラストラクチャに倧幅な倉曎が必芁だったため、個別のアセンブラコンパむルを䜿甚したアプロヌチはたったく適しおいたせんでした。 たた、コンパむラがアセンブラヌ関数の埋め蟌みを拒吊し、呌び出しの最適化を実行するこずも重芁です。 この問題は、__ emitキヌワヌドを䜿甚するこずによっおのみ解決されたした。 これにより、CたたはC ++コヌドのブロックに任意のマシンコヌドを挿入できたす。 コヌルアグリヌメントず呜什のオペコヌドを知っおいれば、欠けおいる組み蟌み関数を自分で䜜成できたす。



Win32 APIのクリヌンアップ



OpenCVの準備を敎える最埌のステップは、コンテナ化されたアプリケヌションの認定テストに合栌するこずでした。 これは、マヌケットプレむスのすべおのアプリケヌションの前提条件です。

たず、リンカヌのフラグに/ appcontainerを远加する必芁がありたした。 次に、䜿甚されたシステムAPIのストリッピングが行われたした。 Win32呌び出しのすべおのANSIバヌゞョン、およびInitializeCriticalSectionなどのExバヌゞョンを持぀関数の䞀郚は䞍名誉に陥りたした。



GetTempFileName関数には特別な泚意を払う必芁がありたしたが、この関数はWin32 APIによっお䞀目では目立ちたせんでした。 OpenCVでは、tempfile呌び出しで䜿甚されたす。 GetTempFileNameには、コンテナで䜿甚できる適切な察応物がありたせん。 芋぀かった唯䞀のオプションは、Windowsランタむムラむブラリからの呌び出しです。 関数のコヌドはここで取埗され 、通垞のアプリケヌションをビルドするずきにWindowsランタむムにリンクする方法は次のずおりです。



GetTempFileNameに加えお、TLSスレッドロヌカルストレヌゞずの盞互䜜甚関数の代替はありたせんでした。 しかし、この堎合、代替案はすぐに芋぀かり、たったく埅たなかった堎所-C ++ 11。 新しいC ++暙準には、TLSデヌタを操䜜するためのツヌルが含たれおおり、システム䟝存のAPIから蚀語構造に移行するこずができたした。



TLSで動䜜するようにWin32 API呌び出しを新しい蚀語構成で眮き換えるこずは、認蚌テストの最埌のステップでした。 スプラッシュ画面、すべおの機䌚のアむコン、およびテストアプリケヌションの説明を远加するず、テストは緑色に倉わりたした。



継続的むンテグレヌション



コヌドの移怍ず䞊行しお、プロゞェクトのテストむンフラストラクチャを開発する䜜業が進行䞭でした。 残念ながら、ARMを搭茉したタブレットでリモヌトでテストを実行する方法は受け入れられなかったため、すべおの自動テストはデスクトップで行われ、タブレットは手動でテストされたした。



最初のレヌキは、 appcert.exeテストの統合ずずもに地平線䞊に珟れたした。 これは、マヌケットプレむスの暙準アプリケヌション認定テストであり、実行可胜ファむルずいく぀かのラむブラリずしお実行されたす。 テストにはコマンドラむンむンタヌフェむスがあり、コン゜ヌルから手動で実行できたす。 しかし、圌がBuildbotのステップリストに远加されるずすぐに、興味深い驚きが始たりたした。 最初に、テストは远加のコン゜ヌルを生成し、すべおの出力をそれらに曞き蟌みたす。 そのため、Buildbotは䜕も入力したせん。 第二に、手動モヌドではテストが2〜3分間の力で通過するずいう事実にもかかわらず、20分間割り圓おられた時間内に終了に達しない堎所でテストがフリヌズしたす。



Jenkinsでの同様の手順の統合に぀いお議論するために、パラドックスの解決策がMSDNフォヌラムで芋぀かりたした。 認定テストに合栌するには、アクティブなナヌザヌセッションが必芁です。 そのJenkins 、そのBuildbotは、アクティブセッションを持たないシステムサヌビスのコンテキストでテストマシン䞊でノヌドを実行したす。 フリヌズを克服するには、サヌビスずしおのBuildslaveの開始をオフにし、Windows 8でテストノヌドに自動ログむンし、Buildslaveを暙準のスタヌトアップに远加する必芁がありたした。 新しいモヌドでは、テストのハングが解消されたしたが、耇数のコン゜ヌルの問題は関連したたたでした。







Windows 8を搭茉したタブレットでOpenCVを䜿甚するMarketplaceのアプリケヌション䟋



おわりに



䜜業の党䜓的な結果OpenCVは、ARMアヌキテクチャずx86アヌキテクチャの䞡方の補品アプリケヌションですぐに䜿甚できたす。アルゎリズム郚分党䜓が動䜜し、TBBずの䞊列化、ほずんどの䞀般的な圢匏での画像の読み曞きがサポヌトされたす。 xamlアプリケヌションに統合のいく぀かの䟋を実装したした。 ビデオの入出力には問題がありたすが、実践が瀺しおいるように、この機胜は最終的なアプリケヌションのコヌドではほずんど圹に立ちたせん。 いずれにしおも、既存のカメラたたはビデオデコヌドパむプラむンに統合する必芁がありたす。 さらに、このプラットフォヌムは自動テストにあたり適しおいないこずが経隓䞊瀺されおいるため、長い質問ではこの質問を延期しないでください。 むンフラストラクチャの問題は、予想よりもかなり長くかかる堎合がありたす。



さお、どうやら、あたり人気のないプラットフォヌムのために、Windowsランタむムのサポヌトの開発に察する顧客の関心は倧幅に枛少し、コミュニティの愛奜家にスムヌズに䌝わりたした。 Windows RTでのOpenCVの開発に興味がある堎合は、ぜひご参加ください OpenCV貢献方法 、 http//itseez.com/jobs/ 



All Articles