2012-06-30 19 views
6

Sau khi xử lý một hình ảnh bằng cách chuyển đổi nó sang màu xám quy mô và sau đó làm mờ nó, tôi đang cố gắng để áp dụng một chuyển đổi Hough vòng với các thông số:HoughCircles thông số để nhận ra bóng

  • CV_HOUGH_GRADIENT
  • dp = 1
  • min_dist = 1
  • param_1 = 70
  • param_2 = 100
  • min_radius = 0
  • MAX_RADIUS = 0

Đây là một trong nhiều hình ảnh tôi đã cố gắng: http://i.stack.imgur.com/JGRiM.jpg

Nhưng thuật toán thất bại trong việc nhận bóng ngay cả với các thông số thoải mái.

(Khi tôi thử nó với một hình ảnh của một vòng tròn được tạo ra trong GIMP nó hoạt động tốt)

Trả lời

0

Kiểm tra đầu ra Canny hình ảnh của bạn đầu tiên. Từ đầu ra Canny này, có thể phát hiện bóng với param_2 rất nhỏ cũng như nhiều vòng tròn giả trên hình ảnh. (Tôi đã sử dụng ví dụ param_2 = 10, và với trung tâm bóng được chỉ định để loại bỏ vòng tròn giả nó hoạt động)

Cố gắng trợ giúp Biến đổi vòng tròn. Nhiệm vụ là phân đoạn bóng từ các yếu tố khác. Trong vấn đề hình ảnh của bạn là dòng, bạn có thể cố gắng phân đoạn bóng bằng cách sử dụng màu sắc chẳng hạn.

+0

bạn có thể giải thích phương pháp của bạn một chút nữa? (Làm thế nào để cung cấp các trung tâm bóng quy định). Nếu tôi có một quả bóng xấp xỉ ở giữa hình ảnh chiếm 60 đến 70 phần trăm của khung hình. Làm thế nào tôi có thể về việc xác định các thông số tốt nhất? – jluzwick

+2

Bạn có thể phát hiện tất cả các vòng kết nối có param_2 rất thấp. Điều đó sẽ cho bạn nhiều vòng tròn giả. Sau đó, nếu bạn biết trung tâm khoảng. Bạn có thể loại bỏ. Chỉ cần lặp qua tất cả các vòng kết nối và loại bỏ khoảng cách này đến xấp xỉ trung tâm được chỉ định lớn hơn một số delta. – krzych

+0

Ah, thông minh! Có thực sự rất hữu ích. – jluzwick

9

Tôi đồng ý với krzych. tôi đã có nó làm việc dễ dàng với:

cv::Mat img,img2; 
std::vector<cv::Vec3f> circles; 
img = cv::imread("JGRiM.jpg",1); 
cv::bilateralFilter(img, img2, 15, 1000, 1000); 
cv::cvtColor(img2, img2,CV_BGR2GRAY); 
cv::HoughCircles(img2, circles, CV_HOUGH_GRADIENT, 1,300,50, 10); 
cv::circle(img2,cv::Point(circles[0][0],circles[0][1]),circles[0][2],cv::Scalar(126),2); 
cv::imshow("test",img2); 

cv::waitKey(0); 
cv::imwrite("test.jpg",img2); 
return 0; 

enter image description here

Chúc may mắn :)

+0

Bạn có thể giải thích cách truy cập các số của mình chi tiết hơn một chút không? Tôi đang cố gắng làm một cái gì đó tương tự và muốn tìm ra cách để tính toán các con số tốt nhất để phù hợp với giải pháp của tôi. Cảm ơn! – jluzwick

+4

minDist = 300 (px) để chúng tôi chỉ tìm thấy một vòng tròn (một giá trị nhỏ sẽ tìm thấy nhiều vòng tròn xung quanh quả bóng). minRad = 10 vì vậy chúng tôi tránh đếm các vòng tròn nhỏ (tiếng ồn). cho các thông số khác, tôi đã may mắn: p (hình ảnh này rất mạnh mẽ để thay đổi) –

+0

Cảm ơn! Điều đó rất hữu ích. Còn bộ lọc song phương thì sao? Tôi đã cố gắng tìm một lời giải thích tốt về các thông số trong nhiều bài nói của một giáo dân. Lời khuyên nào về điều đó? – jluzwick

Các vấn đề liên quan