2017-06-19 284 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

很高興看到您能夠按照您的喜好使用它!好的工作,也許發佈你的完整解決方案,以防其他人偶然發現這個問題。 –