Обнаружение/установка кругов с использованием преобразования Хафа в OpenCV 2.4.6

Цель состоит в том, чтобы обнаружить 5 белых кругов на изображении. Тестовое изображение, на котором должны быть обнаружены круги, показано здесь 640x480
Загрузите исходное изображение здесь,1280x1024< /а>

Я использую разные методы для оценки различных методов обнаружения круга/эллипса. Но почему-то я не могу исправить свой простой код преобразования Хафа. Он не обнаруживает никаких кругов. Мне не ясно, связана ли проблема с этапом предварительной обработки или с параметрами HoughCircle. Я рассмотрел все подобные вопросы на форуме, но так и не смог решить проблему. Это мой код. Пожалуйста, помогите мне в этом отношении..

Заголовочный файл

#ifndef IMGPROCESSOR_H
    #define IMGPROCESSOR_H

    // OpenCV Library
    #include <opencv2\opencv.hpp>
    #include <iostream>

    using namespace cv;
    using namespace std;

    class ImgProcessor{
    public:
        Mat OpImg ;
        ImgProcessor();
        ~ImgProcessor();

        //aquire filter methods to image
        int  Do_Hough(Mat IpImg);

     };
    #endif /* ImgProcessor_H */

Исходный файл

#include "ImgProcessor.h"
#include <opencv2\opencv.hpp>
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\imgproc\imgproc_c.h"
#include <vector>

using namespace cv;


ImgProcessor::ImgProcessor(){
    return;
}
ImgProcessor::~ImgProcessor(){
    return;
}

//Apply filtering for the input image
int ImgProcessor::Do_Hough(Mat IpImg)

{
    //Parameter Initialization________________________________________________________
    double sigma_x, sigma_y, thresh=250, max_thresh = 255;
    int ksize_w = 5 ;
    int ksize_h = 5;
    sigma_x = 0.3*((ksize_w-1)*0.5 - 1) + 0.8 ;
    sigma_y = 0.3*((ksize_h-1)*0.5 - 1) + 0.8 ;

    vector<Vec3f> circles;

    //Read the image as a matrix
    Mat TempImg;
    //resize(IpImg, IpImg ,Size(), 0.5,0.5, INTER_AREA);

    //Preprocessing__________________________________________________________

    //Perform initial smoothing
    GaussianBlur( IpImg, TempImg, Size(ksize_w, ksize_h),2,2);

    //perform thresholding
    threshold(TempImg,TempImg, thresh,thresh, 0);

    //Remove noise by gaussian smoothing
    GaussianBlur( TempImg, TempImg, Size(ksize_w, ksize_h),2,2);
    /*imshow("Noisefree Image", TempImg);
    waitKey(10000);*/

    //Obtain edges
    Canny(TempImg, TempImg, 255,240 , 3);
    imshow("See Edges", TempImg);
    waitKey(10000);

    //Increase the line thickness
    //dilate(TempImg,TempImg,0,Point(-1,-1),3);

    //Hough Circle Method______________________________________________________________

    // Apply the Hough Transform to find the circles
    HoughCircles( TempImg, circles, 3, 1, TempImg.rows/32, 255, 240, 5, 0 );
    // 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( IpImg, center, 3, Scalar(0,255,0), -1, 8, 0 );
         // circle outline
         circle( IpImg, center, radius, Scalar(0,0,255), 3, 8, 0 );
    }

   // Show your results
    namedWindow( "Hough Circle Transform", WINDOW_AUTOSIZE );
    imshow( "Hough Circle Transform", IpImg );

   // waitKey(0);
   return 0;   





}

int main(int argc, char** argv)
{
    ImgProcessor Iclass;
    //char* imageName = argv[1];
    string imageName = "D:/Projects/test_2707/test_2707/1.bmp";
    Mat IpImg = imread( imageName );
    cvtColor(IpImg, IpImg,6,CV_8UC1);
    Iclass.Do_Hough(IpImg);
    /*Iclass.Do_Contours(IpImg);*/
    return 0;
}

person Robionic    schedule 28.07.2013    source источник


Ответы (1)


Код выглядит нормально, за исключением:

HoughCircles( TempImg, circles, 3, 1, TempImg.rows/32, 255, 240, 5, 0 );

Номер 3 в списке параметров соответствует CV_HOUGH_GRADIENT? Всегда лучше использовать определения вместо чисел.

Может быть, вы должны сначала проверить это с изображением с большими кругами. Как только вы убедитесь, что остальная часть кода верна, вы можете настроить параметры HoughCircles.

person Totoro    schedule 29.07.2013
comment
Да, это действительно соответствует CV_HOUGH_GRADIENT.. Я принимаю ваше предложение и буду делать то же самое здесь и далее. Я также попробовал другие тестовые изображения, случайно полученные из Google, и все они, кажется, отлично работают с алгоритмом. - person Robionic; 29.07.2013
comment
Хорошо, так что мы приступили к тестированию параметров. Минимальный радиус, который вы ищете, составляет 5 пикселей, что примерно соответствует размеру пикселей в измененном изображении. Максимальный радиус 0 должен означать, что ограничений нет. - person Totoro; 29.07.2013
comment
Может быть, вы можете еще уменьшить минимальный радиус, скажем, до 3, и попробовать еще раз. Интересно, причина в маленьком размере кругов, что приводит к более низким баллам в буфере накопителя? Вы также можете попытаться получить контуры и использовать длину контура, чтобы определить круги правильного размера. - person Totoro; 29.07.2013