编译PTAM与PTAMM-记

    技术2022-05-20  50

    编译PTAM,弄了一天,终于搞定了。记录一下。

     平台说明:Windows XP, VS2008

    首先编译libCVD库:

    1、依赖toon库,toon作为一个头文件包包含进工程include目录即可;2、toon/internal/config.hh 只保留#define TOON_USE_LAPACK 1这一项即可;(使用lapack和Blas的/MT选项的库,^_^)3、删除libcvd工程下的附加包含目录中的"$(includedir)"和附加库目录中的"$(libdir)";4、编译cvdimage.cxx文件时,其包含了#include<array>语句,其中array类型定义在Visual Studio 2008SP1中,但是也可以用boost来替代,如下所示://#include <array>#include <boost/array.hpp>using namespace boost;5、添加对png图片的支持,在cvd目录下的config.h文件中添加:#ifndef CVD_DISABLE_PNG #define CVD_HAVE_PNG 1#endif6、添加png.cc文件到工程目录Source Files->pnm_src中;7、编译时,选择/MT(/MTD)选项,使用多线程静态库进行编译;8、编译通过,生成了libcvd.lib和libcvdd.lib文件;

    然后在编译gvars3:

    1、在gvars3工程下移除fltk支持:

    GUI_Fltk2.h

    GUI_Fltk2.cc

    2、在gvars3目录下创建config.h文件:

    #ifndef GVARS3_INCLUDE_CONFIG_H

    #define GVARS3_INCLUDE_CONFIG_H

    #define GVARS3_HAVE_TOON 1

    #endif

    3、在工程的附加包含目录中仅保留../..即可;

    4、编译时会产生error C2064: 项不计算0个参数的函数;

    做以下替换即可:

    //template<class T> static T& get(const std::string& name, const T& default_val=DefaultValue<T>::val(), int flags=0);

    template<class T> static T& get(const std::string& name, const T& default_val=T(), int flags=0);

     

    最后编译PTAM库:

    1、将PTAM/Build/Win32目录下的所有文件拷贝到PTAM目录下,打开解决方案文件;

    2、将libCVD和GVars的include目录和lib目录包含到PTAM解决方案中;

    3、编译时需要将SymEigen.h文件中的

    ev = makeVector(A_plus_B, -A_plus_B/2 + A_minus_B * sqrt(3)/2, -A_plus_B/2 -

    A_minus_B * sqrt(3)/2) - Ones * a/3;

    改写为:

    ev = makeVector(A_plus_B, -A_plus_B/2 + A_minus_B * sqrt(3.0)/2.0, -A_plus_B/2 -

    A_minus_B sqrt(3.0)/2.0) - Ones a/3;

    以解决sqrt函数参数不明确的问题;

    4、若编译器提示无法找到blas_win32.lib 或lapack_win32.lib,

    则将依赖库名称修改为blas_win32_MT.lib和lapack_win32_MT.lib;

    5、编译时选择/MT开关。(注意,这个很重要,之前编译libcvd的时候,没太在意连接选项,结果默认使用的是/MD,而PTAM使用的是/MT,弄了好久才发现这个错误。)

     

     

    话说,PTAMM暂时还没有编译通,郁闷中。。。

    平台说明:Windows Xp, VS 2008.

    2011-8-11

    之前编译了PTAM,本本较弱,集显,在别人的机器上看了下效果,就没再去管它了。

    今天找了台配置较好的机器,重新编译了下PTAM,还是很顺利的。

    看到作者博客上面对PTAM的用户回复,用户数量越来越多了,同时PTAM的加强版PTAMM,也正被许多用户使用。

    于是决定将PTAMM也顺道编译了,看下效果。^_^

    首先将VideoSource_Win32_CMU1394.cc文件从工程中移除,将VideoSource_Win32_LibVideoInput.cc文件添加如工程,同时添加opencv, videoInput等依赖库文件。

    在VideoSource_Win32_LibVideoInput.cc文件中添加命名空间PTAMM,如下所示:

    namespace PTAMM { struct VideoInputInfo { videoInput *pVideoInput; int nDevice; };

    、。。。。。

    }

    CameraCalibrator项目就可以顺利编译通过了。

    编译PTAMM工程时,在编译Toon

    依赖包时,SymEigen.h出现了swap函数未定义的错误,在该文件的头部加上对命名空间std的声明就可以了。如下所示:

    。。。。。。。。

    #include <TooN/TooN.h> // using namespace std; //

    。。。。。。。。

    然后再编译PTAMM工程,就顺利的成功了。试玩儿了下,AR的游戏界面是要漂亮一些,据说AR的框架有所改进,打算有时间了再去看下了。^_^

     

     附:PTAM中VideoSource_Win32_LibVideoInput.cc文件,选用videoInput库实现Windows平台下获取摄像头的数据:

    videoSource.cc文件位于D:\PTAM\Build\Win32目录下。

    #include "../../VideoSource.h" #include "videoInput.h" // External lib #include <gvars3/instances.h> #include <cvd/utility.h> #define WIN32_MEAN_AND_LEAN #include <windows.h> using namespace std; using namespace CVD; using namespace GVars3; struct VideoInputInfo { videoInput *pVideoInput; int nDevice; }; VideoSource::VideoSource() { VideoInputInfo *pInfo = new VideoInputInfo; mptr = (void*) pInfo; pInfo->pVideoInput =  new videoInput; pInfo->nDevice = GV3::get<int>("VideoInput.DeviceNumber", 0, HIDDEN); int nIdealFrameRate = GV3::get<int>("VideoInput.IdealFrameRate", 30, HIDDEN); ImageRef irIdealSize = GV3::get<ImageRef>("VideoInput.IdealSize", ImageRef(640,480), HIDDEN); pInfo->pVideoInput->setIdealFramerate(pInfo->nDevice, nIdealFrameRate); pInfo->pVideoInput->setupDevice(pInfo->nDevice, irIdealSize.x, irIdealSize.y); mirSize.x = pInfo->pVideoInput->getWidth(pInfo->nDevice); mirSize.y = pInfo->pVideoInput->getHeight(pInfo->nDevice); }; void VideoSource::GetAndFillFrameBWandRGB(Image<CVD::byte> &imBW, Image<CVD::Rgb<CVD::byte> > &imRGB) { imRGB.resize(mirSize); imBW.resize(mirSize); VideoInputInfo *pInfo = (VideoInputInfo*) mptr; while(!pInfo->pVideoInput->isFrameNew(pInfo->nDevice)) Sleep(1); pInfo->pVideoInput->getPixels(pInfo->nDevice, (CVD::byte*) imRGB.data(), true, true); copy(imRGB, imBW); } ImageRef VideoSource::Size() { return mirSize; }

    PTAMM中VideoSource_Win32_LibVideoInput.cc文件内容如下:

    #include "VideoSource.h" #include "videoInput.h" // External lib #include <gvars3/instances.h> #include <cvd/utility.h> #define WIN32_MEAN_AND_LEAN #include <windows.h> using namespace std; using namespace CVD; using namespace GVars3; namespace PTAMM { struct VideoInputInfo { videoInput *pVideoInput; int nDevice; }; VideoSource::VideoSource() { VideoInputInfo *pInfo = new VideoInputInfo; mptr = (void*) pInfo; pInfo->pVideoInput =  new videoInput; pInfo->nDevice = GV3::get<int>("VideoInput.DeviceNumber", 0, HIDDEN); int nIdealFrameRate = GV3::get<int>("VideoInput.IdealFrameRate", 30, HIDDEN); ImageRef irIdealSize = GV3::get<ImageRef>("VideoInput.IdealSize", ImageRef(640,480), HIDDEN); pInfo->pVideoInput->setIdealFramerate(pInfo->nDevice, nIdealFrameRate); pInfo->pVideoInput->setupDevice(pInfo->nDevice, irIdealSize.x, irIdealSize.y); mirSize.x = pInfo->pVideoInput->getWidth(pInfo->nDevice); mirSize.y = pInfo->pVideoInput->getHeight(pInfo->nDevice); }; void VideoSource::GetAndFillFrameBWandRGB(Image<CVD::byte> &imBW, Image<CVD::Rgb<CVD::byte> > &imRGB) { imRGB.resize(mirSize); imBW.resize(mirSize); VideoInputInfo *pInfo = (VideoInputInfo*) mptr; while(!pInfo->pVideoInput->isFrameNew(pInfo->nDevice)) Sleep(1); pInfo->pVideoInput->getPixels(pInfo->nDevice, (CVD::byte*) imRGB.data(), true, true); copy(imRGB, imBW); } ImageRef VideoSource::Size() { return mirSize; } }


    最新回复(0)