OpenCVを使用した打球検出器





最近、たまたま1つの興味深いプロジェクトに参加しました。 私の妹はBHSDのデザイナーのために勉強していて、Street Interactiveでプロジェクトを作成するタスクが与えられました。 アイデアは非常にシンプルに選ばれました。 動くクマのアニメーションが画面に表示され、誰もが即興の雪だるま式のパチンコから入るように招待されています。 結果はビデオに示されており、技術的な実装に興味がある人はcatにようこそ。



説明


元のアイデアは、kinektを使用して追跡することでした。 そのようなタスクには、キネクトが理想的であると思われました-それは良い内蔵カメラを備えており、深さを追跡することもできます(そして3次元空間で体の位置をある程度正確に決定することができます)。 しかし、短いテストの後、kinektの使用を放棄しなければなりませんでした。 長距離でオブジェクトを追跡することはできません。また、プロジェクターからの明るい光がセンサーを妨害します。



その後、追跡に通常のウェブカメラを使用するというアイデアを得ました。 カメラをプロジェクタの近くに置き、スクリーンに向けます。 これを使用して、画面の平面内のボールの位置を追跡します。 しかし、もう1つの問題がありました。ボールが壁に衝突する瞬間を判断することです。 オプションとして、モーションセンサーを備えたArduinoが検討されました。 ただし、最終的には、動き検出器として画面の近くにある2台目のカメラを使用することにしました。 これにより、ボールが画面に飛ぶ瞬間をキャプチャし、この瞬間から数ミリ秒後に衝撃の座標を取得できます。



ソフトウェアの実装は、OpenCVライブラリを使用してC ++で行うことにしました。 ホイールを再発明するのではなく、既製の機能を使用してカメラから画像を受信し、その後の処理を行うことができます。



ボール追跡


ボールの座標を決定するために、次のアルゴリズムを使用しました。

1)画像をRGB表現からHSVに変換しました。 これは、RGBとは異なり、HSVが色調、彩度、明度を別のチャネルに保存するため、同様の色を識別しやすくします。

2)画像をバイナリに変換しました(ビットマップ)。 必要な色(ボールの色)に最も近い色が白に変換されます。 残りは黒です。

3)中央値フィルターでノイズをフィルター処理しました。

4)平均座標と白色ピクセル数を決定しました。 数量がしきい値よりも大きい場合、フレームにボールがあります。

結果のコードは次のとおりです。



clr=ballColor; frame=cvQueryFrame(capture); //     cvtColor(frame,frameHSV,CV_BGR2HSV); //   HSV inRange(frameHSV,Scalar(clr-ballThres,120,120),Scalar(clr+ballThres,255,255),frameBitmap); //   bitmap medianBlur(frameBitmap,frameBitmap,5); //   for(int i = screenLeft; i < screenRight; i++) { for(int j = screenUp; j < screenDown; j++) { cl=frameBitmap.at<char>(j,i); if (cl!=0) { //    x+=i; y+=j; n++; } } } if (n>ballDifNum) { //     x/=n; y/=n; }
      
      





ヒット定義


衝突が発生したことを判断するために、モーション検出器として2台目のカメラを使用しました。 これを行うために、前のフレームと現在のフレームとの差を特定し、差がしきい値よりも大きい場合、ボールはフレームに飛びました。



  frame=cvQueryFrame(captureHit); cvtColor(frame, frame, CV_RGB2GRAY ); //     GaussianBlur(frame,frameCurrent,cv::Size( 3, 3 ), -1); //   absdiff(frameCurrent,framePriv,mask); //     framePriv=frameCurrent.clone(); //    threshold(mask,mask,motionTreshold,255,cv::THRESH_BINARY); if (countNonZero(mask)>motionDifNum) ttl3=detectDelay; //     ,     
      
      







結果


その結果、ボールの座標と衝突に関する情報を取得して、プログラムはそれらをアニメーションを担当する2番目のプログラムに転送しました。 プロジェクトの結果は最初のビデオで紹介されています。 また、以下では、自宅でのテクノロジーのテストについて説明します。







参照資料


balltracking.cpp-プログラムの完全なリスト

wikipedia.org-ウィキペディアの OpenCVについて

robocraft.ru -OpenCVステップバイステップ。 Cheshire Catによるロシア語のOpenCVレッスン。

aishack.in -OpenCVでの色付きオブジェクトの追跡

britishdesign.ru-英国デザイン大学院



All Articles