2017-12-06 2 views
2


저는 단어의 그림을 가지고 있습니다. 각 단어는 직사각형 윤곽선으로 묶여 있습니다. 사각형 윤곽 벡터를 정렬해야하므로 일부 작업을 수행 할 수 있습니다.직사각형 윤곽 정렬하기 opencv

다음은 단어의 그림입니다 (등고선 포함). image with contours

내가 그것을 정렬 시도 내 비교 기능은

bool my_compare(Rect2d rect1, Rect2d rect2) 
{ if(((rect1.tl().y) <= rect2.tl().y) &&(rect1.tl().y < rect2.br().y)) 
    return (rect1.tl().x < rect2.tl().x); 
    return (rect1.tl().y < rect2.tl().y); 
} 

도 내가 (이 맨 왼쪽 또는에서 시작 나던 결과가 제대로 정렬되지 않습니다이

if((rect1.tl().y == rect2.tl().y)) 
    return (rect1.tl().x < rect2.tl().x); 
    return (rect1.tl().y < rect2.tl().y); 

을 시도하다 시작하지만 같은 선에서 등고선을 건너 뜁니다.)

+0

0과 1이되어야한다, 내가 원하는 방식으로 일을 생각하지만. .i 그게 더 간단한 방법으로, 어쨌든 고마워 할 수 있다고 생각! –

답변

1

아마도 같은 행의 사각형이 다른 높이를 가지기 때문일 수 있습니다. 직사각형 다음에 동일한 행의 키가 큰 직사각형이 오면 더 긴 직사각형이 왼쪽보다 먼저 정렬됩니다.

+--------------> x 
|   ****   
| ****  * * 
| * *  * * 
| ****  **** 
| rect1 rect2 
v 
y 

첫 번째 비교 기능을 사용 rect1.tl().y <= rect2.tl().y이 거짓과 rect1.tl().y < rect2.br().y)는 사실이다, 따라서이 극복하려면 왼쪽 하나 개

한 가지 제안을보다 잘 사각형 작은 넣어 것이다 (rect1.tl().y < rect2.tl().y)을 반환 사각형 왼쪽 상단 경우 y의 모서리 차이가 임계 값 내에 있으면 같은 행에 있고 x 대신 비교하는 것으로 간주합니다.

bool my_compare(Rect2d rect1, Rect2d rect2) 
{ 
    if (fabs(rect1.tl().y - rect2.tl().y) < threshold) 
     return (rect1.tl().x < rect2.tl().x); 
    return (rect1.tl().y < rect2.tl().y); 
} 

fabs<cmath> 하의 부동 소수점 절대 함수이다. 임계 값을 계산하는 한 가지 방법은 사각형의 평균 높이를 사용하는 것입니다.

threshold = ((rect1.br().y - rect1.tl().y) + (rect2.br().y - rect2.tl().y))/2 * K; 

K가 가장 수행하는보고 실험을 할 수있는 상수, 그것은 임계 방법으로 일했다

+0

예, 내 첫 번째 코드에서 "buttom right point (br.())"를 사용하여 처리하려고 시도했습니다. if ((rect1.tl(). y) <= rect2.tl(). y) && (rect1.tl(). y

+0

그것은, 나는 첫 번째 비교 실패 – lamandy

+0

그것이 효과가 있었는지 설명하기 위해 나의 대답에 예제를 추가했습니다, 맞았 어 : 'D, thanks! –

관련 문제