2013-11-14 70 views
2

我正在使用opencv和java來查找圖像上的圓圈,到目前爲止我有下圖。 我使用霍夫用這樣的代碼來找到的那個圓圈:查找圈子圖像處理

Imgproc.medianBlur(result, result, 3); 
    Imgproc.medianBlur(result, result, 3); 
    Imgproc.medianBlur(result, result, 3); 
    Mat circles = new Mat(); 
    Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 1, 200, 100, 30, 40); 
    System.out.println(circles.dump()); 

,但我得到了有和沒有模糊的結果的空席。 我應該如何解決這個問題?

enter image description here

編輯: 傢伙嗨!

感謝你我現在有這張照片。我正在使用這些參數:

Imgproc.HoughCircles(result, circles, Imgproc.CV_HOUGH_GRADIENT, 1, 20, 50, 10, 10, 40); 

我仍然在檢測之前使用medianBlur。

剩下的唯一問題是爲什麼它會檢測到這些小圈子?我附上了canny檢測的結果,我認爲這些圈子是相當可見的。

enter image description here enter image description here

回答

2

首先,circles結構不應該是cv::Mat,但應該是std::vector<cv::Vec3f>;我想,這就是爲什麼你沒有得到任何結果。請參見在HoughCircles獲取細節..

與值周圍玩5分鐘,我有這樣的起點你:

enter image description here

我使用的參數,

cv::medianBlur(test_Circle, test_Circle, 7); 
std::vector<cv::Vec3f> circles; // <- not that "circles" is not cv::Mat 
cv::HoughCircles(test_Circle, circles, CV_HOUGH_GRADIENT, 1, 1, 300, 10, 10, 50); 

你可以得到更多定義的結果與你的價值觀發揮之後逛了一下。

PS - 由於我是C++用戶,請原諒我把所有的結構放在這種格式中。您可以輕鬆將邏輯擴展到Java。 :)

+0

墊可以被用作用於在OpenCV中點的矢量容器。大部分接受點向量的函數都會接受Mat並正常使用它。實際上OpenCV之前的一些版本需要將矢量轉換爲Mat。但我同意使用Mat而不是矢量有點令人困惑。 –

+0

我正在使用Mat,因爲函數需要Java中的Mat,並且當我僅找到一個圓時,Mat中只有3個值。 @MichaelBurdinov –

2

你確定你所提供的半徑,而不是直徑?嘗試更廣泛的半徑(例如10-100)。

使用OpenCV在祖馬作弊? :)

1

我測試過我的代碼,它在C#(我認爲Java是一樣的)writtent並得到結果:1

你可以找到我的HoughAlgorithm.cs類代碼 我的演示項目Here

//DP_Resolution: 1 
//MinDistance :32 
//CannyThreshold: 10 
//AccuThreshold: 10 
//MinRadius: 13 
//MaxRadius: 20 

public static CvSeq DetectCircles(IplImage pImage, CamEnum _camName) 
{ 
    try 
    { 
     CvMemStorage memStorage = cvlib.CvCreateMemStorage(0); 
     return cvlib.CvHoughCircles(ref pImage, memStorage.ptr, 3, 1, 32, 10, 10, 13, 20); 
    } 
    catch 
    { 
     throw; 
    } 
} 

http://i.stack.imgur.com/pUqbh.png

+0

你似乎有很多誤報。 –

+0

我的英語不好,哈哈 – JKing