[영상 Geometry #6] 이미지 투영(Imaging Geometry)

영상처리 2013.07.22 16:54

(3D 비전 geometry 5번째 파트 Imaging Geometry입니다)



5. Imaging Geometry


이제 지금까지의 내용을 종합하여 3D 월드좌표에서 2D 픽셀좌표로의 변환 관계, 즉 이미지가 형성되는 과정을 정리해 보겠습니다.


설명의 편의를 위해 [영상처리] - [컴퓨터 비전에서의 Geometry #1] 좌표계의 <그림 1>을 다시 참조합니다.


<그림 1>


5.1 원근 투영 변환 (Perspective Projection Transformation)


먼저, 3D에서 2D로의 투영변환 행렬을 살펴보겠습니다.


투영변환은 3차원 공간에 있는 점을 이미지 평면에 투영시키는 변환인데, 투영변환을 모델링하는 방법에는 크게 2가지가 있습니다.


하나는 위 <그림 1>처럼 투영 기준점(projection reference point)을 좌표계의 원점으로 잡고 이미지 평면을 전방 Zc = d에 두는 경우이고 다른 하나는 투영시킬 이미지 평면을 좌표계 원점에 위치시키고 투영 기준점을 Zc = -d에 잡는 경우입니다.


먼저, <그림 1>처럼 투영 기준점을 원점으로 잡은 경우 3차원 상의 점 P를 p'으로 투영시키는 변환 행렬은 다음과 같이 주어집니다 (homogeneous 좌표 표현).


 --- (1)


즉, 투영평면이 Zc = d일 경우 (Xc, Yc, Zc, 1)는 (Xc, Yc, Zc/d) = (d*Xc/Zc, d*Yc/Zc, 1)로 투영됩니다.


다음으로, 만일 투영평면이 Zc = 0이고 투영 기준점을 (0, 0, -d)인 경우에는 투영변환 행렬이 다음과 같이 주어집니다.


 --- (2)


이 경우, (Xc, Yc, Zc, 1)은 (Xc, Yc, 1+Zc/d) = (d*Xc/(Zc+d), d*Yc/(Zc+d), 1)로 투영됨을 알 수 있습니다.


이 외에도 투영변환을 표현하는 방법은 다양합니다면 여기서는 식 (1)을 기준으로 Zc = d로의 투영변환을 다음과 같이 표현하겠습니다.


 --- (3)



5.2 이미지 투영 모델


월드 좌표계 상의 한 점 (X, Y, Z)를 이미지 평면(픽셀 좌표계) 상의 점 (x, y)로 변환시키는 행렬을 H라 하면, 그 관계식은 다음과 같습니다 (homogeneous 좌표를 사용).


 --- (4)


이 때, H는 3 × 4 행렬로서 다음과 같이 분해하여 표현할 수 있습니다.


 --- (5)


 --- (6)


식 (5)에서, [R|t]는 월드 좌표계를 카메라 좌표계로 바꾸는 rigid 변환 행렬, Tpers(1)는 카메라 좌표계 상의 3D 좌표를 정규 이지미평면(normalized image plane)에 투영시키는 프로젝션(projection) 행렬, K는 카메라 내부(intrinsic) 파라미터 행렬로 정규 이미지 좌표를 픽셀 좌표로 바꾸어 줍니다. Tpers(1)은 d = 1 즉, Zc = 1인 평면으로의 투영변환을 말합니다 (즉, normalized image plane으로의 투영).


이제 식 (6)에서 투영변환 Tpers(1)과 rigid 변환 [R|t]를 하나로 합치면 다음과 같이 좀더 간단한 표현식이 됩니다.


 --- (7)


이 때, 앞부분 K를 내부 카메라 행렬(intrinsic camera matrix)이라 부릅니다. K는 카메라 내부 파라미터 (intrinsic parameter)를 나타내고 뒷부분 rigid 변환 [R|t]은 카메라 외부 파라미터 (extrinsic parameter)를 나타냅니다.



* 참고사항 1


다른 문제들도 마찬가지겠지만 모델이라고 하는 것이 정의하기에 따라 또 기준을 어떻게 잡느냐에 따라 다양한 방식의 표현 및 해석이 가능합니다.


제가 이 글에서는 3D 공간이 일단은 정규 이미지 평면에 투영된 후에 픽셀 이미지로 변환되는 것으로 설정을 했기 때문에 식 (6)과 같은 형태로 카메라 모델 수식이 표현되었습니다. 그런데 이렇게 하면 수식 자체는 식 (7)과 같이 깔끔하게 정리되지만 카메라 내부 파라미터 행렬인 K에 대한 기하학적 해석이 직관적이지 않은 문제가 있습니다.


그 이유는 실제 투영은 가상의 normalized 이미지 평면이 아닌 초점거리 f의 이미지 평면으로 투영되기 때문입니다. 따라서, 실제로는 투영변환이 Zc = f 평면으로의 투영인 Tpers(f)가 되어야 하며 K는 물리적인 metric 좌표 단위를 픽셀 좌표계 단위로 변환시켜주는 변환행렬이 되어야 합니다.


 --- (8)


위 식 (8)에서 f는 초점거리(카메라 좌표계 원점과 이미지 센서와의 거리), sx, sy는 이미지 센서의 metric 단위를 x, y 픽셀 단위로 바꿔주는 일종의 스케일(scale) 요소입니다. 


여기서 Tpers(f)를 편의상 식 (3)과는 조금 다른 형태로 표현했는데, 표현만 다를 뿐 실제로는 같은 변환입니다. 즉, Tpers(f)는 다음과 같이 2가지 형태로 표현할 수 있으며 homogeneous 좌표에서는 둘다 같은 변환입니다.


 --- (9)


결과적으로 식 (8)과 식 (7)을 비교해 보면 단지 sx*f를 fx, sy*f를 fy로 표현한 것임을 알 수 있습니다.


사실 식 (7)이나 식 (8)이나 모두 같은 말이며 어떤 모델 표현을 사용해도 관계는 없습니다. 하지만, 보통 일반적으로 사용되는 카메라 모델 표현은 식 (7)이므로 식 (7)의 표현을 사용하는게 좋겠습니다.



* 참고사항 2


식 (7)의 카메라 모델에서는 영상왜곡은 고려하지 않았습니다. 만일 영상왜곡까지 고려한다면 왜곡모델은 투영변환과 내부 파라미터 변환 사이에 들어가야 합니다. 즉, normalized 이미지 평면에 투영된 좌표 (u, v)에 대해 왜곡 파라미터를 반영한 후에 K를 통해 픽셀 좌표계로 변환해야 합니다. 영상왜곡에 대해서는 카메라 왜곡보정 - 이론 및 실제 글을 참조하기 바랍니다.



5.3 OpenCV 관련 함수


OpenCV 관련 함수들 목록입니다.

  • calibrateCamera(): 평면물체(planar object) 상의 점들에 대한 3D 월드좌표와 2D 이미지 픽셀 좌표 쌍들을 입력으로 주면 camera matrix K와 왜곡계수, 그리고 [R|t] 행렬을 반환해 줌. 최소 2개 이상의 서로 다른 시점(view point)에서 입력 데이터를 획득해야 하며, [R|t]는 각 시점별로 계산되어 반환됨
  • decomposeProjectionMatrix(): 3D 월드좌표를 2D 픽셀 좌표로 변환시켜주는 3 × 4 변환행렬을 입력으로 주면, 이 행렬을 카메라 행렬 K와 [R|t] 행렬로 분해해 줌
  • solvePnP() / solvePnPRansac(): 카메라 내부 파라미터 행렬 K와 3D 월드좌표 - 2D 픽셀좌표 매칭쌍들을 입력으로 주면, 카메라 외부 파라미터인 [R|t] 행렬을 계산해 줌. 최소 4개의 좌표쌍을 필요로 함



by 다크 프로그래머


  • 이전 댓글 더보기
  • Happy 2015.06.30 09:25 신고 ADDR 수정/삭제 답글

    안녕하세요 글 올려주시는거 항상 잘 보고 있습니다.
    글을 보다가 궁금한점이 생겨서 여쭈어 봅니다.

    위 공식에서는 3D좌표를 알고 Instinct parameter와 Extrinct parameter를 알면 2D 좌표를 얻을 수 있을 것 같습니다.
    그리고 처음에는 간단하게 2D 좌표와 Instinct parameter와 Extrinct parameter의 역행렬을 이용하여
    다시 3D 좌표를 얻을 수 있겠다고 생각했습니다.
    그런데 Extrinct parameter의 행렬이 3*4 행렬이라.. 수도 역행렬? 이란것을 이용해야 하는건지..
    2D좌표를 3D 좌표로 변환시킬 수 있는 다른 공식이 있는가요?

    • BlogIcon 다크pgmr 2015.06.30 10:01 신고 수정/삭제

      안녕하세요. 일반적으로 3D에서 2D 좌표를 얻는 것은 가능하지만 2D에서 3D를 얻는 것은 부가적인 정보 없이는 불가능합니다. 이미징 과정은 부피가 있는 3차원 공간을 2D 평면에 투영시키는 것이기 때문에 많은 정보가 소실되는 변환입니다. 투영선(projection ray) 상에 있는 수많은 점들이 영상에서는 한 점으로 투영됩니다. 따라서 부가적인 정보없이 단순히 2D 이미지만 가지고 3차원 정보를 복원하는 것은 불가능합니다. 하지만 2D 이미지가 2장 이상일 경우에는 3차원 정보의 복원이 가능하며 이에 대한 이론을 정리한 것을 epipolar geometry라 부릅니다. 그리고 epipolar geometry 원리가 사용되는 대표적인 예로 스테레오 카메라가 있습니다. 또 하나 물체의 정확한 3차원 모델 정보를 알고 있는 경우에도 영상으로부터 3차원 위치정보의 복원이 가능합니다. 그리고 이러한 계산 알고리즘으로 PnP(Perspective n-Point) 알고리즘이 있습니다.

  • 공돌이 2015.07.24 13:28 신고 ADDR 수정/삭제 답글

    안녕하세요, 항상 글 잘 보고 있습니다.
    로테이션 matrix, T, intrinsic matrix가 곱해지는 과정에서 단위가 궁금합니다.
    월드 좌표계에선 단위를 mm로 하였기에, X,Y,Z 단위가 mm라고 하면, Xc, Yc, Zc도 카메라 기준으로 한 3차원 좌표계이므로 단위가 mm일 것이라 생각하였는데, 결국 이미지의 단위는 픽셀이잖아요? intrinsic matrix의 구성 요소들도 단위가 픽셀이기에 K의 역행렬을 곱해도 단위가 픽셀일거고요.
    그럼 그 단위가 환산될 수 있는 곳이 T밖에 없다고 생각합니다.
    이론적으로는, 다크님이 위에 써주신 것과 같이 될 것 같은데, 실제로는 이런 것들이 T에서 반영되는건지, 아니라면 어디서 단위가 환산되는지 알고 싶습니다. 감사합니다!

    • BlogIcon 다크pgmr 2015.07.25 01:34 신고 수정/삭제

      좋은 질문이십니다. 영상좌표는 픽셀(pixel) 단위, 월드좌표 & 카메라 좌표는 물리단위(m, cm, mm 등)이지만 정규 이미지 좌표는 단위가 없습니다. 카메라 좌표 (Xc, Yc, Zc)를 depth 1인 평면에 투영시킨 좌표는 (Xc/Zc, Yc/Zc, 1)이고 여기서 (Xc/Zc, Yc/Zc)를 정규 이미지 좌표라 부릅니다. 그런데, 이 좌표는 아무런 단위가 없는 좌표입니다. meter가 될수도, mm가 될수도, cm가 될수도 있으며 심지어 pixel이 될 수도 있습니다. depth 1을 cm로 해석하면 (Xc/Zc, Yc/Zc)도 cm가 되고, m로 해석하면 m가 됩니다. 그리고 여기에 픽셀단위인 초점거를 곱해서 나온 값 (Xc/Zc*fx, Yc/Zc*fx)은 픽셀단위의 좌표가 됩니다. 즉, 월드좌표-카메라좌표까지는 물리적 단위를 갖지만 이를 정규 이미지 평면에 투영시킨 좌표(depth로 나눈 좌표)는 단위가 없고, 여기에 K를 곱하면 픽셀 단위가 됩니다.

    • 공돌이 2015.07.29 10:54 신고 수정/삭제

      많은 도움이 되었습니다.
      정말 감사합니다.

  • 맵핑 2015.08.12 02:41 신고 ADDR 수정/삭제 답글

    안녕하세요?^^;
    감사히 잘보고 갑니다.
    그런데 혹시, 좌항(이미지 좌표(x,y,1))에서 곱해져있는 s 가 의미하는 바가 무엇인지요?
    intrinsic parameters에 곱해지는 sx, sy 와는 다른 의미를 갖고 있을 것 같은데 가늠이 안되네요^^;;

    • BlogIcon 다크pgmr 2015.08.12 11:22 신고 수정/삭제

      s는 homogeneous 좌표 표현(http://darkpgmr.tistory.com/78)에서의 스케일 성분으로 생각하시면 됩니다.

    • 맵핑 2015.08.12 16:44 신고 수정/삭제

      그럼 scale factor(크기를 나타내는) 이기때문에
      x=1, y=1 이미지 좌표에 대해 생각한다면,
      스케일 성분이므로, x=2, y=2, ... x=10, y=10... 모든 점들이 동일하게
      변환관계를 성립한다는 의미로 이해하면 되는건가요?^^;;

    • BlogIcon 다크pgmr 2015.08.12 17:02 신고 수정/삭제

      아니요. 식 (1)에 의해 투영된 정규 이미지 좌표는 (a, b, s)와 같이 homogeneous 좌표 형태로 나옵니다. 그런데, homogeneous 좌표는 마지막 성분으로 나누어야만 실제 좌표가 나옵니다. 즉, x = a/s, y = b/s가 실제 투영된 정규 이미지 좌표이기 때문에 이를 수학적으로 하나의 식으로 표현하기 위해 (a, b, s) = s(a/s, b/s, 1)라고 표현한 것입니다. homogeneous 좌표 표현에 대해 다시 한번 글을 읽어보시기 바랍니다.

    • 라도파 2016.06.27 16:14 신고 수정/삭제

      OpenCV 의 projectPoints를 직접 풀어보다가 여기 부분을 놓쳐서 헤맸네요. sp=K[R|t]P형태에서 우항을 푸니 값이 좀 크게 나오더군요. 하두 이상해서 OpenCV의 projectPoints함수 소스코드를 찾아보니 맨 오른쪽의 [R|t]P 연산결과인 3x1 벡터에서 마지막 값을 기준으로 정규화한 뒤, 카메라 디스토션 보정, 그리고 intrinsic파라미터 K를 곱해주는 연산 순으로 진행됩니다.
      하여튼 결론적으로는... 우항 연산 결과 z값이 1이 안 나왔을 때, 그걸 1로 맞춰준다고 생각하면 되는 거고.. 깊은 내용은 역시 호모지니어스 부분을 참고...;;

  • Moonwalker 2016.01.16 19:59 신고 ADDR 수정/삭제 답글

    안녕하세요. 궁금한 사항이 있는데요. 식(1)에서 Pc(Xc,Yc,Zc) 카메라 좌표 가 아니라 P ( X,Y,Z ) 가 되어야 3차원 임의의 점을 normalized plane에 투영하는 식이 맞지 않나요 ??

    • BlogIcon 다크pgmr 2016.01.18 09:05 신고 수정/삭제

      직접적인 투영은 카메라 좌표계에서 이루어지는 것이 맞습니다. 말씀하신 월드-이미지 투영은 식 (7)을 참조하시기 바랍니다.

  • 리리 2016.06.07 03:48 신고 ADDR 수정/삭제 답글

    안녕하세요. 그래픽스를 처음 공부하는 학생입니다.
    투영평면이 Zc = 0이고 투영 기준점을 (0, 0, -d)인 경우에
    (Xc, Yc, 1+Zc/d) = (d*Xc/(Zc+d), d*Yc/(Zc+d) 에서
    오른쪽 변이 어떻게 나오게 되는건지 궁금합니다.
    그리고 일반적으로 투영행렬이라고 하는것은 투영변환행렬을 의미하는건가요?, 또 투영변환행렬은 s[u,v,1] = [1 0 0 0 1 0 0 ... 1/d 1][xc yc zc 1] 전체를 의미하는건가요? 아니면 [1 0 0 0 1 0 0 ... 1/d 1] 이부분만 의미하는건가요?? 답해주시면 정말 감사하겠습니다!!

    • BlogIcon 다크pgmr 2016.06.07 16:36 신고 수정/삭제

      안녕하세요. homogeneous 좌표 표현에서는 (wx, wy, wz) = (x, y, z)로 좌표의 상수배에는 영향을 받지 않습니다. (Xc, Yc, 1+Zc/d)에서 우변은 3번째 성분으로 나눈 결과입니다. homogeneous 좌표표현에 대해서는 http://darkpgmr.tistory.com/78 글을 참조하시면 도움이 될 것 같습니다.

  • 라도파 2016.06.17 16:07 신고 ADDR 수정/삭제 답글

    안녕하세요, 다크프로그래머님의 글을 잘 보고 있습니다. 일일이 답변도 다 달아주시고, 정말 감사하네요.
    저도 한 가지 질문이 있어서 댓글을 달아봅니다.
    외부 파라미터를 구하는 과정 - slovePnP와 같은 함수를 직접 만들어보고 있는데요, 입력좌표쌍의 월드좌표의 Z가 모두 0일 경우 r_13, r_23, r_33이 모두 쓸모없어지는게 아닌가 하구요. 매칭쌍 4개를 임의로 정한 뒤, 손으로 직접 풀어보기 위해 연립방정식을 전개해보면 r_13, r_23, r_33을 어떻게 알아내야 될지 모르겠습니다.

    • BlogIcon 다크pgmr 2016.06.17 16:28 신고 수정/삭제

      저도 순간, 그렇네? r_13, r_23, r_33은 어떻게 구하지? 했습니다. 그런데 조금 생각해 보니 R은 회전변환이기 때문에 1열과 2열이 결정되면 자연히 3열도 결정이 되네요. 회전변환은 직교행렬(orthogonal matrix)이기 때문에 모든 행벡터, 열벡터들이 모두 단위벡터(길이가 1)이고 서로 직교합니다.

  • 라도파 2016.06.17 16:21 신고 ADDR 수정/삭제 답글

    질문을 올리고 다시 보니 너무 어이가 없는 질문 같아서 지우려고 했는데 패스워드를 모르네요 ㅎㅎ 너무 수준낮은 질문같아서~ 하여튼 저는 Z를 모두 1로 만들어서 어떻게든 해보려고 합니다.
    그런데 호모지니어스 방법으로 변환행렬을 3x4로 싹 묶어서 한 번에 풀면 풀릴까요? 굳이 카메라의 좌표를 몰라도 되고 단지 월드->이미지 프로젝션만 하고 싶다면 나눌 필요가 없는 게 아닐까 생각중입니다... 였었는데 안 되네요. 해공간이 직선 이상으로 커져버립니다. 한 평면위에 있는 4개의 점은 무조건 안 되는 걸까요?

    • BlogIcon 다크pgmr 2016.06.17 16:31 신고 수정/삭제

      그렇지 않습니다. 아주 좋은 질문이고 특히나 궁리하다가 생긴 의문은 더욱 좋은 질문입니다. Z = 1로 놓고 풀어도 좋지만 제 생각에는 Z = 0으로 잡는게 좀더 간편할 것 같습니다.

  • Zenties 2016.08.05 14:39 신고 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님. 작성하신 글을 감사히 잘읽었습니다. 제가 이번에 directx에 관심을 가지게 되어서 투영에 관해 정보를 찾아보고있는 찰나에 다크프로그래머님의 글을 읽게 되었습니다. 저는 '5.2 이미지투영'에 관해 좀더 전문적인 서적이나,, 정보들을 알고싶은데.. 제가 찾아본 서적은 "DirectX11을 이용한 3D 게임 프로그래밍 입문" 입니다 제가 알고자하는 정보가 이 서적에 참고할만한 내용이 맞는지 아니면 어디서 투영에 관한 정보를 얻을수있는지 알고자 댓글을 남깁니다. /// 제가 알고싶은것 -> "특정 게임 내에서 좌표와 카메라 행렬을 추출한뒤 추출한 데이터를 이용해 외부 프로그램(directx)을 이용해서 케릭터 위에 특정 데이터를 출력하는 방식." (제 댓글을 뒷받침 할수있는 내용 -> 유튜브.com/watch?v=06PpBTzVNts) (데이터 추출은 방법을 제가 알고있기 때문에 이 내용과 무관합니다)

    • BlogIcon 다크pgmr 2016.08.05 18:46 신고 수정/삭제

      안녕하세요. 말씀하신 책은 모르는 책입니다.. 저는 게임 프로그래밍과는 무관한 사람입니다;; 말씀하신 내용은 영상기하학과 관련된 내용인데 영상기하학에 대한 대표적인 서적은 multiple view geometry in computer vision 이란 책이 있습니다. 물론 내용도 많고 원서(영어)라는 문제점이 있습니다.. 해당 책 내용 중 single view geometry 파트까지만 보면 필요하신 기본 지식을 습득할 수 있을 것으로 생각됩니다.

  • 새내기 2016.11.10 16:04 신고 ADDR 수정/삭제 답글

    이제 막 비젼분야에 입문한 대학생입니다 :) 모르는 것 투성이지만 다크님 덕분에 차근차근 조금씩은 앞으로 나아가고 있는 것 같습니다. 다크님께 조언을 듣고자 댓글을 남겨봅니다

    제가 고정되어 있지 않은 카메라와 바닥에 있는 물체 사이의 실제 거리를 구하고자 하는데요.
    물체의 실제크기는 알지 못하는 상황입니다. 이 때 실제 거리를 어떻게 구해야 하나요?
    실제 거리에 대한 이야기들을 많이 찾아보았지만 대부분 실제 크기를 아는 경우가 많더라구요ㅠ
    이 때에는 epipolar 기법을 사용해서 2D에서 3D로 좌표변환을 해야 할 것 같은데 제 생각이 맞나요?
    이에 대한 조언 부탁드립니다!!

    • BlogIcon 다크pgmr 2016.11.10 18:41 신고 수정/삭제

      일단 http://darkpgmr.tistory.com/153 글에 있는 내용으로 해결 가능한지 살펴보시기 바랍니다.

  • calibration 2017.04.11 11:37 신고 ADDR 수정/삭제 답글

    셀프칼리브레이션 논문 읽다가
    ////////// 1 0
    p ~ KR [ 0 1 R't ]L
    ///////// 0 0

    3x3 projection matrix를 위에처럼 나타냈는데 이해가 잘안되네요
    K는 내부파라미터 R은 로테이션 t는 트렌스레이션 L은affine에서 Euclidean으로 바꿔주는 메트릭슨데
    행렬안에 R'(전치행렬) t 가 되는 이유를 모르겠네요
    혹시 다크님은 알고 있으신지요??

  • 333 2018.02.18 17:14 신고 ADDR 수정/삭제 답글

    첫 번째로..수식(4) 밑에
    이 때, T는 4 × 3 행렬로서 다음과 같이 분해하여 표현할 수 있습니다.
    -->여기서 4 x 3 이 아니라 3 x 4 아닌가요?...

    두 번째로.. 수식(8)의 첫 줄에서 두번째 줄로의 변환이 이해가 잘 가지 않습니다.
    수식(6)에서 수식(7)로의 변환을 설명하시면서 Tpers(1)행렬과 RT행렬을 곱해서 하나의 행렬로 표현했다고 하셨고....동일한 방법으로 행렬곱셈을 해서 풀어보려고 하는데 이게 잘 안되네요...
    무슨의미로 (8)수식을 쓰셨는지는 알겠고, 어떤형태로 3개의 행렬(카메라행렬과 Tpers행렬 RT행렬)을 2개의 행렬로(카메라, RT)로 통합하셨는지도 의미적으로는 알겠는데 직접 행렬을 풀어서 해보려니 잘 안되네요..;;
    (8)에서 [3x3][3x4][4x4] 이면 [3x4][4x4]가 나와야 되는데 작성된 수식은 [3x3][4x4]이기도 하고...ㅜ.. [0, 0, 0]열의 표기에 대한 규칙이 있나요?
    [sxf 0 cx 0] [0 syf cy 0][0 0 1 0] 행렬과
    [r11 r12 r13 tx][r21 r22 r23 ty][r31 r32 r33 tz][ 0 0 0 1] 행렬로 표현되어야 할 것 같아 문의드립니다..


    • BlogIcon 다크pgmr 2018.02.19 10:04 신고 수정/삭제

      안녕하세요. T는 3 x 4로 수정하였습니다. 잘못된 부분을 알려주셔서 감사합니다.
      이하 수식에 대한 부분은 지금 제가 봐도 어려운 것 같습니다. 두 행렬의 곱 AB에서 A의 k번째 열벡터가 0벡터면 A에서 k번째 열벡터를 지우고, B에서 k번째 행벡터를 지운 축소된 행렬 A', B'에 대해 AB = A'B'과 같은 결과가 됩니다. 하지만, 결과적으로 같을 뿐인 것을 수식에서 설명없이 사용한 것은 비약이 심했던 것 같습니다. 지금보니 수식을 다시 정리할 필요가 있을 것 같습니다만.. 지금 수정하려니 daum 수식편집기가 오류가 나면서 뭔가 잘 작동을 하지 않습니다..

    • BlogIcon 다크pgmr 2018.02.19 10:20 신고 수정/삭제

      익스플로러에서 하니 수식 수정이 되는군요.. (8)을 약간 수정하였습니다.

  • nick 2018.03.05 17:23 신고 ADDR 수정/삭제 답글

    안녕하세요
    이런저런정보를 찾아보다가 찾게되었습니다.
    제가 이쪽은 잘모르나.. 관련된 업무를 진행할 일이 있어서 여쭤볼게 있어서요.
    저는 앱 개발자입니다.
    폰에서 카메라로 비춰지는 건물이 있다고 가정하면 그 건물이 화면에 보여지면 폰 화면에서의 건물의 양끝 x좌표를 구할수 있을까요?
    건물의 양끝 GPS좌표가 있다고 가정하고요. 저의 GPS를 바탕으로 거리는 구할수 있겠는데 그걸 어떤식을 풀어 나가야 할지 애매해서 이렇게 질문 남깁니다.

    • BlogIcon 다크pgmr 2018.03.05 17:47 신고 수정/삭제

      안녕하세요. 건물의 양끝 gps 좌표가 있다면 거기서 바로 x 좌표를 구하면 될 것 같습니다만.. '폰 화면에서의 건물의 양끝 x 좌표'가 어떤 의미인지요? (픽셀좌표? 월드좌표? x축은 어디이고 y축은 어디로 잡으신 것인지 등등)

    • nick 2018.03.06 09:35 신고 수정/삭제

      답변 감사합니다.
      제가 이쪽관련 지식으 부족하네요.
      폰화면에서의 x좌표는 현재 보이는 스크린(view)에서의 좌표입니다. 그걸 따서 건물의 양끝을 화면에 표현해 주고 싶거든요.
      다크님에 따르면 아마 픽셀 좌표 일듯합니다.
      화면기준으로 x축은 가로 방향이에요.

      혹시 가능하다면 어떤 걸 참조해서 하면 될까요?

    • BlogIcon 다크pgmr 2018.03.06 14:32 신고 수정/삭제

      네, 그러시면 자신(휴대폰)의 gps 좌표, 표시하고자 하는 건물의 양 끝의 gps 좌표가 주어져 있을 때, 휴대폰 화면에서 건물 양 끝의 x 좌표를 구할 수 있는가의 문제로 생각하면 되나요? 제가 제대로 이해했는지는 잘 모르겠습니다만 이해한 것이 맞다면 구하는 것은 어려울 것 같습니다. 기하학적으로 영상에서의 위치를 결정하려면 카메라의 x, y 좌표뿐만 아니라 카메라의 높이(z), 그리고 방향(pitch, roll, yaw) 정보가 필요합니다. 그리고 덧붙여서 카메라의 내부 정보(초점거리)도 같이 필요합니다. 만일 제가 말한 정보가 모두 주어진다면 영상에서의 위치를 결정하는 것은 어렵지 않습니다.. 하지만 현실적으로 그러한 정보를 얻기가 쉽지 않으니 결론은 어렵다고 생각됩니다.

    • nick 2018.03.08 10:48 신고 수정/삭제

      답변 감사합니다.
      카메라 높이(z)와 카메라 초점거리는 알수 없을 것 같습니다.
      자이로 센서를 방향(pitch, roll, yaw) 정보는 알수 있습니다
      z와 카메라 초점거리는 알 수 없지만 대략적으로 테스트라도 해보려고 합니다.
      일단은 x좌표만 먼저 구해보고 향후 진행 방향을 정해 볼까해서요.
      어떤자료 참고하면 좋을까요?

    • BlogIcon 다크pgmr 2018.03.08 17:34 신고 수정/삭제

      일단 카메라 파라미터에 대한 이해가 필요하구요(http://darkpgmr.tistory.com/32), 이후 카메라 좌표계에 대한 이해(http://darkpgmr.tistory.com/77), 그리고 http://darkpgmr.tistory.com/122, http://darkpgmr.tistory.com/153 글들을 읽어보시면 좋을 것 같습니다. 기본적인 영상기하학을 이해하면 풀수 있는 문제이긴 하지만 그러기 위해서는 조금은 공부가 필요합니다. 완벽하진 않지만 제 블로그에 있는 위 글들도 읽어보시고 또 부족한 부분은 인터넷 등을 참고하시면 좋을 것 같습니다.

    • nick 2018.03.09 09:40 신고 수정/삭제

      답변 감사합니다!

  • heben 2018.06.05 17:49 신고 ADDR 수정/삭제 답글

    안녕하세요. 원근 투영 변환에 대해 이해가 잘 안가는 부분이 있어 질문드립니다.
    1. 만약 d=1로 잡았을 경우, 원근 투영 변화는 x, y 성분을 z로 나눈 값이 된다고 이해했고,
    2. 설명에서 점 P를 p'로 투영한다고 하셔서 카메라 좌표계의 점을 정규좌표계로 옮긴다고 이해했습니다.
    3. 그리고 제가 알기로 정규 좌표계는 x,y 값이 -1~1 사이라고 알고있습니다.

    그렇다면, 이 과정에서 카메라 모델의 x,y aspect가 고려가 되는 것인지, 그리고 카메라 내부 파라미터의 영향이 제거되는 것인지 잘 이해가 되지 않습니다.

    • heben 2018.06.05 18:16 신고 수정/삭제

      그래픽스쪽 용어와 살짝 혼동을 한 것 같습니다. 3번은 제가 잘못 이해하고 있던 부분인 것 같습니다.

      그래도 단순히 x,y 좌표를 z좌표로 나눠주는 과정에서 카매라 내부 파라미터의 영향이 제거된 정규좌표계의 좌표를 구할 수 있는 것인가요?

    • BlogIcon 다크pgmr 2018.06.05 21:01 신고 수정/삭제

      물리좌표는 depth로 나누어서 정규좌표가 되고, 영상좌표는 초점거리로 나누어서 정규좌표가 됩니다. 카메라 내부 파라미터가 제거되는 것은 영상좌표를 초점거리로 나누는 과정에 해당되는 말입니다. 그리고 정규좌표는 영상좌표와 물리좌표를 연결하는 매개 역할을 한다고도 볼 수 있구요. 정규화에 대해서는 http://darkpgmr.tistory.com/77 글을 참조하시기 바랍니다.

  • 아빠딸 2018.09.11 03:19 신고 ADDR 수정/삭제 답글

    안녕하세요 좋은 정보 잘 보았습니다. 알려주신 방법대로 문제를 해결해 보려 하였으나
    3차원 좌표에서 2차원 이미지 좌표로의 변환이 되지 않고 있습니다.ㅡㅠ
    가지고 있는 정보는 3차원 좌표값과 카메라 위치와 회전정보, 카메라 내부요소 입니다.
    위에 정보처럼 축 설정을 하였고 행렬을 구해보려 하였으나 3차원 모든 점이 2차원의 한점으로 수렴됩니다. 혹시 이와 관련하여 알려주실 힌드 좀 있으신가요.

    • BlogIcon 다크pgmr 2018.09.11 09:32 신고 수정/삭제

      안녕하세요. 구현 과정을 직접 보기 전에는 원인을 알기는 어렵다고 생각됩니다. 계산 과정에서 중간 중간 단계별로 결과값을 출력하여 어떤 부분에서 문제가 발생했는지 파악하는게 우선 필요하다고 생각됩니다. 먼저, 그러한 노력을 해 보시고 그래도 해결이 안된다면 구현하신 계산 과정을 다른 사람들이 보기 편하도록 간단히 정리하여 올려주시면 저도 검토해 보도록 하겠습니다.

  • 아빠딸 2018.09.11 14:42 신고 ADDR 수정/삭제 답글

    답변 감사드립니다.
    간단하게 소스를 요약해드리면
    R|t = mRz*mRy*mRx; //각 요소는 카메라 외부요소에 x축만 -90(라디안 변환함)
    Result1 =R|t*GP+t; // GP(3차원 점Px,Py,Pz), t=이동량Matrix, 그리고 t=(GP-C); C는 카메라위치
    if( Result1[2]!=1.0 )
    { // 동차좌표 표현
    Result1[0] /=Result1[2]; Result1[1] /=Result[2]; Result1[2] /=Result[2];
    }
    Result2 =K*Result1; // K는 내부카메라요소행렬(fx =Sx*f) Sx =1mm당 픽셀수(=1/0.00345(픽셀사이즈mm), f:초점거리

    이렇게 해서 나온 결과 Result2에 x,y 가 이미지 좌표라 생각하였는데
    결과가 ...예를 들면,
    첫번째 결과, 530.120393, 630.12456
    두번째 결과, 530.124344, 630.13556
    ...이렇게 작은 값들만 뒤에서 변합니다.ㅠㅡㅠ
    간략히 쓰긴 하였는데 이해가 되셨는지 모르겠네요.

    • BlogIcon 다크pgmr 2018.09.11 15:30 신고 수정/삭제

      전반적으로 봤을 때, 계산 과정 상의 특별한 문제는 없어 보입니다. 다만, t = (GP-C)는 조금 이상합니다. t = -R*C이어야 합니다. 그리고, 표현상 R|t는 R로 표기하는 것이 좋습니다.
      어떤 문제를 해결하기 위해서는 문제를 단순화시키는 것이 필요합니다. 예를 들어, 회전이 없다고 가정하고 R을 항등행렬(Identity 행렬) 로 놓고 계산을 했을 때도 동일한 문제가 발생하는지 확인해볼 필요가 있습니다. 그리고 테스트용 GP도 다양한 방식으로 다양성을 주면 좋을 것 같습니다.

    • 아빠딸 2018.09.11 16:43 신고 수정/삭제

      t가 GP-C인 것은 임의의 점 GP에서 카메라의 위치 C를 빼서 카메라에서 바라본 GP의 위치값을 나타냅니다. 이게 먼가 다른가 보네요...이게 맞을 것 같아서 그렇게 하였고 t=-R*C라는 것이 회전행렬에 카메라위치를 곱해서 -하는 것 같은데 이렇게 해보니 이상한 값들이....화면 가운데 중심으로 퍼져서 나옵니다.ㅠㅠ R에 대해 항등행렬은 한번 해보겠습니다~!

    • 아빠딸 2018.09.11 17:07 신고 수정/삭제

      아 그리고,
      t=-R*C로 하면
      위의 식, R*GP+t -> R*GP-R*C -> R*(GP-C) 이것으로 이해해도 맞는지요?

    • BlogIcon 다크pgmr 2018.09.11 20:31 신고 수정/삭제

      네, 맞습니다

  • KH 2018.09.28 11:32 신고 ADDR 수정/삭제 답글

    안녕하세요. 실시간 프로젝션맵핑을 공부하는 사람입니다. 다크프로그래머님 정보 아주 자주 이용합니다.
    하나 여쭙고 싶습니다. OPENCV의 calibratecamera 함수를 사용 중입니다. (https://www.youtube.com/watch?v=pCq7u2TvlxU) <--이렇게 구현하고 싶습니다... 3D월드좌표와 2D이미지픽셀좌표 중에 어느게 실시간으로 좌표값이 변화가 되어야하나요???? ㅜㅜ

    • BlogIcon 다크pgmr 2018.09.28 11:39 신고 수정/삭제

      물체의 3D 월드좌표는 고정, 2D 이미지 좌표는 실시간 변경해서 사용하면 됩니다.

    • KH 2018.09.28 11:45 신고 수정/삭제

      답변 정말 감사합니다.
      그 의미는 Tracker(실제 물체에 부착)의 3D월드좌표가 고정이란 뜻인가요?

  • KH 2018.09.28 14:16 신고 ADDR 수정/삭제 답글

    계속 기본적인 질문을 드려 죄송합니다 ㅠㅠ위에서 말씀해주신 calibratecamera함수에서 objectPoints(물체의 3d월드좌표)를 제가 tracker를 단 물체의 각 꼭지점(로컬좌표)으로 계산하였습니다. 그러면 projection matrix를 제대로 변환하기 위해서는 로컬좌표를 월드좌표로 변환해야하나요?

    • BlogIcon 다크pgmr 2018.09.28 15:43 신고 수정/삭제

      변환할 필요없이 로컬좌표를 그대로 월드좌표로 사용하면 됩니다. 실제 움직이는 것이 물체라 할지라도 물체는 고정되어 있고 카메라가 움직이는 것으로 생각해도 문제는 없으니까요.

    • KH 2018.09.28 16:41 신고 수정/삭제

      친절한 답변 정말 감사합니다!!!

  • ㅇㅇ 2018.09.29 19:31 신고 ADDR 수정/삭제 답글

    안녕하십니까 기본기 공부중이라 항상 잘보고 있습니다. 제 업무중에 RealSense d435 카메라의 left-infrared camera와 color camera를 align 시키는 업무가 있는데요(depth image는 left-infrared camera에 이미 align 되어있음)이 depth image를 color image에 align시키는 것은 librealsense2 함수 Align을 쓰면 잘 맞춰지는데 infrared image는 align 함수가 지원이 안되더라구요. 그래서 문의를 해보니까
    ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
    But one suggestion for you to have a try, Basically the mapping is a triangulation technique where we go through the intersection point of a pixel in 3D space to find its origin in another frame, this method work properly when the source data is depth (Z16 format).
    One possible way to map between two none-depth stream is to play three streams (Depth+IR+RGB), then calculate the UV map for Depth to Color, and then use this UV map to remap IR frame ( remember that Depth and left IR are aligned by design).
    ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

    즉 depth 에서 color image로 매핑하는 UV map이라는것을 구해서 depth랑 left-infrared camera랑 align됐으니까 똑같이 UVmap을 통해 left-infrared camera를 재매핑시키라는 거 같은데요.. 그 UV map이라는게 자세히 머가 먼지 모르겠네요... 다크프로그래머님이 설명하신 내용중에 힌트가 있을꺼같은데.. 무지함에 화만나네요.. 조언해주시면 감사하겠습니다..

    • BlogIcon 다크pgmr 2018.10.02 14:44 신고 수정/삭제

      안녕하세요. uv map에 대해서는 위키에 조금 설명이 나와 있는 것 같습니다 (https://en.wikipedia.org/wiki/UV_mapping). 제가 RealSensor를 써 보지 않아서 잘은 모르겠습니다만, Depth -> Color와 Depth -> IR의 매핑관계를 알고 있다면 Color <-> IR 도 Depth를 중간 매개로 해서 상호 매핑이 가능한 것이 아닌가 생각됩니다. 올려주신 RealSensor측 답변의 내용도 그러한 취지로 생각됩니다.

  • KH 2018.10.05 18:12 신고 ADDR 수정/삭제 답글

    안녕하세요. 잘보고있씁니다!! 저번에 여쭈었던것 잘 활용하였습니다.

    그런데 질문이 하나 더 생겼씁니다.
    1. Tracker공간의 좌표와 projector의 좌표가 달라서.. 이것을 매핑시키고 싶습니다.
    Tracker의 좌표는 tracker만의 공간상에서 실시간으로 (-0.5, 0.5,3.0) 이런식으로 변화합니다.(트래커 공간상의 위치는 알고 있으며 프로젝터는 1920*1280 해상도를 가지고 있습니다.) (제가 하고 싶은 것은 프로젝터가 쏘는 물체와 트래커와 정확히 일치시키고 싶은 것입니다 ㅠㅠ)

    ㅠㅠ

    • BlogIcon 다크pgmr 2018.10.08 11:30 신고 수정/삭제

      프로젝션 매핑을 하려면 projector와 tracker와의 캘리브레이션이 선행되어야 하는 것 아닌가요? 캘리브레이션 및 매핑 방법에 대해서는 따로 공부를 하셔야 할텐데요.. 저한테 캘리브레이션 방법을 물어보신 것은 아닐테고.. 질문의 요지를 잘 몰라서요.. 저도 프로젝션 매핑을 해 본 것은 아니라서, 혹시 공부해 보시고 필요한 부분은 좀더 구체적으로 말씀해 주시면 제가 아는 부분은 답변을 드리겠습니다.

  • KH 2018.10.10 13:17 신고 ADDR 수정/삭제 답글

    프로젝션 매핑에 선행되어야하는 projector와 tracker와의 캘리브레이션 방법은 어떻게 검색을 해야 공부를 할 수 있을까요??ㅠㅠ 초심자라 많이 힘드네요 ㅠㅠ

    • BlogIcon 다크pgmr 2018.10.10 16:33 신고 수정/삭제

      "camera projector calibration"이라고 검색하시면 됩니다.

    • KH 2018.10.10 17:58 신고 수정/삭제

      체커보드를 트래커라고 생각하면되나요??

    • BlogIcon 다크pgmr 2018.10.10 21:19 신고 수정/삭제

      저는 카메라로 생각하고 용어를 썼습니다.. KH님이 사용하신 Tracker라는 용어가 문맥상 카메라라고 판단되어 그렇게 사용했는데요, 아닌가 봅니다? 다시 한번 말씀드리지만 저는 프로젝션 맵핑을 해 본 사람이 아닙니다. 구체적인 것은 KH님이 공부를 하셔야 합니다.