Opencv multiple circle detection in a image
Hey there, I writing a code for colony counter (Spots detection on a plate), This is the code i'm using as of now.
const cv::Mat in = load_image; // Load image from a folder cv::Mat tmp_mat, red_mat, blur_mat, gray_mat; std::vector<cv::Mat> split_s; cv::cvtColor(in, tmp_mat, cv::COLOR_BGR2HSV); cv::split(tmp_mat, split_s); cv::Mat mas_img, out_img; for(int i = 0; i < load_image.rows; i++) { for(int j = 0; j < load_image.cols; j++) { if((int)split_s[1].at<uchar>(i,j) >= 70) { split_s[1].at<uchar>(i,j) = 250; } else { split_s[1].at<uchar>(i,j) = 0; } } } cv::imshow("After", split_s[1]); cv::GaussianBlur(split_s[1], split_s[1], cv::Size(3,3), 0, 0); cv::imshow("Blur", split_s[1]); std::vector<cv::Vec3f> circles; cv::HoughCircles(split_s[1], circles, cv::HOUGH_GRADIENT, 1, distances to each other 200, 20, 1, 50 ); for( size_t i = 0; i < circles.size(); i++ ) { cv::Vec3i c = circles[i]; cv::Point center = cv::Point(c[0], c[1]); int radius = c[2]; cv::circle( load_image, center, radius, cv::Scalar(255,0,255), 2, cv::LINE_AA); } cv::imshow("result", load_image);
The Output of cv::imshow("Blur", split_s[1]) is as follows:
but the problem is after HoughCircles Detection not every circle is detected. How to detected each and every circle in the image
Edit 1: Original Image:-
Edit 2: Result Image:-
could you post the original image
... and mark the circles that aren't detected...
I have updated the result image, where circles detected are makred.
There is now
HOUGH_GRADIENT_ALT
(only in recent OpenCV versions) that should improve the detection, see this PR.I hope to provide more pictures to facilitate the creation of data sets and targeted experiments.