2013-05-09 47 views
0

目前我正在實施立體視覺校準方法。我正在使用OpenCV庫。OpenCV立體校準(示例代碼問題)

有樣品文件夾中的例子,但我對實施的幾個問題:

在哪裏這些陣列對,什麼是CvMat中的那些變量?

// ARRAY AND VECTOR STORAGE: 
double M1[3][3], M2[3][3], D1[5], D2[5]; 
double R[3][3], T[3], E[3][3], F[3][3]; 
CvMat _M1 = cvMat(3, 3, CV_64F, M1); 
CvMat _M2 = cvMat(3, 3, CV_64F, M2); 
CvMat _D1 = cvMat(1, 5, CV_64F, D1); 
CvMat _D2 = cvMat(1, 5, CV_64F, D2); 
CvMat _R = cvMat(3, 3, CV_64F, R); 
CvMat _T = cvMat(3, 1, CV_64F, T); 
CvMat _E = cvMat(3, 3, CV_64F, E); 
CvMat _F = cvMat(3, 3, CV_64F, F); 

在其他例子中我看到這樣的代碼:

//--------Find and Draw chessboard--------------------------------------------------  

    if((frame++ % 20) == 0) 
    { 
     //----------------CAM1------------------------------------------------------------------------------------------------------- 
     result1 = cvFindChessboardCorners(frame1, board_sz,&temp1[0], &count1,CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS); 
     cvCvtColor(frame1, gray_fr1, CV_BGR2GRAY); 

是什麼if語句究竟做什麼?爲什麼%20?

預先感謝您!


更新:

我有一些執行代碼的兩個問題:link

-1:那些nx和ny變量在第18行聲明,並在board_sz變量使用在第25行。這些nx和ny是棋盤格中的行和列還是角? (我認爲這些是行和列,因爲cvSize具有寬度和高度的參數)。

-2:這些CvMat變量(行143 - 146)是什麼?

CvMat _objectPoints = cvMat(1, N, CV_32FC3, &objectPoints[0]); 
CvMat _imagePoints1 = cvMat(1, N, CV_32FC2, &points[0][0]); 
CvMat _imagePoints2 = cvMat(1, N, CV_32FC2, &points[1][0]); 
CvMat _npoints = cvMat(1, npoints.size(), CV_32S, &npoints[0]); 
+1

從這段代碼中找出這些變量的含義是不可能的。這就像是在詢問'int x = 0;'中的'x'一樣,並且%20是每20幀一次運行下面的代碼。 – user502144 2013-05-10 06:40:15

+1

您可以在這個網站找到實例: [鏈接](https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/stereo_calib.cpp?rev=2196) 我仍然不知道那些CvMat變量是爲了什麼? – Odrai 2013-05-10 14:24:59

回答

3

這些矩陣中的每一個在epipolar geometry中都有含義。他們描述了3D空間中兩個攝像機之間的關係以及他們記錄的圖像之間的關係。

在你的榜樣,他們分別是:

  • M1 - 你的左手相機
  • M2的相機內在基質 - 你的右相機的相機內部函數矩陣
  • D1 - 的畸變係數的左攝像頭
  • D2 - 右攝像頭的畸變係數
  • R - 從右到左攝像頭的旋轉矩陣
  • 筆 - 從你的左邊相機
  • E中的右平移矢量 - 你的立體聲設置
  • F的本質矩陣 - 您的立體聲設置

的基本矩陣在這些矩陣的基礎,你可以undistortrectify你的圖像,它允許你提取你在兩幅圖像中看到的點的深度,通過它們的差異(基本上差異在x中)。在兩張圖片中找到一個點稱爲,匹配,通常是整頓後的最後一步。

對極幾何和立體視覺的任何好的介紹可能會比我在這裏可以輸入的任何東西都好。我推薦使用Learning OpenCV這本書,你的示例代碼是從中獲取的,並且詳細解釋了基本知識。

您的問題的第二部分已經在評論中得到了回答: (frame ++%20)對於從網絡攝像機錄製的每20幀都是0,因此if-clause中的代碼每20幀執行一次。


回答您的更新:

nx和ny是在你的校正圖像的棋盤圖案角的數量。 na「normal」8x8 chessboard,nx = ny = 7.你可以看到,在第138-139行中,一個理想棋盤的點是通過nx * ny點的距離squareSize來創建的,棋盤。

將CvMat變量「objectPoints」,「imagePoints」和「npoints」傳遞給cvStereoCalibrate函數。

  • objectPoints包含您的校準物體的(棋盤)
  • imagePoints1/2包含這些點由每部攝像機
  • npoints只包含每個圖像中的點的數目所看到的點(如一個M-by-1矩陣) - 隨意忽略它,它不會在OpenCV C++ API中使用。

基本上,cvStereoCalibrate適合imagePoints到objectPoints,並返回1)的失真係數,2)固有照相機矩陣和3)的兩個相機的空間關係爲旋轉矩陣R和平移向量T.第一個用於undistort您的圖片,第二個將您的像素座標轉換爲實際座標,第三個允許您可以糾正您的兩個圖像。

附註:我記得在立體聲校準時遇到了問題,因爲在左右攝像機圖像中可能會檢測到棋盤方向不同。這不應該是一個問題,除非你的相機之間有很大的角度(這不是一個好主意),或者你傾向於棋盤(這是沒有必要的),但是你仍然可以留意。

+0

非常感謝!現在它變得更加清晰了! :) 我還有一些關於一些實現代碼的問題[鏈接](https://www.assembla.com/code/depthmap/subversion/nodes/stereo%20vision%20-%20Heinrich.cpp?rev=7): 在校準區域/區域中有3個for循環。在這些循環中,ny和nx是行和列。所以我認爲你在循環2D數組?第三個是for循環中的第三個for循環,還是在第一個之外? for循環的含義是什麼? 你能(再次)向我解釋那些CvMat變量的用途是什麼? 預先感謝您! – Odrai 2013-05-11 09:50:57

+1

第138-140行將棋盤圖案的「理想」點與校準圖像中找到的點進行比較。 nx和ny不是行和列,而是您正在使用的棋盤圖案中的角的數量。第140行不在for循環中 - for循環涉及它後面的單個命令或一組由花括號分組的命令。你在談論哪個CvMat變量?在163-172行中聲明的那些?在這種情況下編輯你的問題,我無法在評論中回答。 – FvD 2013-05-12 03:42:37

+0

請參閱第一篇文章中的「更新」。 – Odrai 2013-05-12 08:29:12