【问题标题】:Random circles being detected检测到的随机圆圈
【发布时间】:2011-10-01 19:13:11
【问题描述】:

我正在尝试检测圆圈,但我正在检测甚至不存在的圆圈。我的代码如下。谁知道如何修改 DetectCircle() 方法以使检测更准确,谢谢

void detectCircle( IplImage * img )
{
    int edge_thresh = 1;
    IplImage *gray = cvCreateImage( cvSize(img->width,img->height), 8, 1);
    IplImage *edge = cvCreateImage( cvSize(img->width,img->height), 8, 1);

    cvCvtColor(img, gray, CV_BGR2GRAY);

    gray->origin = 1;

    // color threshold
    cvThreshold(gray,gray,100,255,CV_THRESH_BINARY);    

    // smooths out image
    cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11);

    // get edges
    cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5); 

    // detects circle
    CvSeq* circle =  cvHoughCircles(edge, cstorage, CV_HOUGH_GRADIENT, 1,
        edge->height/50, 5, 35);

    // draws circle and its centerpoint
    float* p = (float*)cvGetSeqElem( circle, 0 );
    if( p==null ){ return;}

    cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(255,0,0), -1, 8, 0 );
    cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(200,0,0), 1, 8, 0 );

    cvShowImage ("Snooker", img );
}

【问题讨论】:

  • 以后不使用edge结果为什么还要调用cvCanny
  • 是的,这是一个错误。是否已更改但仍会随机检测到圆圈
  • 平滑后尝试另一个阈值为 127。
  • 如果您想要的不仅仅是在黑暗中摸索,您应该发布示例图像、中间步骤的图像(平滑、精巧)以及您获得和期望的输出。
  • 另一个阈值 127 会做什么?

标签: random opencv computer-vision detection geometry


【解决方案1】:

cvHoughCircles 检测对我们来说不明显的圆圈。如果您知道斯诺克球的像素大小,则可以根据它们的半径对其进行过滤。尝试在 cvHoughCircles 函数中设置 min_radius 和 max_radius 参数。

附带说明一下,一旦获得圆圈,您就可以根据颜色对其进行过滤。如果圆圈主要是一种颜色,则它很有可能是一个球,如果它没有,则可能是误报。

编辑:“圆圈的颜色”是指圆圈边界内的像素

【讨论】:

  • 我会试一试的。感谢您的建议。是的,我只是在努力检测到 22 个球,然后我将前往颜色。再次感谢
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2018-10-14
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多