사각형을 사각형으로 투영 해제하는 방법?


10

tl; dr : 투영 형상의 수학 문제 : 아래 그림과 같이 투영을 제공하는 4x4 카메라 매트릭스를 어떻게 찾아서 점 A, B, C, D가 장치 상자의 가장자리에있을 수 있습니다 (예 : OpenGL 표준화 장치) 좌표), 단위 상자의 모서리가 광선 EA, EB, EC, ED를 따라 합리적입니까?

(이는 호모 그래피, 관점 및 / 또는 콜린 레이션의 특별한 경우 일 수 있습니다. 용어에 익숙하지 않습니다.)


동화

뷰포트 내에 사변형 ABCD가 주어지면 사각형으로 다시 매핑하는 고유 (?) 변환이 있다고 생각합니다. 아래 이미지에서 볼 수 있듯이 : 뷰포트의 사변형 ABCD는 물리적 인 '창'역할을하며 사각형으로 다시 매핑하면 왜곡되어 나타납니다.

여기에 이미지 설명을 입력하십시오

(오른쪽의 상자는 NDC를 나타내며, 나중에 이야기하겠습니다)

목표는 오른쪽의 이미지를 빠르게 얻는 것입니다. 우리는 이미지를 얻기 위해 모든 점을 광선 추적 할 수 있지만 (블렌딩, 프리미티브 등과 같은 것을 이용하기를 원했기 때문에 OpenGL 또는 다른 투영 기술을 선호합니다.

첫번째 시도

I는 I는 3 × 찾는 문제 해결 판단 카메라 행렬 3 + 1 차원하게 균질 좌표 (왼쪽) -3- 공간 상하 2 공간에서 2 + 1 차원 동차 좌표에 프로젝트를로 (온 권리). 직접 선형 변환 을 사용하여 카메라 매트릭스 Ba=0의 알 수없는 항목 a에 대한 방정식 시스템을 얻고 단일 값 분해를 사용하여 시스템을 풀면이를 해결할 수 있습니다(SVD). EA, EB, EC, ED (여기서 E는 육안 또는 월드 공간의 카메라) 벡터를 사전 이미지의 포인트로, (0,0), (1,0), (1 , 1), (0,1) 또는 포스트 이미지의 점과 같은 점이 있으며 각 점 쌍은 SVD에 연결하는 몇 가지 선형 방정식을 제공합니다. 결과 행렬은 EA-> (0,0) 등을 매핑합니다. 충분한 자유도가 있다고 가정합니다. 즉, 솔루션이 독특하고 확실하지 않은 경우 참고 [a]를 참조하십시오.

그러나 내 chagrin에게 이것은 OpenGL이 작동하는 방식이 아닙니다. OpenGL은 3x4 매트릭스를 사용하여 3d에서 2d로 직접 투사하지 않습니다. OpenGL에는 3 차원 포인트 인 "정규화 된 장치 좌표"(NDC)가 필요합니다. NDC에 투영 한 후 (-1, -1, -1,1)에서 (1,1,1,1)까지 '단위'상자의 모든 항목이 그려집니다. 외부의 모든 것이 잘립니다 (동일한 좌표를 다루기 때문에 : (x, y, z, w)는 (x / w, y / w, z / w의 처음 세 좌표 인 경우에만 화면에 나타납니다) , 1)은 단위 상자 안에 -1에서 1)까지 있습니다.

그래서 문제는 다음과 같습니다. 이상하게 보이는 입방체를 동종 좌표로 매핑하는 합리적인 변환이 있습니까? (특히 ABCD (정면 점)와 A'B'C'D '(뒤 점, 숨겨진 점) 4x4 매트릭스를 사용하는 경우) 어떻게합니까?

내가 시도한 것

나는 더 강한 것을 시도했다 : 나는 ABCD와 A'B'C'D '를 일반적인 피라미드 절두체처럼 보이게 만들었다 (예 : gl frustrum). 4 변형이 아닌 DLT / 직선 선형 변환을 사용하여 주장 된 4x4 매트릭스를 해결했습니다. 그러나 그것을 시도했을 때 충분한 자유도가없는 것처럼 보였습니다 ... 결과 4x4 행렬은 모든 입력 벡터를 모든 출력 벡터에 매핑하지 않았습니다. A, B, C, D, A '(5 쌍의 사전 변환 및 사후 변환 벡터)를 사용하는 동안, 나는 / 거의 / 원하는 결과를 얻습니다 ... 벡터가 올바르게 매핑되지만, 예를 들어 B', C ', D'는 (-1, -1,1,1) 대신 (3,3,1,1)에 매핑되며 OpenGL에 의해 잘립니다. 여섯 번째 점 (4x4 행렬에 6 쌍의 점을 투영)을 추가하려고하면, 내 솔루션은 타락한 것처럼 보입니다 (0, 무한). 여기서 다루는 자유도는 얼마나되며, 우리가 알고 사랑하는 일반적인 4 벡터 (3 + 1 차원 동종 좌표 벡터)를 매핑하는 4x4 매트릭스로 가능합니까?

무작위 사소한 생각

4x4 행렬을 사용하여 임의의 입방체를 임의의 입방체에 매핑 할 수는 없다고 생각합니다 .2d에서 볼록 사변형을 다른 볼록 사변형에 매핑 할 수 있다고 생각했기 때문에 혼란 스럽습니다. 예를 들어 Photoshop? ... 이것은 투영 변환으로 수행 할 수 없는가? 그리고 어떻게 3D로 일반화합니까? ...... 또한 4x4 행렬을 찾지 못하면 선형 대수학에 따르면 NxN 행렬이 N 개의 선형 독립 점 이상을 N 개의 목표 지점에 매핑하는 것이 가장 좋은 경우가 아니라고 생각합니다. 숨겨진 공동 선성이 진행 중이기 때문에 좌표가이 속임수를 씁니까? 아닌 것 같아요?

다른 해결책?

나는 전형적인 추돌 점 카메라 프로젝션 매트릭스를 사용하고 모서리에 해당하는 2D 포인트를 찾은 다음 2D 원근 왜곡 왜곡 호모 그래피를 수행하지만 픽셀이 렌더링 된 후에 발생할 수있는 추한 일을 할 수도 있습니다. (예 : 포토샵) 그렇다면 해상도에 문제가있을 것입니다 ... 어쩌면 NDC 공간 내에서 XY 평면 에서이 변환을 수행하는 행렬을 알아 낸 다음 정상적인 절두체 기반 행렬로 구성 할 수 있습니까?

(참고 [a] : 자유도 : ABCD는 필요한 경우 직사각형에 작용하는 투영 변환의 사후 이미지로 제한 될 수 있습니다. 필요한 경우 왼쪽의 검은 색 직사각형이라고 할 수 있습니다. 사진 프레임 클립 아트 모델을 투영 한 결과)


1
코너 핀을 Google로 사용하면 몇 가지 구현이 있습니다
joojaa

답변:


1

솔루션이 4 점을 올바르게 변환하는 투영 변환을 찾고 있다고 생각합니다.

y=P×x

x=[x0,x1,1]y=[y0y2,y1y2]

P

이제 대수를 사용 하여이 작업을 수행하거나 OpenCV를 사용할 수 있습니다 getPerspectiveTransform:).

또한 이 개념에 익숙해 지려면 Wikipedia에서 동종 좌표 를 확인하십시오 .


감사합니다! (나는 얼마 전에 이것을 해결하고 당신의 의견을 보았을 때 바로 해결책을 게시했습니다.)
ninjagecko

0

직접 선형 변환 을 구현하여 내 자신의 질문을 해결했습니다 . Wikipedia의 예제 섹션은 저의 유스 케이스였습니다.

방정식을 얻으려면 행렬 (예 [x1 x2 x3 x4; x5 x6 x7 x8; x9 x10 x11 x12]:)을 SageMath와 같은 즐겨 사용하는 컴퓨터 대수 시스템에 연결 한 다음 그림과 같이 필요한 행렬 방정식을 풀고 변수 측면에서 솔루션을 코드에 복사하여 붙여 넣기하고 형식을 조정하십시오.

그런 다음 특정 크기를 적절하게 조정하거나 무시하여 솔루션을 사용 사례에 맞출 수 있습니다 (예 : 사용 사례에 따라 표준화 된 장치 좌표 매트릭스에서 깊이 / z 좌표를 무시).

귀하의 언어로 된 SVD 분해 기능 또는 라이브러리가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.