티스토리 뷰

OpenCV

[Kinect with Point Cloud] PCL 환경 설정

생각많은 소심남 2012. 7. 10. 18:06



Point Cloud라는 걸 들어보셨나요? 흔히 키넥트로는 사물을 2차원적인 Depth나 RGB로만 받을 수 있습니다. 물론 외부적으로 라이브러리를 써서 이를 3D로 매핑해주는 것도 있습니다. 그런 라이브러리 중 하나가 바로 이번 포스트에서 소개해드릴 Point Cloud라는 겁니다. 쉽게 설명하면 하나의 점군이라고 보시면 됩니다. 점군이니까 각각의 점마다 3차원적 좌표가 나타나고 거기에 실제의 RGB값들이 대입되게 되는 것이지요. 



 기존에 OpenCV나 OpenNI 설치를 충분히 따라오셨다면 이번 설치도 별반 차이가 없습니다. 그냥 Linker 연결이나 include 폴더, lib 목록 작성이 다 입니다. 

참고로 이 PCL은 OpenNI 기반으로 동작합니다. 앞에서 소개했던 브릿지 드라이버를 사용해도 되기는 하지만 MS 드라이버를 설치하게 되면 4m이상의 거리에서의 raw data 값이 나오지 않기 때문에 추천하지 않는 바입니다. 

그럼 PCL 사이트에서 자신의 환경에 맞는 설치 파일을 실행한 것을 가정하고 VS2010 상에서 연결하는 방법을 언급하고자 합니다. 

 우선 c++ 프로젝트를 하나 생성하고 프로젝트를 선택하고 속성으로 들어갑니다. 처음으로 해줘야 하는 것은 include 폴더 지정입니다. VC++ 항목으로 가서 include Directory와 library directory를 다음과 같이 지정해줍니다.



이 과정을 거치면 컴파일러 내부적으로 해당 폴더에 있는 헤더 파일을 읽어옵니다. 마지막으로 해줘야 할 작업은 바로 Additional Dependacy를 지정해주는 겁니다. 역시 다음과 같이 작성해줍니다. 



이제 이로써 PCL에서 사용할 수 있는 모든 변수를 코드안에 삽입할 수 있게 됩니다. 물론 Debug 모드로 실행하실 분이라면 다시 폴더를 확인하셔서 적절하게 수정하시기 바랍니다. 

 자 여기까지가 환경설정이었습니다. 만약 정상적으로 작성이 되었다면 아래의 코드를 삽입해서



해당 프로젝트 폴더에 test라는 이름의 pcd(Point Cloud data) 파일이 생성되는 지를 확인해보시면 됩니다. 만약 sample 코드를 그대로 사용하고 싶다 하시면 임의의 폴더를 하나 만든 후에 cmake를 통해서 해당 프로젝트를 생성하면 만들어집니다. 


참고로 위에서 만든 pcd 파일은 reader로 읽어보면 다음과 같은 결과가 나옵니다.



맞게 나오지요. 원래 xyz를 0으로 만드는 구문과 3으로 만드는 구문으로 나눠져 있으니까요. 


여기까지가 PCL 설정이었고 이제 Kinect로 활용하기 위해서는 라이브러리를 연동시켜야 합니다. 여기서 한가지 예제를 더 돌려보려는데 예제에는 Visualization Toolkit(vtk) 와 Boost가 필요합니다. 한꺼번에 include 폴더와 library 폴더를 연동시켜야 합니다. 





마지막으로 Additional dependancies에서 OpenNI 관련 lib 파일을 추가시켜주면 됩니다.



끝입니다. 여기다가 OpenCV도 쓰려면 관련 라이브러리를 추가시켜주면 되겠지요. 물론 복잡하기는 하겠지만..

예제 샘플은 아래와 같습니다.


#include <pcl/io/openni_grabber.h>

#include <pcl/visualization/cloud_viewer.h>

#ifdef WIN32
# define sleep(x) Sleep((x)*1000)
#endif 

class SimpleOpenNIViewer
{
  public:
   SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}

    void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
    {
          if (!viewer.wasStopped())
        viewer.showCloud (cloud);
    }

    void run ()
    {
      pcl::Grabber* interface = new pcl::OpenNIGrabber();

      boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f = 
                boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);

      interface->registerCallback (f);

      interface->start ();

      while (!viewer.wasStopped())
      {
        sleep (1);
      }

          interface->stop ();
    }

    pcl::visualization::CloudViewer viewer;
};

int main ()
{
    SimpleOpenNIViewer v;
    v.run ();
    return 0;

}


출처: OpenKinect (http://cafe.naver.com/openkinect?20120710010352)


결과는 Point Cloud가 적용된 DepthImage가 출력됩니다.




앞으로도 다른 샘플이 있으면 시도해보고자 합니다.

댓글