2013-04-03 1 views
7

이미지가 있고 그 안에 일부 모양이 있습니다. 나는 선을 사용하여 선을 탐지했다. 어떤 행이 병렬인지 어떻게 알 수 있습니까? 직교 좌표 선의Python openCV가 평행선을 감지합니다.

+0

변환 없음 :] 여기를 참조하십시오 (HTTP ://scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html). 그런 다음 theta가 이제 종속 축이되도록 독립 축 (theta 또는 'X')과 종속 축 (rho 또는 'Y')을 반전시킬 수 있습니다. 이 Hough 공간 이미지를 임계화한 후 (가장 가능성있는 선에 해당하는 (ρ, theta)의 가장 강렬한 부분을 얻으려면) 데이터에 수평선을 맞출 수 있습니다. theta = constant (y = mx + b, 기울기 없음). – chase

답변

13

식 :

Y = K * X + B

개의 라인 Y = K1 * X + B1, Y = K2 * X + B2있다 평행 K1 경우 = k2.

그래서 각 감지 된 라인에 대해 계수 k를 계산해야합니다. 위해

에 고유 당신이 두 점 라인에 속하는의 좌표를 알 필요가 줄의 방정식을 식별합니다.

HoughLines (С ++) 발견 라인을 갖는 후 :

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

는 극 좌표 검출 라인의 파라미터 (R, 세타)를 저장하는 벡터 라인을 가지고있다. 당신은 직교 좌표를 전송해야합니다 : C++에서

다음

예 : 줄이 두 지점을 가지고 한

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)); //the first point 
    pt1.y = cvRound(y0 + 1000*(a)); //the first point 
    pt2.x = cvRound(x0 - 1000*(-b)); //the second point 
    pt2.y = cvRound(y0 - 1000*(a)); //the second point 
} 

후에는 그 방정식을 계산할 수 있습니다.

+0

귀하의 솔루션에 많은 thx. – vtokmak

+3

검출 라인의 세타 값이 평행인지 아닌지를 충분히 확인합니까? 우리는 theta 값이 선이 평행선과 같다고 말할 수 있습니까? – vtokmak

+0

나는 세타 값을 점검하는 것이 충분한 체크가되어야한다고 생각한다. –

1

HoughLines는 결과를 극좌표로 반환합니다. 따라서 각도의 두 번째 값을 확인하십시오. 태그에 명시된 바와 같이이이 파이썬에서 수행하는 경우 필요 당신이 houghspace 출력 이미지를 제공 houghlines의 scipy 버전을 사용할 수 있습니다, Y, X로

def findparallel(lines): 

lines1 = [] 
for i in range(len(lines)): 
    for j in range(len(lines)): 
     if (i == j):continue 
     if (abs(lines[i][1] - lines[j][1]) == 0):   
      #You've found a parallel line! 
      lines1.append((i,j)) 


return lines1