2017-12-13 1 views
1

OpenCV에서 윤곽선이 주어진다면 cv2.boundingRect(contour)을 사용하여 너비와 높이를 추출 할 수 있습니다. 왼쪽 그림과 같이 경계 사각형의 너비와 높이를 반환합니다.OpenCv에서 주어진 각도에서 윤곽선의 너비 측정

오른쪽 그림과 같이 회전 된 경계 사각형의 너비/높이를 추출 할 수 있습니까?

Contour illustration

나는 움직이는 물체의 길이를 측정하기 위해 노력하고 있지만 가끔 수평선에서 45도까지 될 수있는 이동 방향의 길이를 측정 할 필요가있다.

나는 을 얻기의 방법이 알고있는cv2.minAreaRectcv2.boxPoints하지만를 사용하여 사각형을 경계 회전 난 항상 최소 면적 사각형을 일치하지 않습니다 필요, 그래서 어떻게 든 각도를 지정 할 수 있어야 회전.

회전 된 너비와 높이 값만 필요합니다. 회전 된 윤곽선이 필요하지 않습니다.

+2

개체를 회전하고 테두리를 다시 적용하십시오.'getRotationMatrix2D' – ldgorman

+0

왜 안 되죠? 각도를 지원하면 두 개의 직각 선을 만들 수 있습니다. pts와 각 행 사이의 거리를 계산 한 다음 'max_dist - min_dict '를 계산하면 너비와 높이가 표시됩니다. – Silencer

답변

1

: Why not. Support you have an angle, then you can make two orthogonality lines. Calculate the distance between pts and each line, then calc max_dist - min_dict, you will get width and height.

My mother language is Chinese, 그리고 나는 영어 쓰기에 좋은입니다. 그래서 난 그냥 코드로 돌려 :

#!/usr/bin/python3 
# 2017.12.13 22:50:16 CST 
# 2017.12.14 00:13:41 CST 
import numpy as np 

def calcPointsWH(pts, theta=0): 
    # 计算离散点在特定角度的长宽 
    # Measuring width of points at given angle 
    th = theta * np.pi /180 
    e = np.array([[np.cos(th), np.sin(th)]]).T 
    es = np.array([ 
    [np.cos(th), np.sin(th)], 
    [np.sin(th), np.cos(th)], 
    ]).T 
    dists = np.dot(pts,es) 
    wh = dists.max(axis=0) - dists.min(axis=0) 
    print("==> theta: {}\n{}".format(theta, wh)) 

테스트를 위해이 다이아몬드를 보내기

pts = np.array([[100, 200],[200, 26],[300, 200],[200, 373]], np.int32) 
for theta in range(0,91, 30): 
    calcPointsWH(pts, theta) 


==> theta: 0 
[ 200. 347.] 
==> theta: 30 
[ 173.60254038 300.51081511] 
==> theta: 60 
[ 300.51081511 173.60254038] 
==> theta: 90 
[ 347. 200.] 

enter image description here는 이제 굿나잇, 2017.12.14 00:20:55 CST입니다.

+0

고마워, 내가 원했던 것을 정확하게하는 것처럼 보인다. 나는 당신이 실제로 모든 일을하려고 의도하지는 않았지만, 정말 감사합니다! :) –

1

사용

cv2.minAreaRect(cnt) 

여기 here 완전한 예제와 설명을 찾을 수 있습니다.

편집 : minAreaRect가 실제로 필요한 것입니다. 방향이 지정된 사각형에서 너비와 높이를 가져 오는 데 어떤 문제가 있습니까? 내 의견으로

+0

고마워요,하지만 제가 잘못 생각한 것이 아니라면, 최소 둘러싸는 직사각형이 항상 움직이는 방향으로 "직면"하는 것은 아닙니다. 예를 들어 @ Silencer 's diamond의 경우 최소 둘러싸는 직사각형은 일정하지만 이동 방향은 그렇지 않습니다. –

+0

이상하게 들릴지 모르지만 코드에서 어떤 일이 벌어지고 있는지 보여주는 이미지 예제를 추가 할 수 있습니까? – Moia

+0

45도 각도로 움직이는 100x100 정사각형을 고려하십시오. https://i.imgur.com/PvHyHL6.png cv2.minAreaRect는 정사각형과 똑같은 사각형을 반환합니다. 그것? 그것은 100의 너비와 100의 높이를 줄 것입니다. 그러나 사각이 45도에서 움직이기 때문에 나는 약 141 도인 45도에서 너비를 원합니다. 따라서 minAreaRect는 작동하지 않습니다 (우리가 직사각형, 솔루션 일 수 있지만 실제 회전을 수행하는 데 도움이 필요합니다 :)) –

관련 문제