2011-01-29 4 views
3

VC++ 및 Open CV 사용. 여기 내가하고자하는 일이 있습니다 : 처음 세 개의 거의 수평 인 선을 찾아서 그립니다. 모든 수직 라인을 찾아 그 라인을 그려 위의 수평 라인이 인 경우 FLAG가 0으로 설정됩니다. 수평 라인이없는 경우 (모두 아래에있는 경우) FLAG = 수직선 플래그 그래서 잘못 축을 따라 계산하고 1을 반환 아직도 수평선 위에서 검출되는 경우에도 화상에 대한 단 1OpenCV에서 Hough Line 위치를 비교하는 방법은 무엇입니까?

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; 
} 

? 제발 도와주세요.

답변

4

if(fabs(degree) > 70)if(fabs(degree) < 8) 줄이 잘못되었습니다. 약 180 °의 각도는 거의 수평을 의미합니다 ... 아마 그것을 바꾸고 각도의주기를 염두에 두어야합니다 (약 360도 거의 수평입니다). 멋지게 처리하는 방법은 if (fabs(cos(angle - desired_angle)) > 0.996)을 사용하는 것입니다. 이는 대략 "angle과 desired_angle가 서로 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)을 사용하는 것이 훨씬 쉽습니다! 그래서 당신은 각도와 반경을 가진 극선 형태의 선을 얻습니다! 그러면 각도를 직접 확인하지 않고 직접 확인할 수 있습니다. 이 수직선, 그리고 그 주위에 90 °의 경우는 수평 라인의 ° 출력 각도가 약 0 ° 또는 180 인 경우

.... 그러나 내가

퍼팅의 선명 방법이다
+0

-90 ° (또는 270 °)이면 수평입니다. –

관련 문제