2011-01-29 5 views
3

Использование VC++ и Open CV. Вот что я пытаюсь сделать: найти первые три почти горизонтальные линии hough и нарисовать их. найти все почти вертикальные линии и нарисовать их , если какая-либо вертикальная линия выше горизонтальная линия, тогда FLAG устанавливается на 0 , если нет вертикальной линии Hough выше (все ниже) горизонтальной линии, затем FLAG = 1Как сравнить позиции Hough Line в OpenCV?

int n, i,c=0; 
    int flag = 0; 

    cvCanny(src, dst, 50, 150, 3); 
    lines = cvHoughLines2(dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 10, 5, 5); 
    n = lines->total; 

    for(i = 0; i < n; i++) 
    { 
     CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); 
     CvPoint pt1, pt2, hpt1, hpt2, vpt1, vpt2; 
     int hy = 0, vy = 0;   
     pt1 = line[0]; 
     pt2 = line[1]; 
     theta = atan((double)(pt2.y - pt1.y)/(pt2.x - pt1.x)); /*slope of line*/ 
     degree = theta*180/CV_PI; 
     if(fabs(degree) < 8) //checking for near horizontal line 
     { 
      c++; 
      if(c > 0 && c <5) /*main horizontal lines come first*/ 
      { 
       cvLine(out, pt1, pt2, CV_RGB(255, 255,255), 1, CV_AA, 0); 
       hpt1 = line[0]; 
       hpt2 = line[1]; 

       if(hpt1.y > hpt2.y) //finds out lower end-point 
        hy = hpt1.y; 
       else 
        hy = hpt2.y; 
      } 
     } 

     if(fabs(degree) > 70) /*near vertical lines*/ 
     { 
      cvLine(out, pt1, pt2, CV_RGB(255, 255,255), 1, CV_AA, 0); 

      vpt1 = line[0]; 
      vpt2 = line[1]; 

      if(vpt1.y > vpt2.y) //finds upper end-pt of vertical line 
        vy = vpt1.y; 
      else 
       vy = vpt2.y; 

      if(vy >= hy) //if vert line is lower than horizontal line 
       flag = 1; 
      else 
       flag = 0; 

     } 

    } 
    display(out, "hough lines"); 
    return flag; 
} 

Однако для изображения, даже если будут обнаружены выше горизонтальной линии -still флаг возвращается 1. Так же я подсчета вдоль оси неправильно вертикальные линии? Пожалуйста, помогите мне.

ответ

4

Линии if(fabs(degree) > 70) и if(fabs(degree) < 8) выглядят неправильно. Угол около 180 означает почти горизонтальный ... вы, вероятно, хотите это изменить, и помните о периодичности углов (примерно 360 также почти горизонтальны). Способ красиво справиться с этим будет заключаться в использовании if (fabs(cos(angle - desired_angle)) > 0.996), что означает примерно «если угол и нужный_угольник находятся в пределах 5 градусов друг от друга, не обращая внимания». 0.996 - это примерно косинус 5 градусов, если вам нужно, более точное количество цифр - 0.9961946980917455 - это ближе к матчу.

Кроме того, заказ вашей петли выключен. Вы не делаете find the first three nearly-horizontal hough lines and draw them. find all the nearly-vertical lines and draw them if any vertical line is above the horizontal line в этой последовательности, вы перебираете все строки в любом порядке и обрабатываете их независимо - вертикальные могут появляться перед горизонтальными, поэтому вы не знаете, что проверить.

В-третьих,

  if(hpt1.y > hpt2.y) //finds out lower end-point 
       hy = hpt1.y; 
      else 
       hy = hpt2.y; 

против

 if(vpt1.y > vpt2.y) //finds upper end-pt of vertical line 
       vy = vpt1.y; 
     else 
      vy = vpt2.y; 

Вы используете один и тот же код, чтобы найти ниже координат, чтобы найти более высокий. Считаете ли вы, что это может сработать?

В-четвертых,

 if(vy >= hy) //if vert line is lower than horizontal line 
      flag = 1; 
     else 
      flag = 0; 

Значение флага зависит от последнего прохода через этот кусок кода. Это не соответствует any в вашем описании.

+0

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

+0

Я бы исправил очевидные ошибки сначала (что он работает над одним изображением не означает, что он работает каждый раз, и если он работает каждый раз, когда вам нужно объяснять, почему), прежде чем искать другие ошибки. – etarion

+0

еще раз спасибо. Те, кого мы действительно бросаем в глаза, с моей стороны, и я ценю, что вы указываете их. Я исправлю их и вернусь к этому - и затем примите ответ. Может потребоваться некоторое время: ловушки работы в одиночку и слишком много проектов. Извините за промежутки времени. – AruniRC

1

Гораздо проще утверждать, что нельзя использовать PPHL (прогрессивный вероятностный алгоритм Hough Lines), но SHL (стандартный HL)! Чтобы вы получили полярную форму линии с углом и радиусом! Затем вы можете просто проверить угол, не вычисляя его самостоятельно.

Если угол выходного составляет около 0 ° или 180 °, это вертикальная линия, и если это около 90 °, это горизонтальная линия ....

+0

Если это -90 ° (или 270 °), то это также горизонтально. –

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