https://deep-learning00.tistory.com/23
[딥러닝 컴퓨터비전] 스테레오 비전을 이용한 3차원 위치추정 알고리즘
안녕하세요 오늘은 스테레오비전을 통하여 객체의 3차원 위치를 측정하는 방법을 알아보겠습니다. 우선 depth map을 만들려면 다른 위치의 두 카메라가 같은 물체를 촬영한 두 영상이 필요합니다
deep-learning00.tistory.com
안녕하세요, 저번 포스트에서 depth camera에 원리에 대해서 알아보았는데요.
이번 포스트에서는 depth camera로 부터 얻은 정보를 바탕으로 객체의 위도와 경도를 계산하는 법을 알아보겠습니다.
우선 real sense 카메라는 대상 픽셀과의 직선거리 r과 카메라가 보는방향을 기준으로 한 세타(θ) 값을 반환합니다.
이 r값과 θ를 이용하여 카메라와 대상간의 r*cos(θ)와 r*sin(θ)값을 구할 수가 있습니다.
그리고 이 것을 경도와 위도로 변환해주기 위하여 지도상에 표현해보면 다음과 같습니다.
수식을 간단하게 만들기 위해서 카메라가 보는 방향과 경도방향을 일치시켜 주었습니다. 카메라의 위도, 경도는 우리가 이미 알고 있는 값이고, 객체와 떨어진 거리인 r*cos(θ)와 r*sin(θ) 역시 camera로부터 반환 받은 정보이므로 알고있는 값입니다.
먼저 객체와의 위도차이를 계산해보도록 하겠습니다. 빨간색 부채꼴을 자세히 보면 다음과 같습니다.
부채꼴의 호 공식에서, 지구 반지름 R을 비롯한 나머지 정보들은 모두 알고 있으므로 위도차이를 계산할 수 있습니다.
대상의 위도를 알아냈다면 경도 역시 알아낼 수 있습니다. 위의 그림에서 수선을 내립니다. (객체의 위도를 알고 있으므로 이를 통해 지구 반지름 R*cos(객체의 위도)로 계산가능)
작은 부채꼴에 호 공식을 사용하여 객체와 카메라 사이의 경도 차이 역시 알아낼 수 있습니다.
간단한 코드로 구현해보면 다음과 같습니다.
import math
def calculate_coordinates(r, theta):
# 카메라의 위도와 경도
camera_lat = 37.564214
camera_lon = 127.001699
# 지구 반지름 (미터)
R = 6371000
# 각도를 라디안으로 변환
theta_rad = math.radians(theta)
# 델타 위도 계산
delta_lat = (r * math.cos(theta_rad)) / R
object_lat = camera_lat - math.degrees(delta_lat)
# 객체의 위도를 라디안으로 변환
object_lat_rad = math.radians(object_lat)
# 델타 경도 계산
delta_lon = (r * math.sin(theta_rad)) / (R * math.cos(object_lat_rad))
object_lon = camera_lon - math.degrees(delta_lon)
return object_lat, object_lon
# 예시 사용
r = 500 # 거리 (미터)
theta = 45 # 각도 (도)
object_lat, object_lon = calculate_coordinates(r, theta)
print(f"객체의 위도: {object_lat}")
print(f"객체의 경도: {object_lon}")