【问题标题】:color ball collision彩球碰撞
【发布时间】:2012-02-11 19:55:02
【问题描述】:
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 值。可以使用这个 rgb 值来确定每个球的颜色。我正在尝试检测白球首先击中哪个颜色的球。我的想法是等待白球中心改变(即移动),下一个中心改变的彩色球是它击中的球。但我在编码时遇到问题?

【问题讨论】:

标签: c opencv colors collision-detection


【解决方案1】:

您可以将之前的 x,y 保存在变量中,并在每次迭代时检查它们,以确定它们是否已更改。 我建议您检查白球中心到其他球中心之间的距离,而不是这个 - 当距离是半径之和时,就会发生碰撞。

顺便说一句,这不是 C。

【讨论】:

  • 我本来打算这样做,但圆检测略有偏差,因此并非所有球都被检测为相同的半径,所以这就是我按照我的方式行事的原因。你能帮忙保存 x,y 吗?谢谢
  • 只需声明数组int oldx[22],oldy[22](并将它们初始化为圆的第一个坐标),并且每次重新计算圆时,比较新值和旧值,并将新值放入oldx [i],老[i]。
  • 我将如何为每个圈子初始化它们。 int old[22]= {center.x,center.x, center.x 等} 我将如何使 center.x 特定于每个圆圈?
  • 使用循环。 (可能类似于问题中的那个)
  • 最后一个问题。我怎样才能得到第一个移动的非白球而不是记录所有的球?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2014-05-19
相关资源
最近更新 更多