현재 코드는 검은색 바탕에 흰색 사각형을 그리게 되는데, 소수 값을 정수 값 (픽셀의 위치 좌표)으로 변환하는 과정에서 오차가 발생한다. 얼핏 격자 무늬로 보이는 오른쪽 그림을 확대한 왼쪽 그림을 보면, 격자 사이가 벌어지거나 겹치는 부분이 생긴다는 것을 알 수 있다.
그리는 방법을 달리했더니 해결된다. 이미지와 같은 높이의 세로 막대들을 하얀색으로 먼저 그리고 나서, 이미지와 같은 너비의 가로 막대들을 하얀색으로 그리고, 막대들이 서로 교차하는 (하얀색으로 두 번 그린 셈인) 부분을 다시 검은색으로 그렸다. (이건 뭔... 컴퓨터 비전도 이미지 프로세싱도 아니고 그렇다고 컴퓨터 그래픽스라고 보기도 우습고, 중학교 수학 경시대회 난이도 중상 정도의 문제를 푸는 기분이다. )
세로선 40개, 가로선 30개로 생성된 패턴 (400x300pixels)
오른쪽의 패턴을 7배 확대한 영상
/* Draw grid pattern
using kyu's pattern generator with optimal cross ratios
2010, lym
// calculate cross ratios in the world coordinate on real pattern
void crossRatioWorld( vector<CvPoint2D32f>& CRworld, vector<CvPoint3D32f>& world, int dxListSize, int dyListSize, CvPoint2D32f scale )
{
// vector<CvPoint2D32f> crossRatioWorld; // cross ratios in the world coordinate on real pattern
float crX = -1.0, crY = -1.0;
for( int i = 0; i < dxListSize; i++ )
{
for( int j = 0; j < dyListSize; j++ )
{
CRworld.push_back(cvPoint2D32f(crX, crY));
}
}
// "cr[iP] = p1 * p3 / ((p1 + p2) * (p2 + p3))" in psoBasic.cpp: 316L
// that is (b-a)(d-c)/(c-a)(d-b) with 4 consecutive points, a, b, c, and d
float a, b, c, d;
// cross ratios in horizontal lines
for( int i = 0; i < dxListSize-3; i++ )
{
a = world[i*dyListSize].x;
b = world[(i+1)*dyListSize].x;
c = world[(i+2)*dyListSize].x;
d = world[(i+3)*dyListSize].x;
// cout << "cross ratio = " << cross_ratio << endl;
printf("cross ratio = %f\n", cross_ratio);
}
return 0;
}
cross ratio = 1.088889
cross ratio = 2.153846
cross ratio = 1.185185
cross ratio = 1.094737
cross ratio = 2.166667
cross ratio = 1.160714
cross ratio = 1.274510
cross ratio = 1.562500
cross ratio = 1.315789
cross ratio = 1.266667
cross ratio = 1.266667
cross ratio = 1.446429
cross ratio = 1.145455
cross ratio = 1.441176
cross ratio = 1.484848
cross ratio = 1.421875
cross ratio = 1.123457
cross ratio = 1.600000
cross ratio = 1.142857
cross ratio = 1.960784
cross ratio = 1.142857
cross ratio = 1.350000
cross ratio = 1.384615
cross ratio = 1.529412
cross ratio = 1.104575
cross ratio = 1.421875
cross ratio = 1.711111
cross ratio = 1.178571
cross ratio = 1.200000
cross ratio = 1.098039
cross ratio = 2.800000
cross ratio = 1.230769
cross ratio = 1.142857
다른 식 적용
cross ratio = 0.040000
cross ratio = 0.666667
cross ratio = 0.107143
cross ratio = 0.064935
cross ratio = 0.613636
cross ratio = 0.113636
cross ratio = 0.204545
cross ratio = 0.390625
cross ratio = 0.230769
cross ratio = 0.203620
cross ratio = 0.205882
cross ratio = 0.316406
cross ratio = 0.109375
cross ratio = 0.300000
cross ratio = 0.360000
cross ratio = 0.290909
cross ratio = 0.090909
cross ratio = 0.400000
cross ratio = 0.100000
cross ratio = 0.562500
cross ratio = 0.100000
cross ratio = 0.257143
cross ratio = 0.285714
cross ratio = 0.363636
cross ratio = 0.074380
cross ratio = 0.290909
cross ratio = 0.466667
cross ratio = 0.125000
cross ratio = 0.156250
/* Test: pattern design in implementing a virtual studio
to design grid lines using cross-ratio as represented in "swPark_2000rti": (16)
C(x1,x2,x3,x4) = (x2-x1)(x4-x3) / (x4-x2)(x3-x1)
based on two plots in figure 7, 439p
2010, lym
*/
cout << "# of cross-ratios in vertical lines = " << sizeof(crossratio_vertical) / sizeof(double) << endl;
cout << "# of cross-ratios in horizontal lines = " << sizeof(crossratio_horizontal) / sizeof(double) << endl;
// initialize grid lines of the pattern
double x[40] = { 0.0 }; // 40 vertical lines
double y[20] = { 0.0 }; // 20 horizontal lines
double r = 0.0; // cross ratio of 4 consecutive lines
double a,b,c,d; // temporary variables to be used in calculating a cross ratio
// set the positions of the first three vertical lines
x[0] = 1.0;
x[1] = x[0] + 1.0;
x[2] = x[1] + 2.0;
// set the positions of the first three horizontal lines
y[0] = 1.0;
y[1] = y[0] + 2.0;
y[2] = y[1] + 1.0;
// for vertical lines
int number = 40;
cout << endl << "x[0]=" << x[0] << " x[1]=" << x[1] << " x[2]=" << x[2] << endl;
for( int n = 0; n < number-3; n++ )
{
// cout << "n = " << n << endl;
r = crossratio_vertical[n];
/* a = x[n];
b = x[n+1];
c = x[n+2];
// cout << "a=" << a << " b=" << b << " c=" << c << " ratio =" << r;
camera self-calibration 카메라 자동 보정
: 어떤 물체의 삼차원 VRML 모델을 여러 장의 영상에서 얻고자 하는 경우 그 영상들을 얻는 데 사용된 카메라에 대한 위치, 방향, 초점거리 등의 정보를 구하는 과정
projective geometric method 투영기하방법
1. 삼차원 모델 복원을 통한 증강 현실
SFM = structure from motion
: 카메라 파라미터와 영상열 (image sequence) 각 프레임의 카메라간의 상대적인 위치를 계산하고, 이러한 정보를 이용하여 영상열에 보이는 물체의 대략적인 3차원 구조를 계산
trilinearity
: 임의의 3차원 구조를 보고 있는 세 개의 투시뷰 (perspective view) 사이의 대수학적 연결 관계
trifocal tensor
: trilinearity를 수학적으로 모델링한 것
(영상에서 특징점과 직선을 정합하고, 투영 카메라를 계산하며, 투영 구조를 복원하는 데 이용됨)
(기존 epipolar geometry를 이용한 방법보다 더 정확한 결과를 얻을 수 있는 것으로 알려짐)
SFM 시스템의 핵심 기술을 영상열에서 정확하게 카메라를 계산하는 것이다.
1) projective reconstruction 투영 기하 복원
영상열에서 추출되는 특징점과 특징선들을 정확하게 연결하여 영상열에서 관찰되는 2차원 특징들과 우리가 복원하여 모델을 만들고자 하는 3차원 구조와의 초기 관계를 (실제 영상을 획득한 카메라의 파라미터들과 카메라간의 상대적인 파악함으로써) 계산
Trifocal
tensor의 계산은 아주 정밀한 값을 요구하므로 잘못된 특징점이나 특징선의 연결이 들어가서는 안 된다. 이러한 잘못된 연결
(Outlier)를 제거하는 방법으로 LMedS (Least Median Square)나 RANSAC (Random
Sampling Consensus) 기법이 사용된다.
세 개의 뷰 단위로
연속된 영상열에서 계속적으로 계산된 trifocal tensor들과 특징점과 특징선들은 임의의 기준 좌표계를 중심으로 정렬하는
다중 뷰 정렬 (Multi-view Registration) 처리를 통하여 통합된다. 이렇게 통합된 값들은 투영 통합 최적화
(Projective Bundle Adjustment)를 거쳐 투영 기하 아래에서 발생한 에러를 최소화한다.
2) camera auto-calibration 카메라 자동 보정
투영 기하 정보를 유클리드 기하 정보로 변환하기 위해서 필요한 것으로, 2차원 영상 정보의 기하학적인 특징을 이용하여 투영 기하에서 유클리드 기하로 3차원 구조를 변환하는 동시에 실세계에서의 카메라 변수(초점 거리, 카메라 중심, 축 비율, 비틀림 상수)와 카메라 간의 상대적인 위치를 정확하게 계산
카메라 자동 보정의 방법론에서는 카메라 보정을 위한 패턴을 따로 디자인하여 사용하지 않는다. 이 경우 실시간 계산의 기능은 없어지게 된다.
3) (유클리드) 구조 복원
모델의 3차원 기하 정보를 구함
: 자동 보정 단계를 통하여 복원된 3차원 정보를 그래픽 모델로 만들기 위해서 먼저 3차원 데이터를 데이터 삼각법 (Triangulation)을 이용하여 다각형 메쉬 모델 (Polygonal mesh model)로 만든 후에, 텍스처 삽입을 통해서 모델의 현실성을 증가시킴
2. 카메라 보정에 의한 증강 현실
1) 보정 패턴에 고정된 좌표계(W)와 카메라 좌표계(C) 그리고 그래픽을 위한 좌표계(G) 사이의 관계를 미리 설정해 둠
2) 카메라와 보정 패턴 사이의 상대적인 좌표변환 관계는 영상처리를 통하여 매 프레임마다 계산을 통해 얻음
3) (그래픽 좌표계와 보정 패턴 좌표계는 미리 결정되어 있어서 컴퓨터 그래픽에 의해 합성될 가상물체들의 상대적인 위치가 카메라 보정 단계 이전에 이미 알려져 있는 것이므로,) 카메라로부터 얻은 영상을 분석하여 보정 패턴을 인식하고 고정 패턴의 삼차원 좌표와 그 좌표의 영상 위치를 알아낸 후 그 둘 사이의 관계를 이용하여 카메라 보정값을 얻음
cross ratio 비조화비
4) trifocal tensor를 계산하여 카메라의 초기 정보를 계산하여 초기 영상복원을 구함
5) 영상열의 각 영상에 대해서 이전 시점의 영상 사이의 정합점들을 영상 정합 (image based matching: normalized cross correlation (NCC)를 이용하는) 방법을 통해 구함
6) RANSAC 알고리듬을 기초로 새로운 영상에 대한 카메라 행렬을 구하고, 새롭게 나타난 정합점들에 대해서 삼차원 좌표를 구함 (잘못 얻어진 정합점들을 제거하는 과정을 포함)
7) Euclidean Reconstruction: 투영 기하 공간에서 정의된 값들을 유클리드 공간에서 정의되는 값으로 변환
카메라 자동 보정 및 투영기하공간에서의 계산식들은 모두 비선형 방정식으로 되어 있기 때문에 최소자승 오차법 (Least square error method)으로 구해지는 값들이 원래 방정식을 제대로 따르지 못하는 경우가 많이 생긴다. 따라서 비선형 최적화 과정이 항상 필요하며 유클리드 공간으로의 변환과정의 최종 단계에서 그리고 투영기하공간에서 복원값들 구할 때 최적화 과정을 적절히 배치할 필요가 있다.
Denis Chekhlov, Andrew Gee, Andrew Calway, Walterio Mayol-Cuevas
Ninja on a Plane: Automatic Discovery of Physical Planes for Augmented Reality Using Visual SLAM
내가 설치할 컴퓨터 사양:
Model Name: Mac mini
Model Identifier: Macmini3,1
Processor Name: Intel Core 2 Duo
Processor Speed: 2 GHz
Number Of Processors: 1
Total Number Of Cores: 2
L2 Cache: 3 MB
Memory: 1 GB
Bus Speed: 1.07 GHz
Boot ROM Version: MM31.0081.B00
그래픽 카드:
NVIDIA GeForce 9400
"Intel Core 2 Duo processors 2.4GHz+ are fine."이라고 했는데, 2.0이면 되지 않을까? 그래픽 카드는 동일한 것이니 문제 없고.
1. library dependency 확인
1. TooN - a header library for linear algebra
2. libCVD - a library for image handling, video capture and computer vision
3. Gvars3 - a run-time configuration/scripting library, this is a sub-project of libCVD.
%% cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/toon co TooN
실행 결과:
cvs checkout: warning: failed to open /Users/lym/.cvspass for reading: No such file or directory
cvs checkout: Updating TooN
U TooN/Authors
U TooN/COPYING
U TooN/Cholesky.h
U TooN/Doxyfile
U TooN/GPL.txt
U TooN/LU.h
U TooN/Lapack_Cholesky.h
U TooN/Makefile.in
U TooN/README
U TooN/SVD.h
U TooN/SymEigen.h
U TooN/TODO
U TooN/TooN.h
U TooN/configure
U TooN/configure.ac
U TooN/determinant.h
U TooN/gauss_jordan.h
U TooN/gaussian_elimination.h
U TooN/generated.h
U TooN/helpers.h
U TooN/irls.h
U TooN/lapack.h
U TooN/make_make_vector.awk
U TooN/make_typeof.awk
U TooN/se2.h
U TooN/se3.h
U TooN/sl.h
U TooN/so2.h
U TooN/so3.h
U TooN/wls.h
cvs checkout: Updating TooN/Documentation
cvs checkout: Updating TooN/benchmark
U TooN/benchmark/generate_solvers.m
U TooN/benchmark/solve_ax_equals_b.cc
U TooN/benchmark/solvers.cc
cvs checkout: Updating TooN/doc
U TooN/doc/COPYING_FDL
U TooN/doc/Makefile
U TooN/doc/documentation.h
U TooN/doc/linoperatorsdoc.h
cvs checkout: Updating TooN/internal
U TooN/internal/allocator.hh
U TooN/internal/builtin_typeof.h
U TooN/internal/comma.hh
U TooN/internal/config.hh
U TooN/internal/config.hh.in
U TooN/internal/dchecktest.hh
U TooN/internal/debug.hh
U TooN/internal/deprecated.hh
U TooN/internal/diagmatrix.h
U TooN/internal/make_vector.hh
U TooN/internal/matrix.hh
U TooN/internal/mbase.hh
U TooN/internal/objects.h
U TooN/internal/operators.hh
U TooN/internal/overfill_error.hh
U TooN/internal/reference.hh
U TooN/internal/size_mismatch.hh
U TooN/internal/slice_error.hh
U TooN/internal/typeof.hh
U TooN/internal/vbase.hh
U TooN/internal/vector.hh
cvs checkout: Updating TooN/optimization
U TooN/optimization/brent.h
U TooN/optimization/conjugate_gradient.h
U TooN/optimization/downhill_simplex.h
U TooN/optimization/golden_section.h
cvs checkout: Updating TooN/test
U TooN/test/SXX_test.cc
U TooN/test/as_foo.cc
U TooN/test/brent_test.cc
U TooN/test/cg_test.cc
U TooN/test/cg_view.gnuplot
U TooN/test/chol.cc
U TooN/test/diagslice.cc
U TooN/test/dynamic_test.cc
U TooN/test/gauss_jordan.cc
U TooN/test/gaussian_elimination_test.cc
U TooN/test/golden_test.cc
U TooN/test/identity_test.cc
U TooN/test/lutest.cc
U TooN/test/make_vector.cc
U TooN/test/makevector.cc
U TooN/test/mat_test.cc
U TooN/test/mat_test2.cc
U TooN/test/mmult_test.cc
U TooN/test/normalize_test.cc
U TooN/test/normalize_test2.cc
U TooN/test/scalars.cc
U TooN/test/simplex_test.cc
U TooN/test/simplex_view.gnuplot
U TooN/test/sl.cc
U TooN/test/svd_test.cc
U TooN/test/sym.cc
U TooN/test/test2.cc
U TooN/test/test3.cc
U TooN/test/test_foreign.cc
U TooN/test/un_project.cc
U TooN/test/vec_test.cc
생성된 TooN 폴더에 들어가서
%%% ./configure
실행 결과:
checking for g++... g++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for dgesvd_ in -llapack... yes
checking for decltype... no
checking for __typeof__... yes
checking for __attribute__((deprecated))... yes
You're on the development branch of TooN 2.0. Everything will probably work, but
the interface is a bit different from TooN-1.x
If you want TooN-1, then get it using:
cvs -z3 -d:pserver:anoncvs@cvs.savannah.nongnu.org:/cvsroot/toon co -r Maintenance_Branch_1_x TooN
or update what you currently have using:
cvs up -r Maintenance_Branch_1_x
or head over to:
http://mi.eng.cam.ac.uk/~er258/cvd/
Otherwise, please report any bugs you come across.
%% cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/toon co -D "Mon May 11 16:29:26 BST 2009" TooN
실행 결과:
cvs checkout: warning: failed to open /Users/lym/.cvspass for reading: No such file or directory
? TooN/Makefile
? TooN/config.log
? TooN/config.status
cvs checkout: Updating TooN
U TooN/Cholesky.h
U TooN/Doxyfile
U TooN/LU.h
U TooN/Makefile.in
U TooN/SVD.h
U TooN/SymEigen.h
U TooN/TooN.h
U TooN/configure
U TooN/configure.ac
cvs checkout: `TooN/determinant.h' is no longer in the repository
U TooN/gauss_jordan.h
U TooN/gaussian_elimination.h
U TooN/helpers.h
U TooN/irls.h
U TooN/se2.h
U TooN/se3.h
U TooN/sl.h
U TooN/so2.h
U TooN/so3.h
U TooN/util.h
U TooN/wls.h
cvs checkout: Updating TooN/Documentation
cvs checkout: Updating TooN/benchmark
U TooN/benchmark/generate_solvers.m
cvs checkout: Updating TooN/doc
U TooN/doc/documentation.h
U TooN/doc/matrixdoc.h
cvs checkout: Updating TooN/internal
U TooN/internal/allocator.hh
cvs checkout: `TooN/internal/comma.hh' is no longer in the repository
RCS file: /sources/toon/TooN/internal/config.hh,v
retrieving revision 1.12
retrieving revision 1.8
Merging differences between 1.12 and 1.8 into config.hh
TooN/internal/config.hh already contains the differences between 1.12 and 1.8
U TooN/internal/config.hh.in
cvs checkout: `TooN/internal/dchecktest.hh' is no longer in the repository
U TooN/internal/debug.hh
cvs checkout: `TooN/internal/deprecated.hh' is no longer in the repository
U TooN/internal/diagmatrix.h
U TooN/internal/matrix.hh
U TooN/internal/mbase.hh
U TooN/internal/objects.h
U TooN/internal/operators.hh
cvs checkout: `TooN/internal/overfill_error.hh' is no longer in the repository
U TooN/internal/reference.hh
U TooN/internal/slice_error.hh
U TooN/internal/vector.hh
cvs checkout: Updating TooN/optimization
U TooN/optimization/conjugate_gradient.h
U TooN/optimization/downhill_simplex.h
U TooN/optimization/golden_section.h
cvs checkout: Updating TooN/test
U TooN/test/identity_test.cc
cvs checkout: `TooN/test/simplex_test.cc' is no longer in the repository
cvs checkout: `TooN/test/simplex_view.gnuplot' is no longer in the repository
U TooN/test/vec_test.cc
%% cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/libcvd co -D "Mon May 11 16:29:26 BST 2009" libcvd
실행 결과:
cvs checkout: warning: failed to open /Users/lym/.cvspass for reading: No such file or directory
cvs checkout: Updating libcvd
U libcvd/Authors
U libcvd/Doxyfile
U libcvd/LICENSE
U libcvd/Makefile.in
U libcvd/TODO
U libcvd/config.guess
U libcvd/config.sub
U libcvd/configure
U libcvd/configure.in
U libcvd/generate_dependencies.bash
U libcvd/install-sh
U libcvd/subimage_test.cc
cvs checkout: Updating libcvd/build
cvs checkout: Updating libcvd/build/vc2005
U libcvd/build/vc2005/config.h
U libcvd/build/vc2005/libcvd.sln
U libcvd/build/vc2005/libcvd.vcproj
cvs checkout: Updating libcvd/build/vc2008
U libcvd/build/vc2008/libcvd.sln
U libcvd/build/vc2008/libcvd.vcproj
cvs checkout: Updating libcvd/cvd
U libcvd/cvd/abs.h
U libcvd/cvd/bresenham.h
U libcvd/cvd/brezenham.h
U libcvd/cvd/byte.h
U libcvd/cvd/camera.h
U libcvd/cvd/colourspace.h
U libcvd/cvd/colourspace_convert.h
U libcvd/cvd/colourspace_frame.h
U libcvd/cvd/colourspacebuffer.h
U libcvd/cvd/colourspaces.h
U libcvd/cvd/connected_components.h
U libcvd/cvd/convolution.h
U libcvd/cvd/cpu_hacks.h
U libcvd/cvd/cvd_image.h
U libcvd/cvd/cvd_timer.h
U libcvd/cvd/deinterlacebuffer.h
U libcvd/cvd/deinterlaceframe.h
U libcvd/cvd/diskbuffer2.h
U libcvd/cvd/diskbuffer2_frame.h
U libcvd/cvd/documentation.h
U libcvd/cvd/draw.h
U libcvd/cvd/eventobject.h
U libcvd/cvd/exceptions.h
U libcvd/cvd/fast_corner.h
U libcvd/cvd/gl_helpers.h
U libcvd/cvd/glwindow.h
U libcvd/cvd/haar.h
U libcvd/cvd/harris_corner.h
U libcvd/cvd/helpers.h
U libcvd/cvd/image.h
U libcvd/cvd/image_convert.h
U libcvd/cvd/image_convert_fwd.h
U libcvd/cvd/image_interpolate.h
U libcvd/cvd/image_io.h
U libcvd/cvd/image_ref.h
U libcvd/cvd/integral_image.h
U libcvd/cvd/interpolate.h
U libcvd/cvd/irls.h
U libcvd/cvd/la.h
U libcvd/cvd/localvideobuffer.h
U libcvd/cvd/localvideoframe.h
U libcvd/cvd/message_queue.h
U libcvd/cvd/nonmax_suppression.h
U libcvd/cvd/random.h
U libcvd/cvd/readaheadvideobuffer.h
U libcvd/cvd/rgb.h
U libcvd/cvd/rgb8.h
U libcvd/cvd/rgba.h
U libcvd/cvd/ringbuffer.h
U libcvd/cvd/runnable.h
U libcvd/cvd/runnable_batch.h
U libcvd/cvd/se2.h
U libcvd/cvd/se3.h
U libcvd/cvd/serverpushjpegbuffer.h
U libcvd/cvd/serverpushjpegframe.h
U libcvd/cvd/so2.h
U libcvd/cvd/so3.h
U libcvd/cvd/synchronized.h
U libcvd/cvd/tensor_voting.h
U libcvd/cvd/thread.h
U libcvd/cvd/timeddiskbuffer.h
U libcvd/cvd/timer.h
U libcvd/cvd/utility.h
U libcvd/cvd/vector_image_ref.h
U libcvd/cvd/videobuffer.h
U libcvd/cvd/videobufferflags.h
U libcvd/cvd/videodisplay.h
U libcvd/cvd/videofilebuffer.h
U libcvd/cvd/videofilebuffer_frame.h
U libcvd/cvd/videoframe.h
U libcvd/cvd/videosource.h
U libcvd/cvd/vision.h
U libcvd/cvd/wls.h
U libcvd/cvd/wls_c.h
U libcvd/cvd/wls_cholesky.h
U libcvd/cvd/yc.h
cvs checkout: Updating libcvd/cvd/IRIX
U libcvd/cvd/IRIX/O2buffer.h
U libcvd/cvd/IRIX/O2videoframe.h
U libcvd/cvd/IRIX/sgi-video.h
cvs checkout: Updating libcvd/cvd/Linux
U libcvd/cvd/Linux/capture_logic.cxx
U libcvd/cvd/Linux/dvbuffer.h
U libcvd/cvd/Linux/dvbuffer3.h
U libcvd/cvd/Linux/dvframe.h
U libcvd/cvd/Linux/v4l1buffer.h
U libcvd/cvd/Linux/v4l1frame.h
U libcvd/cvd/Linux/v4l2buffer.h
U libcvd/cvd/Linux/v4l2frame.h
U libcvd/cvd/Linux/v4lbuffer.h
U libcvd/cvd/Linux/v4lcontrol.h
cvs checkout: Updating libcvd/cvd/OSX
U libcvd/cvd/OSX/qtbuffer.h
U libcvd/cvd/OSX/qtframe.h
cvs checkout: Updating libcvd/cvd/internal
U libcvd/cvd/internal/aligned_mem.h
U libcvd/cvd/internal/assembly.h
U libcvd/cvd/internal/builtin_components.h
U libcvd/cvd/internal/convert_pixel_types.h
U libcvd/cvd/internal/disk_image.h
U libcvd/cvd/internal/gl_types.h
U libcvd/cvd/internal/image_ref_implementation.hh
U libcvd/cvd/internal/is_pod.h
U libcvd/cvd/internal/load_and_save.h
U libcvd/cvd/internal/name_CVD_rgb_types.h
U libcvd/cvd/internal/name_builtin_types.h
U libcvd/cvd/internal/pixel_operations.h
U libcvd/cvd/internal/pixel_traits.h
U libcvd/cvd/internal/rgb_components.h
U libcvd/cvd/internal/scalar_convert.h
U libcvd/cvd/internal/simple_vector.h
cvs checkout: Updating libcvd/cvd/internal/io
U libcvd/cvd/internal/io/bmp.h
U libcvd/cvd/internal/io/fits.h
U libcvd/cvd/internal/io/jpeg.h
U libcvd/cvd/internal/io/png.h
U libcvd/cvd/internal/io/pnm_grok.h
U libcvd/cvd/internal/io/save_postscript.h
U libcvd/cvd/internal/io/text.h
U libcvd/cvd/internal/io/tiff.h
cvs checkout: Updating libcvd/cvd/internal/pnm
cvs checkout: Updating libcvd/cvd/lock
cvs checkout: Updating libcvd/cvd/python
U libcvd/cvd/python/interface.h
U libcvd/cvd/python/selector.h
U libcvd/cvd/python/types.h
cvs checkout: Updating libcvd/cvd_src
U libcvd/cvd_src/bayer.cxx
U libcvd/cvd_src/brezenham.cc
U libcvd/cvd_src/colourspace_convert.cxx
U libcvd/cvd_src/connected_components.cc
U libcvd/cvd_src/convolution.cc
U libcvd/cvd_src/corner_10.h
U libcvd/cvd_src/corner_12.h
U libcvd/cvd_src/corner_9.h
U libcvd/cvd_src/cvd_timer.cc
U libcvd/cvd_src/deinterlacebuffer.cc
U libcvd/cvd_src/diskbuffer2.cc
U libcvd/cvd_src/draw.cc
U libcvd/cvd_src/draw_toon.cc
U libcvd/cvd_src/eventobject.cpp
U libcvd/cvd_src/exceptions.cc
U libcvd/cvd_src/fast_corner.cxx
U libcvd/cvd_src/fast_corner_9_nonmax.cxx
U libcvd/cvd_src/faster_corner_10.cxx
U libcvd/cvd_src/faster_corner_12.cxx
U libcvd/cvd_src/faster_corner_9.cxx
U libcvd/cvd_src/faster_corner_utilities.h
U libcvd/cvd_src/globlist.cxx
U libcvd/cvd_src/gltext.cpp
U libcvd/cvd_src/glwindow.cc
U libcvd/cvd_src/half_sample.cc
U libcvd/cvd_src/image_io.cc
U libcvd/cvd_src/mono.h
U libcvd/cvd_src/nonmax_suppression.cxx
U libcvd/cvd_src/sans.h
U libcvd/cvd_src/serif.h
U libcvd/cvd_src/slower_corner_10.cxx
U libcvd/cvd_src/slower_corner_11.cxx
U libcvd/cvd_src/slower_corner_12.cxx
U libcvd/cvd_src/slower_corner_7.cxx
U libcvd/cvd_src/slower_corner_8.cxx
U libcvd/cvd_src/slower_corner_9.cxx
U libcvd/cvd_src/synchronized.cpp
U libcvd/cvd_src/tensor_voting.cc
U libcvd/cvd_src/thread.cpp
U libcvd/cvd_src/timeddiskbuffer.cc
U libcvd/cvd_src/utility_helpers.h
U libcvd/cvd_src/videodisplay.cc
U libcvd/cvd_src/videofilebuffer.cc
U libcvd/cvd_src/videosource.cpp
U libcvd/cvd_src/yuv411_to_stuff.cxx
U libcvd/cvd_src/yuv420.cpp
U libcvd/cvd_src/yuv422.cpp
U libcvd/cvd_src/yuv422.h
cvs checkout: Updating libcvd/cvd_src/IRIX
U libcvd/cvd_src/IRIX/O2buffer.cxx
U libcvd/cvd_src/IRIX/sgi-video.cxx
cvs checkout: Updating libcvd/cvd_src/Linux
U libcvd/cvd_src/Linux/dvbuffer.cc
U libcvd/cvd_src/Linux/dvbuffer3_dc1394v1.cc
U libcvd/cvd_src/Linux/dvbuffer3_dc1394v2.cc
U libcvd/cvd_src/Linux/kernel-video1394.h
U libcvd/cvd_src/Linux/v4l1buffer.cc
U libcvd/cvd_src/Linux/v4l2buffer.cc
U libcvd/cvd_src/Linux/v4lbuffer.cc
U libcvd/cvd_src/Linux/v4lcontrol.cc
cvs checkout: Updating libcvd/cvd_src/OSX
U libcvd/cvd_src/OSX/qtbuffer.cpp
cvs checkout: Updating libcvd/cvd_src/SSE2
cvs checkout: Updating libcvd/cvd_src/Win32
U libcvd/cvd_src/Win32/glwindow.cpp
U libcvd/cvd_src/Win32/win32.cpp
U libcvd/cvd_src/Win32/win32.h
cvs checkout: Updating libcvd/cvd_src/fast
U libcvd/cvd_src/fast/fast_10_detect.cxx
U libcvd/cvd_src/fast/fast_10_score.cxx
U libcvd/cvd_src/fast/fast_11_detect.cxx
U libcvd/cvd_src/fast/fast_11_score.cxx
U libcvd/cvd_src/fast/fast_12_detect.cxx
U libcvd/cvd_src/fast/fast_12_score.cxx
U libcvd/cvd_src/fast/fast_7_detect.cxx
U libcvd/cvd_src/fast/fast_7_score.cxx
U libcvd/cvd_src/fast/fast_8_detect.cxx
U libcvd/cvd_src/fast/fast_8_score.cxx
U libcvd/cvd_src/fast/fast_9_detect.cxx
U libcvd/cvd_src/fast/fast_9_score.cxx
U libcvd/cvd_src/fast/prototypes.h
cvs checkout: Updating libcvd/cvd_src/i686
U libcvd/cvd_src/i686/byte_to_double_gradient.s
U libcvd/cvd_src/i686/byte_to_float_gradient.s
U libcvd/cvd_src/i686/byte_to_short_difference.s
U libcvd/cvd_src/i686/convert_rgb_to_y.cc
U libcvd/cvd_src/i686/convolve_float.s
U libcvd/cvd_src/i686/convolve_float4.s
U libcvd/cvd_src/i686/convolve_gaussian.cc
U libcvd/cvd_src/i686/float_add_mul_add.s
U libcvd/cvd_src/i686/float_add_mul_add_unaligned.s
U libcvd/cvd_src/i686/float_assign_mul.s
U libcvd/cvd_src/i686/float_difference.s
U libcvd/cvd_src/i686/float_innerproduct.s
U libcvd/cvd_src/i686/gradient.cc
U libcvd/cvd_src/i686/halfsample.s
U libcvd/cvd_src/i686/int_difference.s
U libcvd/cvd_src/i686/median_3x3.cc
U libcvd/cvd_src/i686/rgb_to_gray.s
U libcvd/cvd_src/i686/short_difference.s
U libcvd/cvd_src/i686/testconf
U libcvd/cvd_src/i686/utility_byte_differences.cc
U libcvd/cvd_src/i686/utility_double_int.cc
U libcvd/cvd_src/i686/utility_float.cc
U libcvd/cvd_src/i686/yuv411_to_stuff_MMX.C
U libcvd/cvd_src/i686/yuv411_to_stuff_MMX_64.C
U libcvd/cvd_src/i686/yuv420p_to_rgb.s
U libcvd/cvd_src/i686/yuv422_to_grey.s
U libcvd/cvd_src/i686/yuv422_to_rgb.s
U libcvd/cvd_src/i686/yuv422_wrapper.cc
cvs checkout: Updating libcvd/cvd_src/noarch
U libcvd/cvd_src/noarch/convert_rgb_to_y.cc
U libcvd/cvd_src/noarch/convolve_gaussian.cc
U libcvd/cvd_src/noarch/default_memalign.cpp
U libcvd/cvd_src/noarch/gradient.cc
U libcvd/cvd_src/noarch/median_3x3.cc
U libcvd/cvd_src/noarch/posix_memalign.cpp
U libcvd/cvd_src/noarch/utility_byte_differences.cc
U libcvd/cvd_src/noarch/utility_double_int.cc
U libcvd/cvd_src/noarch/utility_float.cc
U libcvd/cvd_src/noarch/yuv422_wrapper.cc
cvs checkout: Updating libcvd/cvd_src/nothread
U libcvd/cvd_src/nothread/runnable_batch.cc
cvs checkout: Updating libcvd/cvd_src/posix
cvs checkout: Updating libcvd/cvd_src/thread
U libcvd/cvd_src/thread/runnable_batch.cc
cvs checkout: Updating libcvd/doc
U libcvd/doc/cameracalib2cm.pdf
U libcvd/doc/tutorial.h
cvs checkout: Updating libcvd/make
U libcvd/make/compile_deps.awk
U libcvd/make/log_to_changelog.awk
U libcvd/make/march_flags
cvs checkout: Updating libcvd/pnm_src
U libcvd/pnm_src/bmp.cxx
U libcvd/pnm_src/fits.cc
U libcvd/pnm_src/jpeg.cxx
U libcvd/pnm_src/png.cc
U libcvd/pnm_src/pnm_grok.cxx
U libcvd/pnm_src/save_postscript.cxx
U libcvd/pnm_src/text.cxx
U libcvd/pnm_src/text_write.cc
U libcvd/pnm_src/tiff.cxx
U libcvd/pnm_src/tiffwrite.cc
cvs checkout: Updating libcvd/progs
U libcvd/progs/calibrate.cxx
U libcvd/progs/cvd_display_image.cxx
U libcvd/progs/cvd_image_viewer.cxx
U libcvd/progs/img_play.cxx
U libcvd/progs/img_play_bw.cxx
U libcvd/progs/img_play_deinterlace.cxx
U libcvd/progs/img_play_generic.cxx
U libcvd/progs/se3_exp.cxx
U libcvd/progs/se3_inv.cxx
U libcvd/progs/se3_ln.cxx
U libcvd/progs/se3_post_mul.cxx
U libcvd/progs/se3_pre_mul.cxx
U libcvd/progs/video_play.cc
U libcvd/progs/video_play_bw.cc
U libcvd/progs/video_play_source.cc
cvs checkout: Updating libcvd/python
U libcvd/python/setup.py
cvs checkout: Updating libcvd/python/CVD
U libcvd/python/CVD/cvd.cpp
cvs checkout: Updating libcvd/test
U libcvd/test/diskbuffer2.cxx
U libcvd/test/dvbuffer3_bayerrgb.cxx
U libcvd/test/dvbuffer3_mono.cxx
U libcvd/test/dvbuffer_controls.cxx
U libcvd/test/dvbuffer_mono.cxx
U libcvd/test/dvbuffer_rgb.cxx
U libcvd/test/dvbuffer_yuvrgb.cxx
U libcvd/test/fast_test.cxx
U libcvd/test/floodfill_test.cc
U libcvd/test/font.cpp
U libcvd/test/o2buffer.cxx
U libcvd/test/test_images.cxx
U libcvd/test/v4l1buffer_bayer.cxx
U libcvd/test/v4l1buffer_mono.cxx
U libcvd/test/v4l1buffer_rgb.cxx
U libcvd/test/v4l2buffer.cxx
U libcvd/test/v4lbuffer_bayerrgb.cxx
U libcvd/test/v4lbuffer_mono.cxx
U libcvd/test/videoprog.cxx
cvs checkout: Updating libcvd/test/fast_test_image
U libcvd/test/fast_test_image/noise.pgm
cvs checkout: Updating libcvd/test/images
U libcvd/test/images/1-byte-bin.pgm
U libcvd/test/images/1-byte-bin.ppm
U libcvd/test/images/1-byte-txt.pgm
U libcvd/test/images/1-byte-txt.ppm
U libcvd/test/images/2-byte-bin.pgm
U libcvd/test/images/2-byte-bin.ppm
U libcvd/test/images/2-byte-txt.pgm
U libcvd/test/images/2-byte-txt.ppm
U libcvd/test/images/colour.jpg
U libcvd/test/images/grey.jpg
cvs checkout: Updating libcvd/test/images/tiff
U libcvd/test/images/tiff/grey-bool-inverted.tiff
U libcvd/test/images/tiff/grey-uint16-normal.tiff
U libcvd/test/images/tiff/grey-uint8-normal.tiff
U libcvd/test/images/tiff/rgb-uint16.tiff
U libcvd/test/images/tiff/rgb-uint8.tiff
cvs checkout: Updating libcvd/util
%% cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/libcvd co -D "Mon May 11 16:29:26 BST 2009" gvars3
실행 결과:
cvs checkout: warning: failed to open /Users/lym/.cvspass for reading: No such file or directory
cvs checkout: Updating gvars3
U gvars3/Authors
U gvars3/GVars2.h.historic
U gvars3/LICENSE
U gvars3/Makefile.in
U gvars3/config.guess
U gvars3/config.sub
U gvars3/configure
U gvars3/configure.ac
U gvars3/fltk2_test
U gvars3/fltk_test
U gvars3/install-sh
U gvars3/main.cc
cvs checkout: Updating gvars3/build
cvs checkout: Updating gvars3/build/vc2005
U gvars3/build/vc2005/gvars3-headless.vcproj
U gvars3/build/vc2005/gvars3.sln
U gvars3/build/vc2005/gvars3.vcproj
cvs checkout: Updating gvars3/build/vc2008
U gvars3/build/vc2008/gvars3-headless.vcproj
U gvars3/build/vc2008/gvars3.sln
U gvars3/build/vc2008/gvars3.vcproj
cvs checkout: Updating gvars3/gvars2_compat
cvs checkout: Updating gvars3/gvars3
U gvars3/gvars3/GStringUtil.h
U gvars3/gvars3/GUI.h
U gvars3/gvars3/GUI_Fltk.h
U gvars3/gvars3/GUI_Fltk2.h
U gvars3/gvars3/GUI_Motif.h
U gvars3/gvars3/GUI_Widgets.h
U gvars3/gvars3/GUI_non_readline.h
U gvars3/gvars3/GUI_readline.h
U gvars3/gvars3/config.h.in
U gvars3/gvars3/default.h
U gvars3/gvars3/gv3_implementation.hh
U gvars3/gvars3/gvars3.h
U gvars3/gvars3/instances.h
U gvars3/gvars3/serialize.h
U gvars3/gvars3/type_name.h
cvs checkout: Updating gvars3/src
U gvars3/src/GStringUtil.cc
U gvars3/src/GUI.cc
U gvars3/src/GUI_Fltk.cc
U gvars3/src/GUI_Fltk2.cc
U gvars3/src/GUI_Motif.cc
U gvars3/src/GUI_impl.h
U gvars3/src/GUI_impl_headless.cc
U gvars3/src/GUI_impl_noreadline.cc
U gvars3/src/GUI_impl_readline.cc
U gvars3/src/GUI_language.cc
U gvars3/src/GUI_non_readline.cc
U gvars3/src/GUI_none.cc
U gvars3/src/GUI_readline.cc
U gvars3/src/gvars2.cc
U gvars3/src/gvars3.cc
U gvars3/src/inst.cc
U gvars3/src/inst_headless.cc
U gvars3/src/serialize.cc
checking for g++... g++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for decltype... no
checking for typeof... yes
You're on the development branch of TooN 2.0. Everything will probably work, but
the interface is a bit different from TooN-1.x
If you want TooN-1, then get it using:
cvs -z3 -d:pserver:anoncvs@cvs.savannah.nongnu.org:/cvsroot/toon co -r Maintenance_Branch_1_x TooN
or update what you currently have using:
cvs up -r Maintenance_Branch_1_x
or head over to:
http://mi.eng.cam.ac.uk/~er258/cvd/
Otherwise, please report any bugs you come across.
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ANSI C header files... yes
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln -s works... yes
checking for ranlib... ranlib
checking how to run the C++ preprocessor... g++ -E
checking if compiler flag -Wall works... yes
checking if compiler flag -Wextra works... yes
checking if compiler flag -pipe works... yes
checking if compiler flag -ggdb works... yes
checking if compiler flag -fPIC works... yes
checking build system type... i386-apple-darwin9.7.0
checking host system type... i386-apple-darwin9.7.0
checking for best optimize flags...
checking if compiler flag -O3 works... yes
checking CPU type... unknown
------------------------------------
Checking processor specific features
------------------------------------
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking whether byte ordering is bigendian... no
checking for MMX support... yes
checking for MMXEXT support... yes
checking for SSE support... yes
checking for SSE2 support... yes
checking for SSE3 support... yes
checking for void*... yes
checking size of void*... 4
checking for inline asm statement... yes
checking assembler supports .type pseudo-op... no
-----------------------------------------------
Checking for operating system specific features
-----------------------------------------------
checking dc1394/dc1394.h usability... no
checking dc1394/dc1394.h presence... no
checking for dc1394/dc1394.h... no
checking for main in -ldc1394... no
checking for /opt/local... yes
checking for /sw... no
configure: Adding /usr/X11R6/include to the build path.
checking Carbon and QuickTime framework... yes
-------------------------------
Checking for optional libraries
-------------------------------
checking for X... libraries /usr/X11/lib, headers /usr/X11/include
checking for glDrawPixels in -lGL... yes
checking GL/glu.h usability... yes
checking GL/glu.h presence... yes
checking for GL/glu.h... yes
checking for gluGetString in -lGLU... yes
checking for tr1::shared_ptr... yes
checking for TooN... yes
checking Old TooN... no
checking for dgesvd_ in -lacml... no
checking if Accelerate framework is needed for LAPACK...
checking for dgesvd_... yes
checking for working pthreads... yes
checking for pthread_yield... no
checking for pthread_yield_np... yes
checking png.h usability... yes
checking png.h presence... yes
checking for png.h... yes
checking for png_init_io in -lpng... yes
checking jpeglib.h usability... yes
checking jpeglib.h presence... yes
checking for jpeglib.h... yes
checking for jpeg_destroy_decompress in -ljpeg... yes
checking JPEG read buffer size... 1 (safe reading)
checking tiffio.h usability... yes
checking tiffio.h presence... yes
checking for tiffio.h... yes
checking for TIFFReadRGBAImage in -ltiff... yes
checking for TIFFReadRGBAImageOriented in -ltiff... yes
checking for doxygen... no
-----------------------------------
Checking for platform compatibility
-----------------------------------
checking glob.h usability... yes
checking glob.h presence... yes
checking for glob.h... yes
checking for glob... yes
checking for GLOB_BRACE and GLOB_TILDE in glob.h... yes
checking whether feenableexcept is declared... no
checking for posix_memalign... no
--------------------------------
Checking for extra build options
--------------------------------
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking for g++... g++
checking for C++ compiler default output file name... a.out
checking whether the C++ compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the C++ preprocessor... g++ -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking iostream usability... yes
checking iostream presence... yes
checking for iostream... yes
checking build system type... i386-apple-darwin9.7.0
checking host system type... i386-apple-darwin9.7.0
configure: Adding /sw to the build path.
configure: Adding /opt/local to the build path.
checking if compiler flag -Wall works... yes
checking if compiler flag -Wextra works... yes
--------------------------
Checking for options
--------------------------
checking for TooN... yes
checking for TooN-2... yes
checking if compiler flag -pthread works... yes
checking for rl_done in -lreadline... yes
------------------------------------------------
Checking for widget libraries (provides GUI_...)
------------------------------------------------
configure: WARNING: No GUI functionality enabled
Options:
toon readline
내 (OS X의) 경우, PTAM/Build/OS X에 있는 모든 (두 개의) 파일 Makefile과 VideoSource_OSX.cc를 PTAM 폴더에 옮겼다.
3-2. video source 셋업
카메라에 맞는 video input file을 컴파일하도록 Makefile을 수정해 주어야 한다.
맥의 경우, (아마도 Logitech Quickcam Pro 5000 을 기준으로 하는) 하나의 소스 파일만이 존재하므로 그대로 두면 될 듯.
3-3. video source 추가
다른 비디오 소스들은 libCVD에 클래스로 만들어져 있다고 한다. 여기에 포함되어 있지 않은 경우에는 VideoSource_XYZ.cc 라는 식의 이름을 갖는 파일을 만들어서 넣어 주어야 한다.
3-4. compile
PTAM 폴더에 들어가서
%% make
실행 결과:
g++ -g -O3 main.cc -o main.o -c -I /MY_CUSTOM_INCLUDE_PATH/ -D_OSX -D_REENTRANT
g++ -g -O3 VideoSource_OSX.cc -o VideoSource_OSX.o -c -I /MY_CUSTOM_INCLUDE_PATH/ -D_OSX -D_REENTRANT
g++ -g -O3 GLWindow2.cc -o GLWindow2.o -c -I /MY_CUSTOM_INCLUDE_PATH/ -D_OSX -D_REENTRANT
In file included from OpenGL.h:20,
from GLWindow2.cc:1:
/usr/local/include/cvd/gl_helpers.h:38:19: error: GL/gl.h: No such file or directory
/usr/local/include/cvd/gl_helpers.h:39:20: error: GL/glu.h: No such file or directory
/usr/local/include/cvd/gl_helpers.h: In function 'void CVD::glPrintErrors()':
/usr/local/include/cvd/gl_helpers.h:569: error: 'gluGetString' was not declared in this scope
make: *** [GLWindow2.o] Error 1
PTAM이 OpenGL을 사용하고 있는데, OpenGL이 Mac에 기본으로 설치되어 있으므로 신경쓰지 않았던 부분이다. 물론 system의 public framework으로 들어가 있음을 확인할 수 있다. 그런데 UNIX 프로그램에서 접근할 수는 없는가? (인터넷에서 검색해 보아도 따로 설치할 수 있는 다운로드 링크나 방법을 찾을 수 없다.)
에러 메시지에 대한 정확한 진단 ->
philphys: 일단 OpenGL은 분명히 있을 건데 그 헤더파일과 라이브러리가 있는 곳을 지정해 주지 않아서 에러가 나는 것 같아. 보통 Makefile에 이게 지정되어 있어야 하는데 실행결과를 보니까 전혀 지정되어 있지 않네. 중간에 보면 -I /MY_CUSTOM_INCLUDE_PATH/ 라는 부분이 헤더 파일의 위치를 지정해 주는 부분이고 또 라이브러리는 뒤에 링크할 때 지정해 주게 되어 있는데 거기까지는 가지도 못 했네.
즉, "링커가 문제가 아니라, 컴파일러 옵션에 OpenGL의 헤더파일이 있는 디렉토리를 지정해 주어야 할 것 같다"고 한다.
문제의 Makefile을 들여다보고
# DO NOT DELETE THIS LINE -- make depend depends on it.
# Edit the lines below to point to any needed include and link paths
# Or to change the compiler's optimization flags CC = g++ -g -O3 COMPILEFLAGS = -I /MY_CUSTOM_INCLUDE_PATH/ -D_OSX -D_REENTRANT LINKFLAGS = -framework OpenGL -framework VecLib -L/MY_CUSTOM_LINK_PATH/ -lGVars3 -lcvd
(다음은 philphys 인용) 파란색 부분 - 각 소스코드를 컴파일한 다음 컴파일된 오브젝트 코드를 실행파일로 링크하는 부분. 여기서는 $(LINKFLAGS)에 링커 프로그램에 전달되는 옵션이 들어간다. 초록색 부분 - 컴파일할 오브젝트 코드의 리스트 분홍색 부분 - CC는 컴파일러 프로그램과 기본 옵션. COMPILEFLAGS는 컴파일러에 전달하는 옵션들, 여기에 헤더 파일의 위치를 정할 수 있다. LINKFLAGS는 컴파일된 오브젝트 코드를 실행파일로 링크하는 링커에 들어가는 옵션. 여기에 라이브러리의 위치와 사용할 라이브러리를 지정해 준다. 라이브러리의 위치는 -L 옵션으로, 구체적인 라이브러리 이름은 -l 옵션으로.
maetel: 사실 프레임웍 안에 gl.h 파일이 있는 위치는 다음과 같다.
/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers
philphys: "근데 코드에서는 그 헤더를 "GL/gl.h"로 찾는다는 게 문제. 이건 프레임웍 방식이 아닌 고전적인 유닉스 Xwindows의 OpenGL 방식이다. 즉 방금 보인 gl.h, glu.h 등이 있는 /usr/X11R6/include 를 COMPILERFLAGS에 -I 옵션으로 넣어 줘야 하는 게 아닐까."
philphys: /usr/X11R6/include 밑에 GL 폴더가 있고 거기에 필요한 헤더파일들이 모두 들어 있다. 그래서 코드에선 "GL/gl.h" 하는 식으로 explicit하게 GL 폴더를 찾게 된다.
그러고 보면 아래와 같은 설명이 있었던 것이다.
Since the Linux code compiles directly against the nVidia driver's GL headers, use of a different GL driver may require some modifications to the code.
CameraCalibrator 파일을 실행시켜 카메라 캘리브레이션을 시도했더니 GUI 창이 뜨는데 연결된 웹캠(Logitech QuickCam Pro 4000)으로부터 입력을 받지 못 한다.
4-0. 증상
CameraCalibrator 실행파일을 열면, 다음과 같은 터미널 창이 새로 열린다.
Last login: Fri Aug 7 01:14:05 on ttys001
%% /Users/lym/PTAM/CameraCalibrator ; exit;
Welcome to CameraCalibrator
--------------------------------------
Parallel tracking and mapping for Small AR workspaces
Copyright (C) Isis Innovation Limited 2008
Parsing calibrator_settings.cfg ....
! GUI_impl::Loadfile: Failed to load script file "calibrator_settings.cfg".
VideoSource_OSX: Creating QTBuffer....
IMPORTANT
This will open a quicktime settings planel.
You should use this settings dialog to turn the camera's
sharpness to a minimum, or at least so small that no sharpening
artefacts appear! In-camera sharpening will seriously degrade the
performance of both the camera calibrator and the tracking system.
>
그리고 Video란 이름의 GUI 창이 열리는데, 이때 아무런 설정을 바꾸지 않고 그대로 OK를 누르면 위의 터미널 창에 다음과 같은 메시지가 이어지면서 자동 종료된다.
.. created QTBuffer of size [640 480]
2009-08-07 01:20:57.231 CameraCalibrator[40836:10b] ***_NSAutoreleaseNoPool(): Object 0xf70e2c0 of class NSThread autoreleasedwith no pool in place - just leaking
Stack: (0x96827f0f 0x96734442 0x9673a1b4 0xbc2db7 0xbc7e9a 0xbc69d30xbcacbd 0xbca130 0x964879c9 0x90f8dfb8 0x90e69618 0x90e699840x964879c9 0x90f9037c 0x90e7249c 0x90e69984 0x964879c9 0x90f8ec800x90e55e05 0x90e5acd5 0x90e5530f 0x964879c9 0x94179eb9 0x282b48 0xd9f40xd6a6 0x2f16b 0x2fea4 0x26b6)
! Code for converting from format "Raw RGB data"
not implemented yet, check VideoSource_OSX.cc.
logout
[Process completed]
그러므로 3-3의 문제 -- set up video source (비디오 소스 셋업) --로 돌아가야 한다.
즉, VideoSource_OSX.cc 파일을 수정해서 다시 컴파일한 후 실행해야 한다.
Other video source classes are available with libCVD. Finally, if a custom video source not supported by libCVD is required, the code for it will have to be put into some VideoSource_XYZ.cc file (the interface for this file is very simple.)
삽질...
터미널에서 calibrator_settings.cfg 파일을 로드하지 못 했다고 하기에, 그 파일을 찾아보았다.
%% find . -name "calibrator_settings.cfg" -print
./calibrator_settings.cfg
알고 보니 ./는 현재 디렉토리를 말하나 보다. PTAM 폴더 밑에 바로 있다. 왜 못 봤을까...
열어 보니 다음과 같다.
// This file is parsed by the CameraCalibrator executable
// Put any custom gvars settings you want in here
// For example: to increase the camera calibrator's blur parameter,
// uncomment the following line
// CameraCalibrator.BlurSigma=2.0
VideoSource::VideoSource()
{
cout << " VideoSource_OSX: Creating QTBuffer...." << endl;
cout << " IMPORTANT " << endl;
cout << " This will open a quicktime settings planel. " << endl
<< " You should use this settings dialog to turn the camera's " << endl
<< " sharpness to a minimum, or at least so small that no sharpening " << endl
<< " artefacts appear! In-camera sharpening will seriously degrade the " << endl
<< " performance of both the camera calibrator and the tracking system. " << endl;
QTBuffer<yuv422>* pvb;
try
{
pvb= new QTBuffer<yuv422>(ImageRef(640,480), 0, true);
}
catch (CVD::Exceptions::All a)
{
cerr << " Error creating QTBuffer; expection: " << a.what << endl;
exit(1);
}
mptr = pvb;
mirSize = pvb->size();
cout << " .. created QTBuffer of size " << mirSize << endl;
};
그러나 위에서 보듯 size가 맞지 않고 frame이 겹치는 등 넘어갈 수 없는 문제가 있다. (오른쪽 이미지는 같은 상황에서의 비교를 위해 맥용 드라이버 macam에서의 입력을 캡쳐한 것.)
터미널에서의 결과:
%% /Users/lym/PTAM/CameraCalibrator ; exit;
Welcome to CameraCalibrator
--------------------------------------
Parallel tracking and mapping for Small AR workspaces
Copyright (C) Isis Innovation Limited 2008
Parsing calibrator_settings.cfg ....
! GUI_impl::Loadfile: Failed to load script file "calibrator_settings.cfg".
VideoSource_OSX: Creating QTBuffer....
IMPORTANT
This will open a quicktime settings planel.
You should use this settings dialog to turn the camera's
sharpness to a minimum, or at least so small that no sharpening
artefacts appear! In-camera sharpening will seriously degrade the
performance of both the camera calibrator and the tracking system.
> .. created QTBuffer of size [640 480]
2009-08-12 23:10:38.309 CameraCalibrator[5110:10b] *** _NSAutoreleaseNoPool(): Object 0xf8054e0 of class NSThread autoreleased with no pool in place - just leaking
Stack: (0x96670f4f 0x9657d432 0x965831a4 0xc17db7 0xc1ce9a 0xc1b9d3 0xc1fcbd 0xc1f130 0x924b09c9 0x958e8fb8 0x957c4618 0x957c4984 0x924b09c9 0x958eb37c 0x957cd49c 0x957c4984 0x924b09c9 0x958e9c80 0x957b0e05 0x957b5cd5 0x957b030f 0x924b09c9 0x90bd4eb9 0x282b48 0xd9e4 0xd5a6 0x2f15b 0x2fe94 0x25b6)
4-1-2. YUV format 확인
Logitech QuickCam Pro 4000는 YUV420P라는 글을 어디선가 보고, 코드의 yuv422 부분을 yuv420p로 바꾸었으나 증상은 그대로이다.
skype forum:
There is another problem here with Xgl unfortunately, as it
isn'tsupporting the YUV420P (I420) overlay colour/pixel format either.
Soeven if the camera captures successfully (which looks okay on
thosesettings), then you still won't see anything.
왼쪽: macam에서 캡쳐한 이미지 / 오른쪽: PTAM CameraCalibrator에서 보여지는 이미지
Logitech QuickCam Pro 4000
Welcome to CameraCalibrator
--------------------------------------
Parallel tracking and mapping for Small AR workspaces
Copyright (C) Isis Innovation Limited 2008
Parsing calibrator_settings.cfg ....
VideoSource_OSX: Creating QTBuffer....
IMPORTANT
This will open a quicktime settings planel.
You should use this settings dialog to turn the camera's
sharpness to a minimum, or at least so small that no sharpening
artefacts appear! In-camera sharpening will seriously degrade the
performance of both the camera calibrator and the tracking system.
> .. created QTBuffer of size [640 480]
2009-08-13 04:02:50.464 CameraCalibrator[6251:10b] ***
_NSAutoreleaseNoPool(): Object 0x9df180 of class NSThread autoreleased
with no pool in place - just leaking
Stack: (0x96670f4f 0x9657d432 0x965831a4 0xbc2db7 0xbc7e9a 0xbc69d3
0xbcacbd 0xbca130 0x924b09c9 0x958e8fb8 0x957c4618 0x957c4984
0x924b09c9 0x958eb37c 0x957cd49c 0x957c4984 0x924b09c9 0x958e9c80
0x957b0e05 0x957b5cd5 0x957b030f 0x924b09c9 0x90bd4eb9 0x282b48 0xd414
0xcfd6 0x2f06b 0x2fda4)
4-2. Camera Calibrator 실행
Camera calib is [ 1.51994 2.03006 0.499577 0.536311 -0.0005 ]
Saving camera calib to camera.cfg...
.. saved.
5. PTAM 실행
Welcome to PTAM
---------------
Parallel tracking and mapping for Small AR workspaces
Copyright (C) Isis Innovation Limited 2008
Parsing settings.cfg ....
VideoSource_OSX: Creating QTBuffer....
IMPORTANT
This will open a quicktime settings planel.
You should use this settings dialog to turn the camera's
sharpness to a minimum, or at least so small that no sharpening
artefacts appear! In-camera sharpening will seriously degrade the
performance of both the camera calibrator and the tracking system.
> .. created QTBuffer of size [640 480]
2009-08-13 20:17:54.162 ptam[1374:10b] *** _NSAutoreleaseNoPool(): Object 0x8f5850 of class NSThread autoreleased with no pool in place - just leaking
Stack: (0x96670f4f 0x9657d432 0x965831a4 0xbb9db7 0xbbee9a 0xbbd9d3 0xbc1cbd 0xbc1130 0x924b09c9 0x958e8fb8 0x957c4618 0x957c4984 0x924b09c9 0x958eb37c 0x957cd49c 0x957c4984 0x924b09c9 0x958e9c80 0x957b0e05 0x957b5cd5 0x957b030f 0x924b09c9 0x90bd4eb9 0x282b48 0x6504 0x60a6 0x11af2 0x28da 0x2766)
ARDriver: Creating FBO... .. created FBO.
MapMaker: made initial map with 135 points.
MapMaker: made initial map with 227 points.
CameraCalibrator를 실행하면 뜨는 GUI 창에서 다음과 같이 기본 설정이 적용되고,
Source: iSight
Compression type: Component Video - CCIR-601 uyvy
rms error 0.3 이하로 깔끔하게 수렴된 카메라 파라미터의 계산값이 다음과 같은 식으로 나올 때,
Camera calib is [ 1.22033 1.62577 0.489375 0.641251 0.544352 ]
PTAM을 실행하면 위의 Logitech QuickCam 두 기종보다는 features를 보다 잘 잡는다. (아직은 많이 부족하지만...)
Welcome to PTAM
---------------
Parallel tracking and mapping for Small AR workspaces
Copyright (C) Isis Innovation Limited 2008
Parsing settings.cfg ....
VideoSource_OSX: Creating QTBuffer....
IMPORTANT
This will open a quicktime settings planel.
You should use this settings dialog to turn the camera's
sharpness to a minimum, or at least so small that no sharpening
artefacts appear! In-camera sharpening will seriously degrade the
performance of both the camera calibrator and the tracking system.
> .. created QTBuffer of size [640 480]
ARDriver: Creating FBO... .. created FBO.
MapMaker: made initial map with 242 points.
MapMaker: made initial map with 259 points.
MapMaker: made initial map with 323 points.
MapMaker: made initial map with 626 points.
In Proceedings
of the International Conference on Computer Vision, Rio de Janeiro, Brazil, 2007 demo 1 demo 2
• real-time, high-accuracy localisation and mapping during tracking
• real-time (re-)localisation when when tracking fails
• on-line learning of image patch appearance so that no prior training or map structure is required and features are added and removed during operation.
Lepetit's image patch classifier (feature appearance learning)
=> integrating the classifier more closely into the process of map-building
(by using classification results to aid in the selection of new points to add to the map)
> recovery from tracking failure: local vs. global
local - particle filter -> rich feature descriptor
global - proximity using previous key frames
- based on SceneLib (Extended Kalman Filter)
- rotational (and a degree of perspective) invariance via local patch warping
- assuming the patch is fronto-parallel when first seen http://freshmeat.net/projects/scenelib/
active search
innovation covariance
joint compatibility test
randomized lists key-point recognition algorithm
1. randomized: (2^D - 1) tests -> D tests
2. independent treatment of classes
3. binary leaf scores (2^D * C * N bits for all scores)
4. intensity offset
5. explicit noise handing
ref.
Davison, A. J. and Molton, N. D. 2007. MonoSLAM: Real-Time Single Camera SLAM. IEEE Trans. Pattern Anal. Mach. Intell. 29, 6 (Jun. 2007), 1052-1067. DOI= http://dx.doi.org/10.1109/TPAMI.2007.1049
Lepetit, V., Lagger, P., and Fua, P. 2005. Randomized Trees for Real-Time Keypoint Recognition. In Proceedings
of the 2005 IEEE Computer Society Conference on Computer Vision and
Pattern Recognition (Cvpr'05) - Volume 2 - Volume 02 (June 20 - 26, 2005). CVPR. IEEE Computer Society, Washington, DC, 775-781. DOI= http://dx.doi.org/10.1109/CVPR.2005.288
Klein, G. and Murray, D. 2007. Parallel Tracking and Mapping for Small AR Workspaces
In Proceedings of the 2007 6th IEEE and ACM international Symposium on Mixed and Augmented Reality - Volume 00
(November 13 - 16, 2007). Symposium on Mixed and Augmented Reality.
IEEE Computer Society, Washington, DC, 1-10. DOI=
http://dx.doi.org/10.1109/ISMAR.2007.4538852
1. parallel threads of tracking and mapping
2. mapping from smaller keyframes: batch techniques (Bundle Adjustment)
3. Initializing the map from 5-point Algorithm
4. Initializing new points with epipolar search
5. mapping thousands of points
affine warp
warping matrix <- (1) back-projecting unit pixel displacements in the source keyframe pyramid level onto the patch's plane and then (2) projecting these into the current (target) frame
Trends in Augmented Reality Tracking, Interaction and Display : A Review of Ten Years of ISMAR
Feng Zhou (Center for Human Factors and Ergonomics, Nanyang Technological University, Singapore)
Henry Been-Lirn Duh (Department of Electrical and Computer Engineering/Interactive and Digital Media Institute, National University of Singapore)
Mark Billinghurst (The HIT Lab NZ, University of Canterbury, New Zealand)
1. Sensor-based tracking -> ubiquitous tracking and dynamic data fusion
2. Vision-based tracking: feature-based and model-based
1) feature-based tracking techniques:
- To find a correspondence between 2D image features and their 3D world frame coordinates.
- Then to find the camera pose from projecting the 3D coordinates of the feature into the observed 3D image coordinates and minimizing the distance to their corresponding 3D features.
2) model-based tracking techniques:
- To explicitly use a model of the features of tracked objects such as a CAD model or 2D template of the object based on the distinguishable features.
- A visual serving approach adapted from robotics to calculate camera pose from a range of model features (line, circles, cylinders and spheres)
- knowledge about the scene by predicting hidden movement of the object and reducing the effects of outlier data
3. Hybrid tracking
- closed-loop-type tracking based on computer vision techonologies
- motion prediction
- SFM (structure from motion)
- SLAM (simultaneous localization and mapping)
Interaction and User Interfaces
1. Tangible
2. Collaborative
3. Hybrid
Display
1. See-through HMDs
1) OST = optical see-through
: the user to see the real world with virtual objects superimposed on it by optical or video technologies
2) VST = video see-through
: to display graphical infromation directly on real objects or even daily surfaces in everyday life
2. Projection-based Displays
3. Handheld Displays
Limitations of AR
> tracking
1) complexity of the scene and the motion of target objects, including the degrees of freedom of individual objects and their represenation
=> correspondence analysis: Kalman filters, particle filters.
2) how to find distinguishable objects for "markers" outdoors
> interaction
ergonomics, human factors, usability, cognition, HCI (human-computer interaction)
> AR displays
- HMDs - limited FOV, image distortions,
- projector-based displays - lack mobility, self-occlusion
- handheld displays - tracking with markers to limit the work range
Trends and Future Directions
1. Tracking
1) RBPF (Rao-Blackwellized particle filters) -> automatic recognition systems
2) SLAM, ubiquitous tracking, sensor network -> free from prior knowledge
3) pervasive middleware <- information fusion algorithms
2. Interaction and User Interfaces
"Historically, human knowledge, experience and emotion are expressed and communicated in words and pictures. Given the advances in interface and data capturing technology, knowledge, experience and emotion might now be presented in the form of AR content."
Studierstube Augmented Reality Project : software framework for the development of Augmented Reality (AR) and Virtual Reality applications
Graz University of Technology (TU Graz)
Sharedspace project
The Human Interface Technology Laboratory (HITLab) at the University ofWashington and ATR Media Integration & Communication in Kyoto,Japan join forces at SIGGRAPH 99
Ronald Azuma, Yohan Baillot, Reinhold Behringer, Steven Feiner,Simon Julier, Blair MacIntyre Recent Advances in Augmented Reality.IEEE Computer Graphics and Applications 21, 6 (Nov/Dec 2001),34-47.
Bimber, O., Fröhlich, B., Schmalstieg, D., and Encarnação, L. M. 2005. The virtual showcase. In ACM SIGGRAPH 2005 Courses
(Los Angeles, California, July 31 - August 04, 2005). J. Fujii, Ed.
SIGGRAPH '05. ACM, New York, NY, 3. DOI=
http://doi.acm.org/10.1145/1198555.1198713
Bimber, O., Wetzstein, G., Emmerling, A., and Nitschke, C. 2005.
Enabling View-Dependent Stereoscopic Projection in Real Environments.
In Proceedings of the 4th IEEE/ACM international Symposium on Mixed and Augmented Reality
(October 05 - 08, 2005). Symposium on Mixed and Augmented Reality. IEEE
Computer Society, Washington, DC, 14-23. DOI=
http://dx.doi.org/10.1109/ISMAR.2005.27
Cotting, D., Naef, M., Gross, M., and Fuchs, H. 2004. Embedding
Imperceptible Patterns into Projected Images for Simultaneous
Acquisition and Display. In Proceedings of the 3rd IEEE/ACM international Symposium on Mixed and Augmented Reality
(November 02 - 05, 2004). Symposium on Mixed and Augmented Reality.
IEEE Computer Society, Washington, DC, 100-109. DOI=
http://dx.doi.org/10.1109/ISMAR.2004.30
Ehnes, J., Hirota, K., and Hirose, M. 2004. Projected Augmentation - Augmented Reality using Rotatable Video Projectors. In Proceedings of the 3rd IEEE/ACM international Symposium on Mixed and Augmented Reality
(November 02 - 05, 2004). Symposium on Mixed and Augmented Reality.
IEEE Computer Society, Washington, DC, 26-35. DOI=
http://dx.doi.org/10.1109/ISMAR.2004.47
Arango, M., Bahler, L., Bates, P., Cochinwala, M., Cohrs, D., Fish, R.,
Gopal, G., Griffeth, N., Herman, G. E., Hickey, T., Lee, K. C., Leland,
W. E., Lowery, C., Mak, V., Patterson, J., Ruston, L., Segal, M.,
Sekar, R. C., Vecchi, M. P., Weinrib, A., and Wuu, S. 1993. The Touring
Machine system. Commun. ACM 36, 1 (Jan. 1993), 69-77. DOI= http://doi.acm.org/10.1145/151233.151239
Gupta, S. and Jaynes, C. 2006. The universal media book: tracking and augmenting moving surfaces with projected information. In Proceedings of the 2006 Fifth IEEE and ACM international Symposium on Mixed and Augmented Reality (Ismar'06) - Volume 00
(October 22 - 25, 2006). Symposium on Mixed and Augmented Reality. IEEE
Computer Society, Washington, DC, 177-180. DOI=
http://dx.doi.org/10.1109/ISMAR.2006.297811
Klein, G. and Murray, D. 2007. Parallel Tracking and Mapping for Small AR Workspaces. In Proceedings of the 2007 6th IEEE and ACM international Symposium on Mixed and Augmented Reality - Volume 00
(November 13 - 16, 2007). Symposium on Mixed and Augmented Reality.
IEEE Computer Society, Washington, DC, 1-10. DOI=
http://dx.doi.org/10.1109/ISMAR.2007.4538852
Neubert, J., Pretlove, J., and Drummond, T. 2007. Semi-Autonomous
Generation of Appearance-based Edge Models from Image Sequences. In Proceedings of the 2007 6th IEEE and ACM international Symposium on Mixed and Augmented Reality - Volume 00
(November 13 - 16, 2007). Symposium on Mixed and Augmented Reality.
IEEE Computer Society, Washington, DC, 1-9. DOI=
http://dx.doi.org/10.1109/ISMAR.2007.4538830