Попробуйте уменьшить размер изображения перед обработкой его с помощью HoughCircles
с помощью pyrDown или resize .
Если вы хотите использовать обнаруженные круги с оригиналомизображение, умножьте радиус и центр на коэффициент, который вы разделили изображение.Уменьшение масштаба в 2 раза должно дать вам ускорение обработки в 2-4 раза минус время, необходимое для выполнения операции масштабирования.
Ниже приведен краткий пример того, как вы можете это сделать:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat circleBig = imread("circle.png", 0);
Mat circleSmall;
double scale = 2.0;
// INTER_NEAREST is crude, but very fast; you may need INTER_LINEAR here...
resize(circleBig, circleSmall, Size(0, 0), 1.0 / scale, 1.0 / scale, cv::INTER_NEAREST);
cvtColor(circleBig, circleBig, CV_GRAY2RGB);
vector<Vec3f> circles;
HoughCircles(circleSmall, circles, CV_HOUGH_GRADIENT, 2, circleSmall.rows >> 2, 200, 100 );
for( size_t i = 0; i < circles.size(); i++ )
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][3]));
int radius = cvRound(circles[i][4]);
// draw the circle center
circle( circleBig, scale*center, 3, Scalar(0,255,0), -1, 8, 0 );
// draw the circle outline
circle( circleBig, scale*center, scale*radius, Scalar(0,0,255), 3, 8, 0 );
}
imshow("circleBig", circleBig);
waitKey();
return 0;
}
Наконец, вот тестовое изображение, которое я использовал:
Вот время, которое я получил для обнаружения HoughCircles
:
640x480 time: 0.0127101
320x240 time: 0.00408843
Грубо, в 3 раза быстрее!:)