Projects/AI 아이트래킹 모델 프로젝트

[도메인 공부 ] 2. 아이트래커 + 스테레오 비전

ha2yong 2025. 9. 11. 10:08

현재 봉착한 문제는 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. 최종 단계

  1. 월드 카메라 스테레오로 만든 3D 장면(깊이맵) 준비
  2. 눈 카메라로 계산한 시선 벡터를 월드 좌표계에 변환
  3. 시선 벡터와 depth map을 교차 → “어떤 물체 위에 응시점이 있는지” 판별
    • 예: depth map에서 2.3m 거리의 컵 좌표와 시선 벡터가 일치하면 → “컵을 보고 있음”
    • 또는 월드 영상에 빨간 점(응시점)을 찍어줄 수 있음

✅ 결론
네 말대로,

  • 월드 카메라만 있으면 → 깊이맵만 얻음
  • 눈 카메라만 있으면 → 시선 방향만 얻음
  • 두 개를 합치면 → 깊이맵 위에 시선이 교차하는 지점을 찍을 수 있고, 사용자가 어떤 물체를 보는지 정확히 알 수 있음

 

📌 원리 요약

  1. 두 눈에서 나온 시선 벡터를 3D 공간에 그린다.
    • 왼쪽 눈에서 쭉 뻗은 직선
    • 오른쪽 눈에서 쭉 뻗은 직선
  2. 이 두 벡터는 보통 딱 한 점에서 교차하지 않고, 약간 빗나가.
    → 그래서 보통은 “두 직선 사이의 가장 가까운 점(최소 거리 지점)”을 응시점으로 정의한다.
  3. 그 응시점의 (X, Y, Z) 좌표가 나오면,
    • Z 값 → 깊이(거리)
    • X, Y 값 → 가로/세로 위치
  4. 이 좌표를 월드 카메라의 장면 좌표계와 정합하면,
    “사용자가 화면/실제 공간에서 어디를 보는지”를 정확하게 찍어낼 수 있어.

📊 예시로 이해하기

  • 눈 사이 거리(baseline) = 6.5cm
  • 왼쪽 눈 시선: 정면보다 약간 오른쪽으로 5°
  • 오른쪽 눈 시선: 정면보다 약간 왼쪽으로 5°
  • 두 벡터는 앞쪽 2m 거리에서 교차 → → “사용자가 2m 앞의 물체를 보고 있다”

✅ 결론

  • 시선 벡터 교차점 → 3D 공간 응시 좌표
  • 그 좌표의 거리(Z값)를 보면 “얼마나 떨어진 물체를 보고 있는지” 알 수 있음
  • Depth map(월드 카메라)와 결합하면 → 응시 중인 실제 물체를 특정할 수 있음
 
그러면 시선벡터가 교차하는 지점으로 월드좌표를 찍고, 그 월드좌표에 있는 물체의 거리와 시선벡터 거리가 일치하면 어떤 물체를 보는지 정확히 맞출 수 있겟네

그렇지! 👍 네가 이해한 게 바로 **정밀 응시점 추정(gaze-object intersection)**의 핵심 원리야.


🚀 과정 정리

  1. 시선 벡터 계산
    • 왼쪽 눈, 오른쪽 눈 각각에서 시선 방향을 3D 벡터로 구한다.
    • 두 벡터의 교차점(혹은 최소 거리점)을 찾는다 → 이것이 "응시 3D 좌표".
  2. 월드 카메라의 깊이맵/3D 포인트클라우드
    • 스테레오 월드 카메라로 장면의 모든 픽셀마다 거리(depth)를 구한다.
    • 즉, 월드 좌표계에서 "여기에 컵이 0.7m, 모니터가 1.5m" 같은 정보가 이미 있음.
  3. 좌표 정합
    • 시선 벡터 교차점의 3D 좌표와, 월드 depth map에서 얻은 3D 물체 좌표를 비교.
    • 만약 두 값이 일정 오차 이하라면(예: ±3cm), 사용자가 그 물체를 보고 있다고 판정.

📊 예시

  • 시선 벡터 교차점 = (0.3m, 0.1m, 1.5m)
  • 월드 depth map에서 모니터 중심 = (0.31m, 0.12m, 1.48m)
  • 두 좌표 사이 거리 = 3cm → 오차 범위 안 → “모니터 응시 중”

✅ 장점

  • 시선만 있으면 방향만 알 수 있는데,
  • 월드 depth map과 결합하면 → “방향 + 실제 물체”가 매칭됨.
  • 그래서 정확히 어떤 물체를 보는지 알 수 있게 돼.