[转]编译PTAM与PTAMM-记 - lxiaoxiaot的专栏 - 博客频道 - CSDN.NET

[转]编译PTAM与PTAMM-记 - lxiaoxiaot的专栏 - 博客频道 - CSDN.NET

编译PTAM与PTAMM-记

分类: machine vision 1167人阅读 评论(48) 收藏 举报

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

}

查看评论
22楼 yangkun521316 6天前 15:12发表 [回复]
终于编译成功了,也运行了。可惜,主程序,启动后只是一个白画面。没有显示获取的摄像头数据。CameraCalibrator程序能够显示获取的数据。主程序,为什么不能使用。
21楼 yangkun521316 6天前 13:45发表 [回复]
我换用你提供的USB文件,编译出错。如下:
1>VideoSource_Win32_LibVideoInput.cc
1>.\VideoSource_Win32_LibVideoInput.cc(24) : error C2888: “VideoSource::VideoSource(void)”: 不能在命名空间“PTAMM”内定义符号
1>.\VideoSource_Win32_LibVideoInput.cc(42) : error C2888: “void VideoSource::GetAndFillFrameBWandRGB(CVD::Image<T> &,CVD::Image<CVD::Rgb<T>> &)”: 不能在命名空间“PTAMM”内定义符号
1> with
1> [
1> T=CVD::byte
1> ]
1>.\VideoSource_Win32_LibVideoInput.cc(56) : error C2888: “CVD::ImageRef VideoSource::Size(void)”: 不能在命名空间“PTAMM”内定义符号
20楼 yangkun521316 6天前 13:17发表 [回复]
请问,我编译完成后,运行,提示没有配置文件,我找了找PTAMM中没有此文件。camera.cfg 。如何解决。
19楼 sunjun8707 2012-01-10 10:33发表 [回复]
囧,原来那个评论不小心删了,我看了楼主的链接就是在那个上面下得,还有一个比较初级的问题问一下楼主啊,libcvd工程下的附加包含目录中的"$(includedir)"和附加库目录中的"$(libdir)"我没有找到。。。
Re: lxiaoxiaot 2012-01-10 18:18发表 [回复]
回复sunjun8707:如果编译没有问题的话、可以不用管它、
Re: cuby_sj 2012-01-11 10:58发表 [回复]
回复lxiaoxiaot:楼主方便的话可否给个邮箱,要是方便告诉的话就发我信箱可以不cuby_sj@163.com,感激不尽~~
Re: cuby_sj 2012-01-11 10:55发表 [回复]
回复lxiaoxiaot:我换了个号,还是原来那个sunjun8707,说评论最多只能三次,楼主有没博客什么可以交流的地方或者有没有类似的论坛可以推荐交流的啊,我刚入门,看了好多东西不懂,想找个人知道一下,那个编译还是有问题的有这些等等类似的问题
Error2 error C2471: cannot update program database 'd:\ptam lib\cvd\build\vc2005\debug\vc90.pdb' d:\ptam lib\cvd\cvd_src\brezenham.cc
Error3 fatal error C1083: Cannot open program database file: 'd:\ptam lib\cvd\build\vc2005\debug\vc90.pdb': No such file or directory d:\ptam lib\cvd\cvd_src\brezenham.cc
补充一下下,我libcvd工程include和lib库里面只有这些内容
include:
$(VCInstallDir)include $(VCInstallDir)atlmfc\include $(WindowsSdkDir)\include $(FrameworkSDKDir)include
D:\Program Files\Microsoft Visual Studio\VC98\Include
D:\PTAM lib\CVD D:\PTAM lib\gvars3 D:\PTAM lib\TooN
还有就是opencv的库
lib库里面有:
$(VCInstallDir)lib
$(VCInstallDir)atlmfc\lib
$(VCInstallDir)atlmfc\lib\i386
$(WindowsSdkDir)\lib
$(FrameworkSDKDir)lib
$(VSInstallDir)
$(VSInstallDir)lib
18楼 lxiaoxiaot 2012-01-10 10:23发表 [回复]
回复sunjun8707:下面的回帖里面给出了toon的链接、下载下来试一下呢、
17楼 liulinlinliulinlin 2011-12-30 16:02发表 [回复]
你好,我编译出现错误,
1>cl: 命令行 error D8022 :无法打开“f:\PTAM\PTAM\Release\RSP00001160605748.rsp”
1>项目 : error PRJ0002 : 错误的结果 2 (从“D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe”返回)。
1>未能删除临时文件。请确保该文件未打开并且未被保护。
重装了vc,不行,系统重装了还是有错误,疯掉了,能帮我看看这是咋回事吗?万分感谢!
16楼 yangkun521316 2011-12-28 13:53发表 [回复]
编译完成后怎么这么多问题。请指教。
1>正在链接...
1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) 已经在 ARDriver.obj 中定义
1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z) 已经在 ARDriver.obj 中定义
15楼 yangkun521316 2011-12-28 10:03发表 [回复]
我在编译libcvd按照你的方法,换了头文件,也安装了boost。然后编译出错。
1>utility_float.cc
1>bmp.cxx
1>cvdimage.cxx
1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(33) : error C2059: 语法错误 : “extern ”
1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(33) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>c:\program files\microsoft visual studio 9.0\vc\include\excpt.h(33) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
1>d:\artools\ptam\ptam_work\libcvd-20100511\pnm_src\cvdimage.cxx(250) : error C2061: 语法错误 : 标识符“array”
1>d:\artools\ptam\ptam_work\libcvd-20100511\pnm_src\cvdimage.cxx(252) : error C2065: “h”: 未声明的标识符
1>d:\artools\ptam\ptam_work\libcvd-20100511\pnm_src\cvdimage.cxx(252) : error C2228: “.begin”的左边必须有类/结构/联合
1> 类型是“'unknown-type'”
1>d:\artools\ptam\ptam_work\libcvd-20100511\pnm_src\cvdimage.cxx(252) : error C2065: “h”: 未声明的标识符
Re: yangkun521316 2011-12-28 11:30发表 [回复]
编译通过了。可怎么加USB摄像头啊!能告诉一下吗!
Re: lxiaoxiaot 2011-12-28 16:29发表 [回复]
回复yangkun521316:使用VideoSource_Win32_OpenCV.cc这个文件,替换掉VideoSource_Win32_CMU1394.cc这个文件,试下呢、
14楼 jy00039658 2011-12-20 10:36发表 [回复]
感谢楼主分享PTAM 在XP下得编译方法,参考楼主的提示,我在XP下面成功编译出CameraCablirator.exe,Ptam.exe.现在用CameraCablirator.exe 去标定,为什么画面那么卡(Usb Camera),一直没有训练出数据,请问是怎么回事?如何标定呢?楼主能提供个交流方式嘛,QQ,MSN之类。谢谢!
Re: lxiaoxiaot 2011-12-20 21:57发表 [回复]
回复jy00039658:用它自带的标定程序的确是非常卡,貌似文档里面有讲,是一秒钟处理一帧图像;
13楼 llqazs 2011-12-11 09:08发表 [回复]
楼主你好,PTAMM对相机有要求么。 他的手册上推荐了两款相机,一款是1394火线相机,一款是罗技的USB相机。我的电脑上没有1394接口,所以只能用USB相机。请问USB相机只能用他推荐的罗技的那款么?用别的相机的话是否要修改他的文件呢?
Re: lxiaoxiaot 2011-12-11 18:43发表 [回复]
回复llqazs:没有必要的哈、我用的淘宝上买的usb摄像头,70块钱左右吧、效果也可以。只要是opencv可以识别的,就行。
Re: llqazs 2011-12-14 10:55发表 [回复]
回复lxiaoxiaot:我看PTAMM上的用户手册上说要广角相机,这个不重要么?另外,PTAM不是用的libcvd么,为什么还需要opencv来识别呢?楼主试过这个软件的什么功能呢?效果怎么样
Re: llqazs 2011-12-14 10:55发表 [回复]
回复lxiaoxiaot:我看PTAMM上的用户手册上说要广角相机,这个不重要么?另外,PTAM不是用的libcvd么,为什么还需要opencv来识别呢?楼主试过这个软件的什么功能呢?效果怎么样
Re: lxiaoxiaot 2011-12-14 11:33发表 [回复]
回复llqazs:恩呢、实验室有广角相机,试验过,跟踪效果挺好的;没有广角相机的话,用普通的usb camera也可以哈,关键是得事先标定一下(可以用PTAMM自动的标定程序来做)。
libcvd没怎么用过,使用opencv来获取摄像头数据较为方便。
12楼 cnyunchao 2011-12-09 20:05发表 [回复]
太感谢楼主了,我的电脑没那个1394口 正发愁呢 。。VideoSource_Win32_CMU1394.cc是把这个文件里面的内容替换掉就行呢还是需要文件名也改成VideoSource_Win32_LibVideoInput.cc
Re: lxiaoxiaot 2011-12-10 15:06发表 [回复]
回复cnyunchao:恩呢、直接把文件内容换掉也可以,只要不引用1394的头文件就行了、
11楼 qiuzijian8 2011-11-12 21:24发表 [回复]
您知道怎样在XP+vs2008环境下编译PTAM么??
Re: lxiaoxiaot 2011-11-19 11:26发表 [回复]
回复qiuzijian8:恩、上面所说的就是在xp,vs2008下面的编译方法。
Re: qiuzijian8 2011-11-30 21:29发表 [回复]
回复lxiaoxiaot:我在windows下编译成功了,不过,运行的时候特别卡,貌似是多线程出现了问题,不知道你有没有这种情况~
Re: lxiaoxiaot 2011-12-10 15:10发表 [回复]
回复qiuzijian8:恩、运行的效果要看机器的配置了、有nvidia的独立显卡最好。在捕捉前两幅图像,初始化场景地图时会比较慢;接下来的跟踪过程还好。
10楼 ycl_1988 2011-11-04 16:32发表 [回复]
你能加我下QQ嘛????496243447 非常感谢、、、
9楼 ycl_1988 2011-11-04 14:55发表 [回复]
我在timer.h上有个错误 :error C2059: 语法错误 : “)” 我奇怪怎么会有语法错误呢??
Re: qiuzijian8 2011-11-12 21:25发表 [回复]
回复ycl_1988::有关time.h 的问题你解决了没?
Re: lxiaoxiaot 2011-11-04 16:28发表 [回复]
回复ycl_1988:这个没有遇到过呢、在仔细检查下呢、
8楼 halfwet 2011-09-25 10:45发表 [回复]
装了xp了,楼主用的什么VideoSource??
Re: halfwet 2011-09-26 21:36发表 [回复]
回复halfwet:楼主能把videoSource.cc贴出来吗?小的搞不定啊=。=|||
Re: lxiaoxiaot 2011-09-27 18:56发表 [回复]
回复halfwet:已经贴在上面了,印象中videoSource.cc文件不需要怎么改动就可以用了、你再试下吧、
Re: lxiaoxiaot 2011-09-25 21:00发表 [回复]
回复halfwet:恩、用的是videoInput。机器上安装了opencv2.1,用的是其自带的videoInput库。比vfw好用。
7楼 halfwet 2011-09-23 20:14发表 [回复]
不过谢谢楼主的帮助:)
Re: lxiaoxiaot 2011-09-25 09:08发表 [回复]
回复halfwet:
引用“halfwet”的评论:不过谢谢楼主的帮助:)

大家可以多交流、
6楼 halfwet 2011-09-23 20:14发表 [回复]
好囧,居然还挑系统!!
Re: lxiaoxiaot 2011-09-25 09:08发表 [回复]
回复halfwet:恩呢、具体是什么原因引起的,目前还不清楚。目前在xp系统上的测试都是好的。显卡要求的话,最好是Nvidia的独显,PTAM里面增强现实的实现方式使用了OpenGL提供的Frame Buffer Object技术。
5楼 halfwet 2011-09-23 13:48发表 [回复]
编译成功了,但是运行后只有一个空的控制台程序,在main函数里边第一行设断点都没有运行到,请问是咋回事呢?
Re: lxiaoxiaot 2011-09-23 18:45发表 [回复]
回复halfwet:恩,你的系统时win7的吧,之前我也碰到过这个问题,在三个相同的win7系统上,有两个不能运行,只有一台可以运行。不清楚是什么原因导致的。可以装个xp试一下哈、
4楼 hanfangfang 2011-05-14 16:33发表 [回复]
你好,请问toon、libcvd、gvars3在哪里可以下到,我在网页中没找到下载链接,谢谢
Re: lxiaoxiaot 2011-05-17 23:29发表 [回复]
回复 hanfangfang:恩,试一下下面的链接呢、
Toon:http://mi.eng.cam.ac.uk/~er258/cvd/toon.html
libcvd and gvars3:http://cvs.savannah.gnu.org/viewvc/?root=libcvd
3楼 liuhongnancy 2011-04-25 11:18发表 [回复]
楼主,你PTAMM编译通没?
Re: lxiaoxiaot 2011-04-25 20:36发表 [回复]
回复 liuhongnancy:恩、还木有呢、PTAMM新增的功能对我来说用处不大、就没再去看它了 。
2楼 RoyalVane 2011-04-16 19:51发表 [回复]
我也是只有一个黑框框啊。。楼主遇到过这问题么?跪求答案。。要崩溃了
Re: lxiaoxiaot 2011-04-20 23:21发表 [回复]
回复 RoyalVane:哎、不能超过150字符、替换成“VideoSource_Win32_LibVideoInput.cc”或者是“VideoSource_Win32_OpenCV.cc”再试下呢、^_^
1楼 flfwe 2011-04-10 18:48发表 [回复] [引用] [举报]
我搞了两天才成功编译了 但是为什么运行只有一个黑框框
Re: lxiaoxiaot 2011-04-20 23:21发表 [回复] [引用] [举报]
回复 flfwe:PTAM默认的是CMU1394的、所以效果出不来。把这个文件“VideoSource_Win32_CMU1394.cc”替换掉试下呢。抱歉,这么晚才回复,^_^




posted on 2012-01-24 15:22  Vision&Details  阅读(3303)  评论(0编辑  收藏  举报

导航