編譯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;
}
}