Обнаружение круга в изображении - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь использовать метод HoughCircles для обнаружения круга на изображении, но похоже, что этот метод бесполезен для обнаружения всего круга с почти одинаковыми центрами. Например, если у меня есть 3 круга с почти одинаковым центром, это определяется как один круг. Пожалуйста, предложите, если есть какой-нибудь способ найти все круги. Вот исходное изображение:

Please check image

Я могу ошибаться с предположением HoughCircle Methos.

Заранее спасибо.

1 Ответ

2 голосов
/ 18 февраля 2020

Причина в том, что когда вы звоните HoughCircles , вы должны определить минимальное расстояние между обнаруженными центрами окружностей. Тот же центр, который вы упомянули, означает нулевое расстояние между ними. Так что в этом случае вы должны установить минимальный параметр расстояния почти 0.

void cv::HoughCircles   (   InputArray  image,
OutputArray     circles,
int     method,
double  dp,
double  minDist, // You should set this parameter almost zero cos 0 not accepted.
double  param1 = 100,
double  param2 = 100,
int     minRadius = 0,
int     maxRadius = 0 
)

Когда я попытался с этими параметрами:

  HoughCircles( input, output, CV_HOUGH_GRADIENT, 1, 0.5, 60, 30, 1, 200 );

я получаю это:

enter image description here

Редактировать: Когда я попытался еще поиграть в эту игру, у меня было 12 кругов, но в действительности это 18 кругов (краевые круги не включены). Причиной может быть качество изображения. Вот мой код и результат:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

int main()
{
    /// Load source image and convert it to gray
    Mat src_gray,dst,src = imread("/ur/source/image/image.jpg", 1 );
    imshow("Source",src);
    int i = 50;
    bilateralFilter(src,dst,i,i*2,i/2);

    imshow("Output",dst);

    cvtColor( dst, src_gray, CV_BGR2GRAY );

    vector<Vec3f> circles;

    /// Apply the Hough Transform to find the circles
    HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, 0.01, 80, 55, 0, 100 );

    Mat zero_mask = Mat::zeros(src.rows,src.cols,CV_8UC3);
    /// Draw the circles detected
    for( size_t i = 0; i < circles.size(); i++ )
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        // circle center
        circle( zero_mask, center, 3, Scalar(0,255,0), -1, 8, 0 );
        // circle outline
        circle( zero_mask, center, radius, Scalar(0,0,255), 1, 8, 0 );
    }

    cout<<circles.size()<<endl;
    imshow("Output2",src_gray);
    imshow("outt",zero_mask);
    waitKey(0);
    return(0);
}

Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...