Kinect의 3D 포인트를 사용한 키스톤 보정


15

XNA를 사용하면 바닥에 투영되는 간단한 사각형이 표시됩니다. 프로젝터는 임의의 위치에 배치 할 수 있습니다. 분명히, 투사 된 직사각형은 프로젝터의 위치와 각도에 따라 왜곡됩니다. Kinect는 바닥을 스캔하여 네 모서리를 찾습니다. 이제 내 목표는 기본 사각형을 미리 워핑하여 투영이 더 이상 왜곡되지 않도록 원래 사각형을 변환하는 것입니다.

첫 번째 접근 방식은 모든 것을 2D로 수행하는 것이 었습니다. 먼저 warpPerspective()스캔 된 점에서 내부 사각형 점으로 원근 변환 (OpenCV 사용 )을 계산하고 사각형에 역을 적용하십시오. 이것은 작동하는 것처럼 보이지만 GPU에서 렌더링 할 수 없어 너무 느 렸습니다.

두 번째 방법은 XNA의 렌더링 기능을 사용하기 위해 3D로 모든 작업을 수행하는 것이 었습니다. 먼저 평면을 표시하고 Kinect로 모서리를 스캔 한 후 수신 된 3D 포인트를 원래 평면에 매핑합니다. 이론적으로, 2D 접근 방식에서와 같이 시점 변환의 역을 평면에 적용 할 수 있습니다. 그러나 XNA는 뷰 및 프로젝션 매트릭스와 함께 작동 warpPerspective()하므로 원하는 함수를 호출 하고 원하는 결과를 얻을 수 없습니다 . 카메라의 뷰 및 프로젝션 매트릭스에 대한 새로운 매개 변수를 계산해야합니다.

질문 :이 매개 변수를 계산하여 두 행렬 (보기 및 투영)로 분할 할 수 있습니까? 그렇지 않은 경우 사용할 수있는 다른 방법이 있습니까?


1
XNA는 View와 Projection 행렬을 사용하지만 최종 결과 = vector * view * projection이라고 생각합니다. 항등 행렬을보고 역 원근감 행렬을 투영하여 이것이 효과가 있는지 확인해보십시오. (이것이 정확히 일어난다는 것을 100 % 확신하지는 마십시오)
Roy T.

1
?를 사용 하여 원근법 변환을 정확히 어떻게 계산warpPespective습니까? OpenCV에 익숙하지 않지만 문서를 읽으면이 기능이 이미지에 원근을 적용 하는 것처럼 보입니다 . 아니면 혼란 스럽습니까? 어쨌든 첫 번째 구현에 대한 자세한 내용을 추가하면 도움이 될 것입니다.
Laurent Couvidou

PCL 라이브러리 ( pointclouds.org )를 살펴볼 수 있습니다 . Kinect에서 깊이 이미지를 변환하면 카메라가 원점에 z 축을 따라 가리키는 점 구름이 생깁니다. 그런 다음 ransac 또는 다른 알고리즘을 사용하여 비행기를 검색 할 수 있습니다.
Exilyth

답변:


1

벡터 대수는 GPU에 친숙하기 때문에 정규화와 내적을 사용하여 다음과 같이 원래 평면의 네 모서리를 찾을 수 있습니다.

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

프로젝터 점 (P), 투사 지점 (B), 왜곡 된 사각형 (Q)을 포함하는 평면의 임의의 한 점, 해당 평면에 대한 법선 벡터 (n), 교차점 (A) P에서 B로 선을 그리면

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

소스 http://geomalgorithms.com/a05-_intersect-1.html 섹션 라인-평면 교차로

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