Когда я применяю houghCircle
к своему изображению, оно всегда обнаруживает внутренний круг, я трачу много времени на настройку параметров, но результат всегда одинаков.
Моя процедура - преобразовать изображение в HSV
цветовое пространство, затем Threshold
на красный цвет, чтобы получить binary
изображение, затем применить houghCircle
.
Мое изображение
После кругооборота
Код
Mat hsv = new Mat();
Imgproc.cvtColor(bgr, hsv, Imgproc.COLOR_BGR2HSV); //BGR to HSV
Mat mask1 = new Mat();
Mat mask2 = new Mat();
Core.inRange(hsv, new Scalar(0, 100, 100), new Scalar(10, 255, 255), mask1);
Core.inRange(hsv, new Scalar(160, 100, 100), new Scalar(179, 255, 255), mask2);
Mat hsvThres = new Mat();
Core.bitwise_or(mask1, mask2, hsvThres);
//
Mat circles = new Mat();
int iCannyUpperThreshold = 1; //100
int iMinRadius = -1; //20 //90
int iMaxRadius = -1; //400 //150-1000
int iAccumulator = 1;//300
Imgproc.HoughCircles(hsvThres, circles, Imgproc.CV_HOUGH_GRADIENT, //2
1.0, hsvThres.rows() , iCannyUpperThreshold, iAccumulator, iMinRadius, iMaxRadius);
if (circles.cols() > 0)
for (int x = 0; x < circles.cols(); x++)
{
double vCircle[] = circles.get(0,x);
if (vCircle == null)
break;
Point pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
int radius = (int)Math.round(vCircle[2]);
Core.circle(bgr, pt, radius, new Scalar(0,255,0), 4, 8, 0);
}
Примечание
1) Когда я изменил minRadius
на 90
, он обнаружил внешнюю, а не внутреннюю, но я хочу что-то универсальное, что будет работать для изображений / знаков не только для этого тестового изображения.
2) Если я преобразовал Исходное изображение в Grey
пространство вместо HSV
, оно обнаруживает внешнее, а не внутреннее, но также это не мой случай, так как я должен преобразовать свое изображение в HSV
делать Thresholding
.