이미지 회전 후, 꼭지점 좌표 계산 방법
[ How to calculate the vertices coordinate(or polygon points) after image rotation]
-> cv2나 albumentation, pil 등 다른 간단한 오픈 소스 또는 함수가 있을 것 같은데 찾질 못했습니다. 혹시나 아시는 분이 있다면 댓글 달아주시면 감사하겠습니다.
(1) 이미지 처럼 Background image가 존재하고, A와 같은 small box들을 여러 개 합성했을 때,
(2) 와 같은 이미지가 최종적으로 생성된다고 보자.
이 최종 이미지 (2)를 PIL rotate함수로 랜덤하게 회전하게끔 수정하였다.
이때 (3)번과 같은 이미지가 생성되는데, 이때, A들의 꼭지점 좌표(polygon)을 계산해보려 하였다.
참고로 초기 A의 꼭지점 좌표는 이미 내가 알고 있었다. 따라서, PIL을 적용해 rotate했던 것 처럼 동일한 각도에 대해서 각 꼭지점이 이동했을 때, 즉 회전 변환 했을 때의 좌표값을 계산하면 된다.
대다수 rotation matrix 개념이 적용된 코드를 사용하는 듯 했다.
이때, 오픈되어 있는 코드는 상단과 같이 A 박스의 중심점을 통해 계산하는 방식이 제공됐는데, 나 같은 경우엔 (2)번 전체 이미지에 대해서 rotation을 적용하다보니, A박스의 중심점이 아니라 전체 background image의 중심점을 제공해줘야 알맞은 좌표값을 계산할 수 있었다.
+) 초반에 이걸 모르고 계속 각 박스의 중심점을 넣어 계산하다보니, background의 중심에 있는 박스들의 좌표는 올바르게 구해지는데 점점 background 중심에서 멀어지는 박스들의 좌표는 어긋나고 있었다. 그냥 간단하게 background의 중심좌표를 넣으면 되는데..
from math import cos, sin, radians
# xm, ym에 background image의 중심좌표를 제공
def _calc_rotate(self, x0, y0, xm, ym, theta):
x1 = (x0 - xm) * cos(radians(360-theta)) - (y0 - ym) * sin(radians(360-theta)) + xm
y1 = (x0 - xm) * sin(radians(360-theta)) + (y0 - ym) * cos(radians(360-theta)) + ym
return int(x1), int(y1)
'머신러닝 > Computer Vision' 카테고리의 다른 글
PIL Filter sample (0) | 2022.02.03 |
---|---|
[OpenCV] cv2로 bounding box/ polygon 그리기 / Drawing polygon by cv2 (cv2.polylines) (0) | 2022.01.26 |
[PIL] 이미지 축소, 확대(Image resize) (0) | 2022.01.24 |
[PIL] convert RGBA Numpy to PIL Image (TypeError: Cannot handle this data type: (1, 1, 4), <f4) (0) | 2022.01.24 |
[PIL] 함수 모음 - 지속적으로 작성 진행 중 (0) | 2022.01.21 |