2015-04-23 4 views
1

В настоящее время я использую преобразование Hough для получения прямых линий. Но обнаружено много линий. Могу ли я узнать, как фильтровать и получать самую длинную строку из вывода?Как фильтровать только самую длинную строку после преобразования Hough

 HoughLinesP(dst, lines, 1, CV_PI/180, 50, 20, 10); //left lane 

     for(size_t i = 0; i < lines.size(); i++) 
     { 
     Vec4i l = lines[i]; 
     double theta1,theta2, hyp, result; 

     theta1 = (l[3]-l[1]); 
     theta2 = (l[2]-l[0]); 
     hyp = hypot(theta1,theta2); 

     line(cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,0,0), 3, CV_AA); 

     } 

     imshow("detected lines", cdst); 

}

ответ

0

Насколько я понимаю, вы буквально шаг:

hypot функция дает расстояние между начальной и конечной точками. Теперь просто найдите самое длинное такое расстояние, и соответствующая линия будет самой длинной.

Vec4i max_l; 
double max_dist = -1.0; 

for(size_t i = 0; i < lines.size(); i++) 
{ 
    Vec4i l = lines[i]; 
    double theta1,theta2, hyp, result; 

    theta1 = (l[3]-l[1]); 
    theta2 = (l[2]-l[0]); 
    hyp = hypot(theta1,theta2); 

    if (max_dist < hyp) { 
     max_l = l; 
     max_dist = hyp; 
    }   
} 

// max_l now has the line of maximum length 
line(cdst, Point(max_l[0], max_l[1]), Point(max_l[2], max_l[3]), Scalar(255,0,0), 3, CV_AA); 
// do something else with max_l 
+2

«// Теперь у вас есть линия максимальной длины» №. L - последний элемент линий. Вы не обновляете max_dist, поэтому max_dist FooBar

+1

@FooBar: Ooopsies. Очень жаль. Виноват. Обновлено сейчас, спасибо! –

+0

Привет @aspiring_sarge и FooBar, я пробовал, но кажется, что все строки все еще появляются. Это из-за цикла for? Или мне нужно сначала его перенести? Все еще отлаживается –