CV2011. 12. 25. 15:51


3차원에 있는 물체를 데이터로 옮겨오는 방식에는 여러가지가 있을것이다.

그중 멀티 카메라를 이용하여 볼륨 (덩어리) 를 얻어내는 프로그램을 만들것이다.




웹캠 4대를 준비하였다.



4대나 되는것이 아니라...

4대 밖에 안된다... 돈도 아깝기도 하고 (웹캠 5000원 싸구려)

카메라가 많아 질수록 볼륨의 정확도는 더 향상되겠지만


4대 밖에 없으므로 정말 단순한 볼륨만 나올것이다.
 

 




4포트 허브

그리고...

 

스테이지가 필요하다. 그냥 대충 굴러댕기는 밥상을 가지고 한다.





길이를 재보니까 대충 대각선 길이기 60센티가 나온다 

즉 60센티 안의 가로 세로 30센티인

가상의 공간을 프로그램으로 만들것이다. 

 



캠을 설치하고

 

 연결까지 다 끝났다.



뭔가 어설프지만 하드웨어 세팅은 다 끝났다.


실은 웹캠의 경우 자동으로 화이트 밸랜싱을 한다.

하얀색을 하얀색 답게 맞추는 역할인데

이것 때문에 물체의 외곽선을 따는데 문제가 생길수 있다.

배경임에도 불구하고 화이트 밸랜싱으로 노출,색상값이 달라져 버리면

프로그램은 멍청하게도 이를 전경으로 학습할 것이다.

그래서 제일 좋은 방법은 크로마키 천을 두르는 것일 것이다

하지만 너무 비싸서 포기



이젠 프로그램을 작성한다.

* 각 카메라의 영점을 맞추도록 도와주는 기능

- 카메라가 USB에 인식된 순서에 따라 카메라 번호가 달라지므로
- 미리 알수가 없어서 수동으로 몇번 카메라인지 지정해주어야 한다.
- 하는 김에 카메라의 시선을 정확하게 가운데로 맞출수 있도록
- 크로스헤어도 나타나게 하면 좋을 것이다.


* 기존 배경을 학습하는 기능

- 배경을 학습하고 실제 물건이 스테이지에 들어왔을때 전경으로 인식하기 위해서이다.



* 실제 전경을 각 지정된 카메라 별로 분리하는 기능

-  이 전경들을 가지고 각 카메라가 전경을 각각 분리하여 자신의 전경이미지를 보유한다.




아래는 빠르고 간단하게 작성한 프로그램이다.



영점을 맞출수 있도록 크로스헤어와 , 카메라 별로 학습을 실시하여 세팅을 한다.



각각의 카메라 별로 전경이 어떻게 분리되었는가를 보여준다.

위 그림은 배경이 움직였기 때문에 퀄리티가 한참 떨어지는 것이다.




그다음에 만들것은 실제 이 이미지들을 가지고

3D 덩어리로 실체화 시킬 프로그램이 필요하다.



가상의 공간이 있고

뒷면의 임의의 한점에서 부터 앞면의 가운데 점으로 통과하는 직선이 있다고 할때

한가운데 있는 파란색의 공간을 투과하는 빨간색과 같은 3차원을 가로지르는 직선이 있을것이다.

이는 예전에 포스팅했던 

브레제남 3D 알고리즘을 사용하여 구한다.


이 직선을 일종의 광선이라고 생각하면

즉 뒷면에 전경을 위치시킨뒤에 

보이는 전경에 해당되는 픽셀에서 발사되는 광선을 생각하면

하나의 시야(카메라)에서 봤을때 형성이 가능한 모양이 만들어질 것이다.


이는 3D 그래픽스에서 말하는 절두체 공간이다.



위와 같은 전경 이미지를 형성한 뒤에 각 전경 픽셀에서 발사되는 3차원의

광선을 발사하여 가운데 가상의 3차원 공간에 그려보면 다음과 같이 나온다.





이것이 하나의 시야에서 바라봤을때

가능한 3차원의 모양이라면


이를 N개의 시야에서 바라봤을때  각 시야에서 보이는 외곽선에 따라서

안보이는 부분을 깍아 버릴 것이다.


즉 모든 시야에서 공통적으로 보이는 부분이 실제로 존재하는 물체이다.

그리고 광선을 통과시킴으로서 이 덩어리를 복셀로 구할수 있다.


 

다음은 실험이다.

 

오리인형 덩어리를 인식해보자


각 시야에서 바라봤을때의 전경의 실루엣이다.

이 실루엣을 가지고 3차원 덩어리를 생성해보면 다음과 같다.



복셀하나하나가 크기 때문에 퀄리티가 심하게 떨어진다.

이는 복셀 공간을 늘리면 될것 같지만 복셀공간을 늘리면 메모리나 속도가 어마어마하게 떨어지게 되므로 한계가 있다.

늘려보면


복셀 개수를 늘려보았다. 퀄리티가 좋아지지만 속도가 어마어마하게 느려진다.

아직도 보면 각진 부분이 있는데

이는  오리인형을 바라보는 시야가 4개 밖에 없기 때문이다.

카메라를 늘리면 늘릴수록 그만큼 덩어리의 퀄리티는 상승할 것이다.




하지만  이러한 실루엣을 기반으로 하는 3D 스캐너는 문제가 있는데

convex 한 물체만 스캔이 가능하다는 것이다.

즉 오목한 부분을 형성하지 못하는데 이는 실루엣이 가장 가장자리만 보는 것이기 때문에 당연하다.

이를 해결하기 위해서 매우 복잡한 수학적 테크닉을 사용하는 박사급 논문이 많다고 한다.





다른 것을 인식해보자



딱봐도 오목한 부분이 많으니까 퀄리티가 구릴것이 분명하다.

 

 각 시야에 따른 전경이미지를 구한다.




ㅋㅋㅋ 이게 도대체 무엇인가 ㅋㅋㅋ

실은 덩어리만 구하게 되면

시야의 한계로 저정도가 최선의 결과이다. 복잡한 수학적 테크닉을 활용하던지

최소한 원래 사진 이미지를 이용하여 텍스쳐라도 입히게 되면 좀더 퀄리티가 좋아질 것이다.






텍스쳐를 입히는것은 나중으로 미루고


우선 여기까지 분노의 플젝을 마친다.

Posted by 멍충한아싸

댓글을 달아 주세요

  1. 양반

    재밌어 보이는 프로젝트네요.

    2011.12.25 17:17 [ ADDR : EDIT/ DEL : REPLY ]
  2. Hyacinth_kr

    카메라를 일정 각도로 회전시켜보면 어떨까염

    2011.12.25 17:53 [ ADDR : EDIT/ DEL : REPLY ]
  3. 어린이

    저도 한번 만들어보고 싶은데 아무것도 모르는 사람입니다. ㅠ
    소스는 뭘로 입력하고 뭐라고 입력하셨나요?? ㅜㅜ

    2013.05.10 15:22 [ ADDR : EDIT/ DEL : REPLY ]