티스토리 뷰

About OpenCV

[Kinect with Point Cloud] PCL 환경 설정

생각많은 소심남 2012.07.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가 출력됩니다.




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

저작자 표시 비영리 변경 금지
신고
댓글
  • 프로필사진 BlogIcon 김종선 이거이거,,,
    왜 전 님의 블로그를 몰랐을까요? 키넥트를 안해서 그런가,
    좋은글 깔끔한 포스팅 정말정말 감사합니다. 많은 도움이 될것 같아요.
    2012.07.26 17:44 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 아마 종선님이 알고 계신게 더 많을겁니다. 저도 배워가는 중이고요. 앞으로 노력하겠습니다 :) 2012.07.26 23:20 신고
  • 프로필사진 kinect공부 안녕하세요 좋은글 감사합니다
    다름이 아니고 현재 vs 2010 에서는 pcl1.6버전이 배포되고 있습니다
    그런데 여기에 pcl_range_image관련 라이브러리가 없어서 포스팅대로 하여도 자꾸 에러가 나네요..
    그래서 이전버전의 라이브러리를 가져와봤지만 에러는 여전합니다..
    방법이 없을까요?
    2012.10.23 02:43 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 그럼 Linker에서 해당 라이브러리를 빼면 되지 않나요? 특별히 중요한 라이브러리 같지는 않습니다. 2012.10.23 09:41 신고
  • 프로필사진 안녕하세요 PCL 설치하려고 몇일을 했는데 자꾸 이상한 에러만 나서 이렇게 문의 드립니다.
    정말 여러번 재설치 했는데 계속 에러만 나고 있습니다.
    PCL 설치하실때 단순하게 All-in-one 다운받아서 그냥 설치하면 되는 건지 궁금합니다.
    제가 실행한 순서는 아래처럼했습니다.

    1. openni 랑 primesensor 드라이버 를 먼저 인스톨하고 나서 (kinect sdk는 사용안했습니다.일단은요)
    2. PCL all-in-one을 설치후(단순히 설치)
    3. 내컴퓨터 시스템 환경에서 path에 환경설정해주었고
    4. 그리고 lib랑 include를 이상없이 설치후
    5. 코드 복사해 넣고 build 했는데

    에러가 자꾸 나옵니다.
    정말 여러번 지우고 다시 깔고 다른 버전으로 해보고 했는데 안 됩니다.

    가능하시면 조금 자세히 알려주셨으면 합니다. PCL설치시에 무슨 문제가 있는 것이 아닌가 생각됩니다.
    제발 도와주세요.

    2012.11.26 23:16 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 안녕하세요? 기본적으로 pcl에서 지원하는 드라이버는 openNI이기 때문에 상관없을 듯 합니다.
    최근에 제가 확인해보건데 pcl이 버전 1.6.1로 업데이트 했습니다. 그걸 여기 소개한 방법대로 그대로 했을때는 오류가 발생하는 것 같습니다. 위에 댓글 남기신 분들도 그 오류를 보여주고 계시고요.
    위에 방식과 똑같이 하되 라이브러리 추가 부분만 하단 링크를 참조하시면 해결하실 수 있을 듯 합니다.
    http://blog.daum.net/openpcl/6
    2012.11.27 00:06 신고
  • 프로필사진 안녕하세요 빠른 답변 정말 감사드립니다.
    현재 오류는 컴퓨터에서 pcl_io_debug.dll이 없다 고 나오네요. 제가 pcl설치할때도 "add PCL to the system PATH for all users" 로 설치를 했고 시스템 환경설정에서도 링크 걸어주신 사이트에 링크걸린 pcl_1.4설치하기 파일처럼 PATH를 잘 연결한것 같은데 현재 계속 오류가 나네요.
    라이브러리 추가 부분때문은 아닐것 같은데 혹시 그 부분이면 저 라이브러리 추가 하는 부분을 어디에 넣어 놓아야 하는 건지 궁금합니다. 그냥 샘플 코드 끝에 넣어도 될런지 궁금하네요. 많은 저급 질문 드려서 죄송합니다. 답변 부탁드립니다.
    2012.11.27 01:35 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 dll 파일이 없다고 한건 환경변수 설정이 제대로 안되있으셔서 그런거 같습니다. 복잡하다 싶으시면 그 pcl 폴더안에 있는 dll 파일들을 Windows 폴더안에 있는 system32 폴더에 다 넣어주시면 됩니다.
    라이브러리 추가는 프로젝트 속성 - Linker - input에 들어가면 additional dependancies라고 라이브러리를 적는 란이 있습니다. 거기에 넣으시면 됩니다. 제가 위 글에서도 소개했고요.
    2012.11.27 10:26 신고
  • 프로필사진 안녕하세요 매번 질문에 성의있는 답변 감사드립니다.
    다시 한번 PCL 을 인스톨했는데 제가 아주 바보같은 실수를 저질렀네요
    인스톨할때 path에 관해서 설정하는 것이 있는데 all user 나 current user를 설정해야하는데
    NO path for user로 되어있는것을 안 바꾸고 설치해서 환경변수에서 아무리 설정해줘도 연결이 안되었던 것이었네요.
    어떻게 해결했는지 알려드리는 것이 최소한의 예의일것이라 생각해서 창피하지만 ^^;; 이렇게 글 올립니다.
    항상 좋은 답변 감사드립니다. ^^
    화이팅하세요.
    2012.11.27 13:45 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 해결하셨다니 다행이네요. 이렇게 알려주셔서 감사합니다. 2012.11.27 14:15 신고
  • 프로필사진 위에글 보면은,, 위에 pcd 파일을 leader로 읽는 내용이 나오는데요
    pcd 파일을 읽는 leader는 어떻게 설치하나요..?ㅠㅠ

    보고가시는 분들중에서도 아시면 댓글남겨주시면 매일매일 들어와 확인해보겠습니다.
    감사합니다.
    2014.08.07 15:06 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 구글링 조금만 해보시면 금방 찾으셨을 것 같습니다.
    http://pointclouds.org/documentation/tutorials/reading_pcd.php
    2014.08.07 15:17 신고
  • 프로필사진 tigger 한가지 여쭙고 싶은데요^^.
    http://www.pointclouds.org/downloads/windows.html 에서 받을 수 있는
    Windows MSVC 2010 (32bit) all-in-one 버젼은 비주얼스튜디오2010 에 맞는 환경이라는 건가요??

    이걸 vs2013에 설치해도 문제는 없나요?>?
    2015.08.19 20:44 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 http://unanancyowen.com/?p=1255&lang=en

    위 글을 참고해보시기 바랍니다.
    2015.08.20 00:13 신고
  • 프로필사진 simon 안녕하세요.
    include와 library 폴더를 추가할때요. $(OPEN_NI_INCLUDE) 와 같이 추가하자나요. 근데 $() 이게 무엇을 의미하는 건가요?
    검색해서 찾아보려고 해도 키워드를 어떻게 입력해야되는지를 모르겠더라구요. 파일의 경로를 의미하는 것 같은데...
    2015.08.23 16:10 신고
  • 프로필사진 Favicon of http://talkingaboutme.tistory.com BlogIcon 생각많은 소심남 안녕하세요.

    말씀하신 부분은 시스템 환경변수를 말합니다. 예를 들어서 C프로그래밍을 할때 코드나 헤더파일 앞에 #define ... 이런식으로 전역변수를 선언하신거랑 비슷하다고 보시면 될거 같습니다. 이렇게 변수를 선언해놓으면 다른 프로그램이 그 변수를 사용해서 작업을 할때 거기에 정의되어 있는 값을 활용할 수 있게 됩니다.

    제가 여기서 쓴 이유는 OpenNI를 설치할 때 저 이름으로 시스템 환경변수가 설정되었기 때문에 그대로 사용한 겁니다.
    2015.08.23 17:45 신고
댓글쓰기 폼
«   2017/12   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함
Total
957,762
Today
71
Yesterday
462