2012-01-18 5 views
5

OpenCV에서 내 예제와 같이 3D 표면에 투영 된 이미지에 보정을 적용하거나 Projection on 3D surface으로 표시된 가장 좋은 방법은 무엇입니까?OpenCV를 사용하여 표면에 투영을위한 이미지 보정

OpenCV 바둑판 코너 감지 기능을 사용한 첫 번째 테스트는별로 유망하지 않았습니다. 카메라 각도가 너무 가파르면 이미지가 너무 왜곡되거나 너무 작아서 (너무 멀리 떨어져 있음) 구석이 감지되지 않았습니다. 또한 바둑판에 너무 많은 필드가있는 경우.

내 아이디어는 3D 스캐너에서 표면 (객체)을 감지하는 데 사용되는 알고리즘을 사용하는 것이지만 OpenCV에서 가능한지 전혀 알 수 없습니다. OpenCV를 사용하여 가능하지 않더라도 그러한 객체 검색에 사용되는 알고리즘은 무엇입니까?

이 이미지는 수정없이 어떻게 보이는지 보여줍니다. Uncorrected projection on surface

녹색 직사각형은 수정 된 투영입니다. Corrected projection (green)

+0

어떤 종류의 세부 정보를 찾고 계십니까? –

+0

먼저 답변 해 주셔서 감사합니다. 왜 왜곡 (알고리즘)을 탐지하는지에 대한 몇 가지 기본 사항을 설명 할 수 있습니까? 그런 다음 보정 데이터가 어떤 식 으로든 발견되면 어떤 OpenCV 방법이 보정에 가장 적합합니까? 불행히도 OpenCV 문서는 매우 열악합니다. – bkausbk

+0

좋아, 먼저 뭔가를 정리해야 겠어. "보정 됨"으로 표시되는 녹색 직사각형, 정확하게 수정 된 방법은 무엇입니까? 그들은 스크린 샷에서 볼 수있는 것과 잘 어울리는 것 같지 않습니다. BTW,이 사이트 http://www.vision.caltech.edu/bouguetj/calib_doc/에 대한 자세한 내용이 있습니다. 이 책 "컴퓨터 비전의 다중보기 기하학"http://www.robots.ox.ac.uk/~vgg/hzbook/, 좋은 참고 자료입니다. 어쨌든 그 초록색 사각형을 "보정 된"것으로 인정하는 방법을 알려주세요. 감사합니다. –

답변

2

ProCamCalib에 사용 된 마커는 바둑판 패턴보다 견고하게 감지되어야합니다. ProCamCalib와 마찬가지로 ARToolkitPlus을 사용할 수 있지만 다른 대안이 있거나 직접 탐지기를 만들 수 있습니다. :) 그런 다음 마커의 감지 된 코너 좌표와 함께 OpenCV의 나머지 보정 기능을 사용하여 같은 방식으로 보정 할 수 있습니다.

ProCamTracker 페이지에 나와있는 것처럼 멋진 것들을 할 수 있습니다.

편집 : OpenCV는 우리에게별로 도움이되지 않지만 정적 인 장면에 대해서는이 질문을 더 잘 이해할 수있게되었습니다. 먼저 뷰어가 수정 된 투영을 보길 원하는 위치에 카메라를 배치합니다. 그런 다음 이진 패턴 (로컬 점멸 점처럼 보임)을 투영하고 그 점 패턴의 이미지를 캡처합니다. (구조 조명으로 알려진 기술로 막대가 될 때까지 밀도를 높일 수 있습니다.) 카메라 이미지를 감지하고 해당 점을 바이너리 코드로 디코딩 한 후에는 카메라 < -> 프로젝터 픽셀 일치, 일부 정점 어쨌든 100 % 그래픽입니다. 여기에 좀 더 세부 사항에 다음과 같이 커버 종이있다 :

Zollmann, S., Langlotz, T. 및 Bimber을, O.
임의의 표면에보기 - 종속 계획에 대한 가 수동 액티브 기하학적 보정
http://140.78.90.140/medien/ar/Pub/PAGC_final.pdf
데모 비디오 : http://140.78.90.140/medien/ar/Pub/PAGC.avi

EDIT2 : 어떤 종류의 패턴을 투사하면 카메라 이미지의 주어진 픽셀에 해당하는 프로젝터 이미지의 픽셀 좌표를 파악할 수 있습니다. 우리는 종종 탐지 및 해독하기 쉽기 때문에 시간적인 도트 패턴을 사용합니다 ... 그리고 사실 OpenCV가이 점을 위해 유용 할 수 있습니다. 내가 그것을하려고 노력할 것이라고 생각하는 방식은 이런 식으로 갈 것입니다. 단순화를 위해 단지 2 비트 만 사용합시다. 따라서 우리는 00, 01, 10, 11의 4 개의 이미지를 가지고 있습니다. 프로젝터 이미지를 제어하기 때문에 이미지를 알 수 있지만 카메라 이미지에서도 이미지를 찾아야합니다. 먼저, 마지막 (카메라) 이미지 인 11을 가져 와서 cvAbsDiff()를 사용하여 첫 번째 (카메라) 이미지 00에서 빼낸 다음 결과를 cvThreshold()로 이진화하고 이진 파일에서 윤곽선을 찾습니다. cvFindContours()로 이미지. cvContentArea()를 사용하여 각 윤곽선에 적절한 영역이 있는지 확인해야하며 cvMoments()로 중심점을 찾을 수 있어야합니다. 그런 다음 다른 이미지로 작업을 시작할 수 있습니다. 각각의 윤곽에 대해 cvBoundRect()를 cvSetImageROI()를 통해 설정할 수있는 이러한 경계 사각형 내부의 다른 (또한 cvThreshold() 카메라로 이진화 된) 이미지의 cvCountNonZero() 픽셀로 가져 가려고합니다.0이 아닌 개수가 크면 1로 등록해야합니다. 0이 아닌 경우 0으로 등록해야합니다.

모든 비트가 있으면 코드가 생기고 완료됩니다.

+0

고마워요, 제가 정확히 찾고 있었던 것이 었습니다. 나는 도트 패턴을 사용하는 이유와 그것으로부터 변위 맵을 만드는 방법을 이해하지 못한다. 그러나 이것은 문서를 연구 한 후에 분명해야한다. – bkausbk

+0

소리가 당신이 필요로하는 것을 좋아합니다. 완전을위한 세부 사항을 추가하겠습니다 ... –