2012-04-17 93 views
5

我正在嘗試使用Emgu/OpenCV來校準Kinect相機和外部相機。 我卡住了,我真的很感激任何幫助。通過基本矩陣校正未校準的相機

我選擇通過基礎矩陣,即極線幾何來做到這一點。 但結果並非如我所料。結果圖像是黑色的,或根本沒有意義。 Mapx和mapy點通常都等於無限或無限,或者全部等於0.00,並且很少有常規值。

這是我試圖做到整改:從組圖像

1)查找圖像點得到像點的兩個數組(一個爲每個攝像頭)。我用棋盤和FindChessboardCorners函數完成了這個工作。

2)找到基本矩陣

CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix, 
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero); 

我是否通過所有收集的點從整組圖像,或只是從兩個圖像試圖糾正?

3)查找單對應性矩陣

CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix, 
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold); 

4)獲取MapX與mapy

double scale = 0.02; 
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 

CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale); 
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale); 
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale); 
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale); 

CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr, 
mapxLeft.Ptr, mapyLeft.Ptr) ; 

我有一個問題在這裏...因爲我沒有使用校準圖像,我的相機矩陣和失真係數是什麼?我如何從基本矩陣或單應性矩陣中獲得它?

5)重映射

CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight, 
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255)); 

而且這並不返回好的結果。如果有人會告訴我我做錯了什麼,我將不勝感激。

我有25組圖像,棋盤圖案大小9x6。

回答

0

O'Reilly出版社出版的「學習OpenCV」一書有兩個專門討論這個特定主題的章節。都大量使用OpenCV包含的例程cvCalibrateCamera2()和cvStereoCalibrate();這些例程是代碼封裝器,與您在此處編寫的代碼很相似,還有維護OpenCV庫的人員對其進行了更徹底的調試。儘管它們很方便,但都需要相當多的預處理來實現對例程的必要輸入。實際上,OpenCV發行版的示例目錄中可能有一個示例程序,它使用這些例程,並提供了有關如何從棋盤圖像到校準/內在矩陣的示例。如果您深入瞭解這些地方,我相信您會在專家的建議下看到如何實現您的目標。

0

cv :: findFundamentalMat如果圖像點的內部參數是單位矩陣,換句話說,它不能用於未投影的圖像點,則無法工作