0

目标是检测图像中的 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;
}
4

1 回答 1

0

代码看起来不错,除了:

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

参数列表中的数字 3 是否对应 CV_HOUGH_GRADIENT ?使用定义而不是数字总是更好。

也许你应该先用一个更大圆圈的图像来测试它。一旦你确定其余的代码是正确的,你就可以调整 HoughCircles 的参数。

于 2013-07-29T04:36:35.450 回答