1. 程式人生 > >編譯PTAM與PTAMM-記

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

}