编译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
然后在编译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
template
最后编译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
//////////////////////////////////////////////////////////////////////////
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
#include
#define WIN32_MEAN_AND_LEAN
#include
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 nIdealFrameRate = GV3::get
ImageRef irIdealSize = GV3::get
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
{
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
#include
#define WIN32_MEAN_AND_LEAN
#include
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 nIdealFrameRate = GV3::get
ImageRef irIdealSize = GV3::get
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
{
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;
}
}