2017-06-19 139 views
0

我搜索了一下网上,在这里使用搜索上的计算器,但还没有找到完全是我一直在寻找这个问题。所以basicaly我使用简单的斑点检测,从OpenCV的,让我在图像的白色区域(这已经是二进制)和非常相似的图像,我得到的方面非常diferent结果被检测出并斑点都没有,在这里在定义simpleblobdetector时是我的参数。OpenCV的简单的斑点检测,得到一些未被发现的斑点

image1 image2

正如你可以看到一些斑点都没有beeing检测,这里是我的探测器的配置:

void blobDetect(cv::Mat img) { 
    cv::SimpleBlobDetector::Params params; 
    if (Daytime) { 
     params.minThreshold = 23; 
     params.maxThreshold = 25; 
    } 
    else { 

     params.minThreshold = 3; 
     params.maxThreshold = 5; 
    } 
    params.thresholdStep = 1; 

    params.filterByColor = true; 
    params.blobColor = 255; 
    params.filterByArea = true; 
    params.minArea = 300; 
    params.maxArea = 400000; 
    params.filterByCircularity = false; 
    //params.minCircularity = ""; 

    params.filterByConvexity = false; 
    //params.minConvexity = ""; 

    params.filterByInertia = false; 
    //params.minInertiaRatio = ""; 

    cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 

    std::vector<cv::KeyPoint> keypoints; 

    detector->detect(img, keypoints); 

    cv::Mat im_with_keypoints; 

    std::cout << keypoints.size() << std::endl; 

    drawKeypoints(img, keypoints, im_with_keypoints, cv::Scalar(0, 0, 255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 

    imshow("display4", im_with_keypoints); 
} 

所以我想问,是不是因为形状和大小的斑点?(我怀疑这个选项,因为在某些情况下,它可以找到大面积的奇怪形状)我认为简单的斑点检测可以找到任何一组像素,是更适合圆形斑点或类似的东西?我应该考虑使用另一种算法还是构建自己的算法?或者有没有办法让我解决这个问题,并提高简单斑点检测的准确性?

我知道这些都是很多的问题,但预先感谢您的任何帮助,你可以给!

+0

Blob探测器是相当古老的OpenCV,为什么找不到轮廓和按区域分类? –

+0

我明白你的意思了,我会试试这个!我认为会有更好的办法来解决这个问题,但是由于我还没有经验,我无法找出哪条路可走!我会发布结果:)谢谢! –

回答

1

就像Alexander Reynolds sugested“斑点检测是很老的OpenCV,为什么不找轮廓和排序区?”

我以前this link得到一个起点。

具有图像的轮廓后,我使用此: “如果(CV :: contourArea(轮廓[I])> 500)”给阈值小的区域和它完美,再加上它的工作原理的速度远远超过blobdetection。

此外,亚历山大,非常感谢你的指点我朝着正确的方向:)

PS:作为sugested,这里是完整的解决方案。

void findContours(cv::Mat img) { 
    // find contours: 
    std::vector<std::vector<cv::Point> > contours; 
    std::vector<cv::Vec4i> hierarchy; 
    findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE); 

    // draw contours: 
    cv::Mat imgWithContours = cv::Mat::zeros(img.rows, img.cols, CV_8UC3); 
    cv::RNG rng(12345); 
    for (int i = 0; i < contours.size(); i++) 
    { 
     if (cv::contourArea(contours[i]) > 500) { 
      cv::Scalar color = cv::Scalar(rng.uniform(50, 255), rng.uniform(50, 255), rng.uniform(50, 255)); 
      drawContours(imgWithContours, contours, i, color, 1, 8, hierarchy, 0); 
     } 
    } 
    imshow("display4", imgWithContours); 
} 
+0

很高兴看到您能够按照您的喜好使用它!好的工作,也许发布你的完整解决方案,以防其他人偶然发现这个问题。 –