현재 봉착한 문제는 2d 이미지에서 사물의 거리, 시점이 어디를 가리키고 있는가에 대한 것이다.
스테레오 알고리즘은 이를 해결할 수 있을것으로 보인다.
두개의 월드 카메라 영상에서 얻은 사물들의 시차(disparity)를 바탕으로 depth map(사물들의 거리 정보 맵)을 그릴 수 있다.
다만 depth map은 모든 사물의 시차에 대해 계산한 깊이 정보이므로 사용자가 어떤 물체를 바라보고 있는지는 알 수 없다.
따라서 depth map에서 구한 깊이 정보 3d좌표와, 아이트레킹을 통한 시선벡터의 3d좌표 가 일치하는 지점을 확인해서 시점을 구할 수 있을 것으로 판단된다.
다만 문제는 월드 3d 좌표계를 통합하는 것이다.
1. 월드와 월드 카메라간 좌표계를 정합해주어야 한다.
2. 시선 벡터 값을 월드와 정합해 주어야 한다.
-> 이때 정합할때 하나의 기준이 있어야 할듯 싶다.
1. 스테레오 월드 카메라 → Depth Map
- 두 개의 월드 카메라로 스테레오 알고리즘을 돌리면, 월드 장면 전체에 대한 깊이 정보(depth map) 가 생겨.
- 이건 “여기 컵은 0.5m, 저기 모니터는 1m, 뒤 벽은 3m” 같은 거리 지도를 만들어주는 거지.
- 하지만 여기서는 사용자가 뭘 보는지는 알 수 없어. 그냥 장면 전체의 거리 정보일 뿐이야.
2. 두 눈 카메라 → 시선 벡터
- 얼굴/눈 카메라(eye cam)로 양쪽 눈동자의 시선 벡터를 계산해.
- 왼쪽 눈 벡터와 오른쪽 눈 벡터를 3D 공간에서 연장하면 교차점(또는 최소 거리 지점)이 나옴.
- 그 점이 바로 사용자가 “응시하는 지점”.
3. 좌표계 통합
- 이제 문제는 “눈에서 나온 시선 벡터”와 “월드 카메라의 깊이맵”을 같은 좌표계에 맞추는 거야.
- 여기서 필요한 게 네가 말한 부가 정보들이야:
- 두 눈 사이 거리(baseline)
- 월드 카메라와 눈 카메라의 상대 위치(R, T)
- 초점거리(fx, fy) (픽셀 단위)
- 카메라 해상도, 센서 크기
- 이걸로 좌표계를 정합하면,
→ “눈에서 나온 시선 벡터”를 월드 카메라 좌표계로 투영할 수 있어.
4. 최종 단계
- 월드 카메라 스테레오로 만든 3D 장면(깊이맵) 준비
- 눈 카메라로 계산한 시선 벡터를 월드 좌표계에 변환
- 시선 벡터와 depth map을 교차 → “어떤 물체 위에 응시점이 있는지” 판별
- 예: depth map에서 2.3m 거리의 컵 좌표와 시선 벡터가 일치하면 → “컵을 보고 있음”
- 또는 월드 영상에 빨간 점(응시점)을 찍어줄 수 있음
✅ 결론
네 말대로,
- 월드 카메라만 있으면 → 깊이맵만 얻음
- 눈 카메라만 있으면 → 시선 방향만 얻음
- 두 개를 합치면 → 깊이맵 위에 시선이 교차하는 지점을 찍을 수 있고, 사용자가 어떤 물체를 보는지 정확히 알 수 있음
📌 원리 요약
- 두 눈에서 나온 시선 벡터를 3D 공간에 그린다.
- 왼쪽 눈에서 쭉 뻗은 직선
- 오른쪽 눈에서 쭉 뻗은 직선
- 이 두 벡터는 보통 딱 한 점에서 교차하지 않고, 약간 빗나가.
→ 그래서 보통은 “두 직선 사이의 가장 가까운 점(최소 거리 지점)”을 응시점으로 정의한다. - 그 응시점의 (X, Y, Z) 좌표가 나오면,
- Z 값 → 깊이(거리)
- X, Y 값 → 가로/세로 위치
- 이 좌표를 월드 카메라의 장면 좌표계와 정합하면,
“사용자가 화면/실제 공간에서 어디를 보는지”를 정확하게 찍어낼 수 있어.
📊 예시로 이해하기
- 눈 사이 거리(baseline) = 6.5cm
- 왼쪽 눈 시선: 정면보다 약간 오른쪽으로 5°
- 오른쪽 눈 시선: 정면보다 약간 왼쪽으로 5°
- 두 벡터는 앞쪽 2m 거리에서 교차 → → “사용자가 2m 앞의 물체를 보고 있다”
✅ 결론
- 시선 벡터 교차점 → 3D 공간 응시 좌표
- 그 좌표의 거리(Z값)를 보면 “얼마나 떨어진 물체를 보고 있는지” 알 수 있음
- Depth map(월드 카메라)와 결합하면 → 응시 중인 실제 물체를 특정할 수 있음
그러면 시선벡터가 교차하는 지점으로 월드좌표를 찍고, 그 월드좌표에 있는 물체의 거리와 시선벡터 거리가 일치하면 어떤 물체를 보는지 정확히 맞출 수 있겟네
그렇지! 👍 네가 이해한 게 바로 **정밀 응시점 추정(gaze-object intersection)**의 핵심 원리야.
🚀 과정 정리
- 시선 벡터 계산
- 왼쪽 눈, 오른쪽 눈 각각에서 시선 방향을 3D 벡터로 구한다.
- 두 벡터의 교차점(혹은 최소 거리점)을 찾는다 → 이것이 "응시 3D 좌표".
- 월드 카메라의 깊이맵/3D 포인트클라우드
- 스테레오 월드 카메라로 장면의 모든 픽셀마다 거리(depth)를 구한다.
- 즉, 월드 좌표계에서 "여기에 컵이 0.7m, 모니터가 1.5m" 같은 정보가 이미 있음.
- 좌표 정합
- 시선 벡터 교차점의 3D 좌표와, 월드 depth map에서 얻은 3D 물체 좌표를 비교.
- 만약 두 값이 일정 오차 이하라면(예: ±3cm), 사용자가 그 물체를 보고 있다고 판정.
📊 예시
- 시선 벡터 교차점 = (0.3m, 0.1m, 1.5m)
- 월드 depth map에서 모니터 중심 = (0.31m, 0.12m, 1.48m)
- 두 좌표 사이 거리 = 3cm → 오차 범위 안 → “모니터 응시 중”
✅ 장점
- 시선만 있으면 방향만 알 수 있는데,
- 월드 depth map과 결합하면 → “방향 + 실제 물체”가 매칭됨.
- 그래서 정확히 어떤 물체를 보는지 알 수 있게 돼.
'Projects > AI 아이트래킹 모델 프로젝트' 카테고리의 다른 글
| [도메인 공부 ] 5. MiDaS & DPT (0) | 2025.09.12 |
|---|---|
| [도메인 공부 ] 4. 시선 벡터(gaze vector) (0) | 2025.09.11 |
| [도메인 공부 ] 1. 스테레오 알고리즘 (0) | 2025.09.10 |
| [도메인 공부] 홍채 이동에 따른 상대좌표 문제 (0) | 2025.09.08 |
| 눈 내부 정규화, 2차 다항 캘리브레이션, 월드 평면 정합 (0) | 2025.09.05 |