2017-02-08 19 views
1

оригинальная картина
original picture результат картина result pictureEmgu CV: с помощью HoughCircles обнаружить много несуществующих кругов, и ожидание в течение длительного времени

Вот мой код:

private void button3_Click(object sender, EventArgs e) 
{ 
    string strFileName = string.Empty; 
    OpenFileDialog ofd = new OpenFileDialog(); 
    if (ofd.ShowDialog() == DialogResult.OK) 
    { 
     Image<Bgr, byte> img1 = new Image<Bgr, byte>(ofd.FileName); 
     pictureBox1.Image = img1.ToBitmap(); 
     Image<Gray, Byte> gray1 = img1.Convert<Gray, Byte>().PyrUp().PyrDown(); 

     CircleF[] circles = gray1.HoughCircles(
     new Gray(150), 
     new Gray(100), 
     2, 
     10, 
     0, 
     0)[0]; 
     Image<Bgr, byte> imageCircles = img1.CopyBlank(); 
     foreach (CircleF circle in circles) 
     { 
      imageCircles.Draw(circle, new Bgr(Color.Yellow), 5); 
     } 
     pictureBox4.Image = imageCircles.ToBitmap(); 
    } 
} 

Устанавливаются правильно мои параметры? Я что-то не понимаю правильно? Спасибо!

ответ

0

EmguCV обертывает материал OpenCV, поэтому вы можете получить более подробную информацию о том, как использовать методы Emgu, посмотрев на OpenCV Doku. Here он преобразование поджилок объяснило (может быть, что подсчет параметров или порядок меняется, но в большинстве случаев совпадения имен параметров в пункте пояснения 4 (Продолжить применять Хаф Circle Transform:.) вы получите объяснили все параметры:

dp = 1: The inverse ratio of resolution 
min_dist = src_gray.rows/8: Minimum distance between detected centers 
param_1 = 200: Upper threshold for the internal Canny edge detector 
param_2 = 100*: Threshold for center detection. 
min_radius = 0: Minimum radio to be detected. If unknown, put zero as default. 
max_radius = 0: Maximum radius to be detected. If unknown, put zero as default 

Согласно Emgu Doku используются эти значения:

cannyThreshold 
    Type: TColor 
    The higher threshold of the two passed to Canny edge detector (the lower one will be twice smaller). 
accumulatorThreshold 
    Type: TColor 
    Accumulator threshold at the center detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first 
dp 
    Type: SystemDouble 
    Resolution of the accumulator used to detect centers of the circles. For example, if it is 1, the accumulator will have the same resolution as the input image, if it is 2 - accumulator will have twice smaller width and height, etc 
minDist 
    Type: SystemDouble 
    Minimum distance between centers of the detected circles. If the parameter is too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is too large, some circles may be missed 
minRadius (Optional) 
    Type: SystemInt32 
    Minimal radius of the circles to search for 
maxRadius (Optional) 
    Type: SystemInt32 
    Maximal radius of the circles to search for 

Так что попробуйте использовать более высокую accumulatorThreshold (например, 150 или 180), потому что ваши круги довольно очевидны на больших изображений более высокого дп может помочь тоже. уменьшая ваши ожидания ti меня.

Ваш dp 10 (я думаю, что это означает 10pixils между обнаруженными центрами), просто возьмите намного большее число в зависимости от вашего размера изображения. пример OpenCV использует 8-ю высоту изображений.

minRadius 0 должно быть нормально, так как на вашем изображении отображаются только большие (желтые) круги.

Максимальное количество радиостанций должно зависеть от вашего размера изображения - это позволит удалить эти действительно большие круги в нижней части изображения.

Просто попробуйте 5% высоты изображения как minRadius и около 90% как maxRadius - или просто используйте слайдеры и кнопку Apply, чтобы попробовать сами.

 Смежные вопросы

  • Нет связанных вопросов^_^