int detecCircles(cv::Mat image, vector &circles, vector &bias) { circles.clear(); bias.clear(); cv::Mat oimage = image.clone(); float scalefactor = (float)setImgFixWidth / image.cols; resize(image, image, cv::Size(cvRound(scalefactor*image.cols), cvRound(scalefactor*image.rows))); GaussianBlur(image, image, cv::Size(5, 5), 3); cv::Mat grey; if (image.type() == CV_8UC3) cvtColor(image, grey, CV_BGR2GRAY); else grey = image; cv::Mat thresholded; int _thresParam1 = 7; int _thresParam2 = 7; if (_thresParam1 < 3) _thresParam1 = 3; else if (((int)_thresParam1) % 2 != 1) _thresParam1 = (int)(_thresParam1 + 1); adaptiveThreshold(grey, thresholded, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY_INV, _thresParam1, _thresParam2); HoughCircles(thresholded, circles, CV_HOUGH_GRADIENT, 1, thresholded.rows / 8); cv::Point icenter = cv::Point(cvRound(oimage.cols / 2), cvRound(oimage.rows / 2)); for (size_t i = 0; i < circles.size(); i++) { circles[i][0] /= scalefactor; circles[i][1] /= scalefactor; circles[i][2] /= scalefactor; cv::Point cenbias = cv::Point(cvRound(circles[i][0] - icenter.x), cvRound(circles[i][1] - icenter.y)); bias.push_back(cenbias); } return (int)bias.size(); }