2017-06-19 12 views
0

私は少しオンラインで検索し、ここでstackoverflowの検索を使用していますが、私はこの問題を探していました。だから基本的には、opencvの単純なブロブ検出を使って、画像(すでにバイナリである)の白い部分を取得しています。非常に似た画像では、ブロブが検出されたものとそうでないもの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

ブロブ検出器はかなり古いOpenCVですが、輪郭線や領域をソートしてみませんか? –

+0

私はあなたが何を意味するかを見て、私はこれを試してみましょう!私はこれを改善する良い方法があると思ったが、私はまだ経験していないので、どの方法を検討するのか困っていた!私は結果を投稿します:)ありがとう! –

答えて

1

ちょうどAlexander Reynoldsと同じように "Blob検出器はかなり古いOpenCVですが、輪郭線を見つけて領域別にソートするのはなぜですか?"

私はthis linkを使用して出発点を取得しました。

イメージの輪郭を持つと、私はこれを使用します: "if(cv :: contourArea(contours [i])> 500)"はスレッシュホールドの小さな領域になり、完全に機能し、さらにブロブ検出よりもはるかに高速です。再び

、アレクサンダーは、正しい方向に私を指していただき、誠にありがとうござい:)

PSを:推薦して、ここでは完全なソリューションです。

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

あなたの好みに合った作品を手に入れることができてうれしいです!良い仕事、おそらく他の人がこの質問に遭遇した場合に使用したあなたの完全な解決策を投稿してください。 –

関連する問題