编译PTAM与PTAMM-记

编译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;
}

}

猜你喜欢

转载自blog.csdn.net/lxiaoxiaot/article/details/6209635