私の頭の上からの簡単な方法は、両方の方法を組み合わせることです。
ヒストグラムと平均シフトを使用したカラー トラッキング
ヒストグラムを使用した別の色検出方法を次に示します。
Computer Vision による堅牢な手の検出
アイデアは次のとおりです。明るい緑/青などの既知の色のキャップの場合 (イメージ マット スクリーンに表示される色のようなもの)、色相と彩度のカラー チャネルのみを使用してヒストグラムを事前に計算できます。明度チャネルを意図的に除外して、照明の変動に対してより堅牢にします。ここで、ヒストグラムを使用して、逆投影マップを作成できます。つまり、画像内の各ピクセルの色が帽子の色である確率を示す確率値を持つマスクです。
確率マップを取得したら、OpenCV のアルゴリズムを使用して検出した顔の上のどこかに初期ウィンドウを配置して、この確率マップ (画像ではありません) でmeanshiftまたはcamshiftアルゴリズム (OpenCV で使用可能) を実行できます。このウィンドウは、最終的に確率分布の最頻値、つまり上限になります。
詳細は、上記のロバスト ハンド検出のリンクにあります。詳細については、公式の OpenCV ブックを入手するか、地元の図書館から借りることを検討してください。オブジェクトを追跡するための meanshift と camshift の使用に関する非常に優れた章があります。または、オブジェクト追跡のために meashift/camshift に沿って任意のクエリを使用して Web を検索してください。
正方形/円を検出して頭の向きを取得する
さらに、この最終位置をさらに確認したい場合は、キャップの前面に 4 つの小さな正方形/円を追加し、OpenCV の組み込みアルゴリズムを使用して、この関心領域 (ROI) でのみそれらを検出できます。QRコードの四角を検出するようなものです。この手順により、キャップの方向に関する情報がさらに得られ、それによって頭が得られます。これは、ヘアをレンダリングするときに役立つ場合があります。たとえば、隣接する 2 つの正方形/円を見つけた後、それらと水平線/垂直線の間の角度を計算できます。
OpenCVの標準コーナー検出器などを使用して、正方形/コーナーを検出できます。円の場合は、HoughCircle アルゴリズムを試すことができます: http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghcircles
これをスピードアップ
関心領域 (ROI) を多用する
高速化するには、できるだけ頻繁に、画像 (ROI) の小さな領域 (確率マップも) でアルゴリズムを実行する必要があります。それ自体が画像である OpenCV 画像から ROI を抽出し、画像全体に対して実行するのと同じ方法で OpenCV のアルゴリズムを実行できます。たとえば、検出された顔の周りの ROI の確率マップを計算できます。同様に、平均シフト/カムシフト アルゴリズムは、この小さなマップでのみ実行する必要があります。同様に、正方形または円を検出する追加のステップについても同様です。詳細は、OpenCV の本とオンラインのクイック検索で見つけることができます。
TBB と CUDA を使用して OpenCV をコンパイルする
OpenCV のアルゴリズムの多くは、TBB (スレッド ビルディング ブロック) と CUDA サポートをオンにして OpenCV ライブラリをコンパイルするだけで、プログラマが追加の作業を行う必要なく、大幅な高速化を実現できます。特に、OpenCV (Viola Jones) の顔検出アルゴリズムは数倍速く実行されます。
これらのオプションは、TBB および CUDA のパッケージをインストールした後にのみ有効にすることができます。
TBB: http://threadingbuildingblocks.org/download
CUDA: https://developer.nvidia.com/cuda-downloads
次に、ソースから OpenCV をコンパイルします: http://docs.opencv.org/doc/tutorials/introduction/windows_install/windows_install.html#windows-installation
最後に、OpenCV の「C バージョン」を使用しているかどうかはわかりません。厳密に必要な場合 (互換性の問題など) を除き、OpenCV の C++ インターフェイスを使用することをお勧めします。これは、(少なくとも私の個人的な経験から) より便利だからです。ここで、この声明が C と C++ のメリットについて炎上戦争を開始するつもりはないことを前もって述べさせてください。
お役に立てれば。