2012-01-16 34 views
2
for (int i = 0; i < circles->total; i++) 
{ 
    // round the floats to an int 
    float* p = (float*)cvGetSeqElem(circles, i); 
    cv::Point center(cvRound(p[0]), cvRound(p[1])); 
    int radius = cvRound(p[2]); 
    //uchar* ptr; 
    //ptr = cvPtr2D(img, center.y, center.x, NULL); 
    //printf("B: %d G: %d R: %d\n", ptr[0],ptr[1],ptr[2]); 
    CvScalar s; 

    s = cvGet2D(img,center.y, center.x);//colour of circle 
    printf("B: %f G: %f R: %f\n",s.val[0],s.val[1],s.val[2]); 

    // draw the circle center 
    cvCircle(img, center, 3, CV_RGB(0,255,0), -1, 8, 0); 

    // draw the circle outline 
    cvCircle(img, center, radius+1, CV_RGB(0,0,255), 2, 8, 0); 

    //display coordinates 
    printf("x: %d y: %d r: %d\n",center.x,center.y, radius); 

上記のコードは、22個のボールを検出し、各ボールのrgb値を抽出します。 icanはこのrgb値を使って各ボールの色を決定します。私は白球が最初に当る色ボールの検出を実装しようとしています。私のアイデアは白いボールの中心が変わる(つまり移動する)のを待つことでした。そして中心が変化する次の色のボールは、それが当たるボールです。私はこれをコーディングするのに問題がありますか?カラーボールの衝突

+0

ではありませんあなたは既に私はこれを行うつもりだったこの正確な同じ質問... http://stackoverflow.com/questions/8767205/ball-collision-detection –

答えて

0

以前のx、yを変数に保存し、すべての繰り返しをチェックして変更があったかどうかを判断できます。 白いボールの中心から他の中心の中心までの距離を確認することをお勧めします。衝突は、距離が半径の合計である場合です。

ところで、それはC.

+0

を求めてきましたが、サークルの検出はわずかにオフになっているので、すべてのボールが同じ半径として検出されるわけではありません。あなたはxの貯蓄を助けることができるでしょうか?感謝 –

+0

'int oldx [22]、oldy [22]'の配列を宣言してサークルの最初の座標に初期化し、サークルを再計算するたびに新しい値と古いものを比較し、新しいoldx [i]、oldy [i]の値。 – asaelr

+0

どのように私は各円のためにそれらを初期化するでしょう。 int old {22} = {center.x、center.x、center.xなど}どのようにしてcenter.xを各サークルに固有にするのですか? –