2013-09-13 3 views
1

Я работаю над обработкой изображений с помощью opencv и Eclipse.Преобразование HoughLines в opencv

vector<Vec2f> lines; 
    HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0); 

    for(size_t i = 0; i < lines.size(); i++) 
    { 
    float rho = lines[i][0], theta = lines[i][1]; 
    Point pt1, pt2; 
    double a = cos(theta), b = sin(theta); 
    double x0 = a*rho, y0 = b*rho; 
    pt1.x = cvRound(x0 + 1000*(-b)); 
    pt1.y = cvRound(y0 + 1000*(a)); 
    pt2.x = cvRound(x0 - 1000*(-b)); 
    pt2.y = cvRound(y0 - 1000*(a)); 
    line(cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA); 
    } 

Может кто-нибудь объяснить, как именно эти очки определяются этим кодом. Мы используем

y=(-cos(theta)/sin(theta))x + r/(sin(theta)) 
rho=xo*cos(theta) + yo*sin(theta) 

Я не могу понять, почему умножение 1000 делается в линии

pt1.x = cvRound(x0 + 1000*(-b)); 

пожалуйста, попробуйте объяснить это простыми словами. Заранее спасибо

ответ

13

Вопрос был дан ответ. Но так как я потратил последние пятнадцать минут на рисование этой диаграммы, я мог бы также опубликовать ее в любом случае. Может быть, это помогает:

enter image description here

Так что у вас есть это точка p0 = (x0,y0), которая находится на линии. Затем вы вычисляете две другие точки на линии, которые находятся на расстоянии 1000 единиц от p0 в каждом направлении.

+0

Извините, что украл ваш гром; Мне очень нравится ваша диаграмма! – Mozglubov

+0

Очень приятно, что вы потратили некоторое время на то, чтобы помочь мне в этом. В следующий раз я попытаюсь потратить еще немного времени на поиск ответа, прежде чем задавать вопрос. спасибо – venus

1

Код, кажется, пытается нарисовать линию из параметров, возвращаемых функцией преобразования Hough. Умножение на 1000 делает его таким, чтобы ваши точки перемещались вдоль линии (в противоположных направлениях, поэтому pt1 добавляет и pt2 вычитает) из начальной позиции, чтобы фактически нарисовать линию. Различные значения этого числа должны давать вам разные длины сегментов линии. Если вам интересно, попробуйте заменить значение переменной (например, line_length), а затем измените значение этой переменной, чтобы увидеть, как она влияет на внешний вид вашего вывода.

+0

Благодарим за ответ. Это действительно была отличная помощь. – venus

1

Вот подробное объяснение этого фрагмента кода:

pt1.x = cvRound(x0 + 1000*(-b)); 
pt1.y = cvRound(y0 + 1000*(a)); 
pt2.x = cvRound(x0 - 1000*(-b)); 
pt2.y = cvRound(y0 - 1000*(a)); 

(нажмите на картинку, чтобы увидеть ее в полном размере)

enter image description here

В этом случае d1 = d2 = 1000.

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