2012-09-17 136 views
1

我正在運行OpenCV 2.4.2。OpenCV未校準相機校正用於三維重建

我的項目包含一個3D人臉識別。

我正嘗試從未校準相機拍攝的圖像對創建3D模型。 我的目標是獲得一些3D功能用於識別過程。

我試圖校準和糾正相機,但我沒有得到好的結果。 我做下列步驟操作: - 計算的基本矩陣感謝「findFundamentalMat」 - - 使用「stereoRectifyUncalibrated」來獲得單應矩陣 - 2個圖像特徵 之間找到對應 - 提取衝浪從2個圖像 使用的功能「 warpPerspective「與第一個圖像和第一個單應矩陣來查看結果。

我有一個非常壞的結果,我不知道現在該做什麼...

是糾正算法?任何建議?

什麼樣的3D功能可以用來獲得更好的人臉識別?

這裏的校準代碼:

/// Conversione di 1 vettore di keypoints in 2 vettori di Point2f 
vector<int> pointIndexesLeft; 
vector<int> pointIndexesFront; 

for (vector<DMatch>::iterator it= matches_FL.begin(); it!= matches_FL.end(); ++it) { 
    // Estrazione degli indici 
    pointIndexesLeft.push_back(it->queryIdx); 
    pointIndexesFront.push_back(it->trainIdx); 
} 

// Convrsione dei keypoints in Point2f 
vector<cv::Point2f> selPointsLeft, selPointsFront; 
KeyPoint::convert(keypoints_left,selPointsLeft,pointIndexesLeft); 
KeyPoint::convert(keypoints_front,selPointsFront,pointIndexesFront); 

// Calcolo della matrice fondamentale 
Mat F = findFundamentalMat(
          Mat(selPointsFront), // points in first image 
          Mat(selPointsLeft), // points in second image 
          CV_FM_RANSAC);  // 8-point method 


/// Rettifico la camera 
Mat H1,H2; 
stereoRectifyUncalibrated(selPointsFront, selPointsLeft, F, img_front.size(), H1, H2,3); 

Mat out_right= Mat::zeros(img_front.rows, img_front.cols, img_front.depth()); 
Mat out_left= Mat::zeros(img_left.rows, img_left.cols, img_front.depth()); 

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT); 
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT); 

imshow("out_right", out_right); 
imshow("out_left", out_left); 

預先感謝您

回答

2

的所有第一檢測/識別首先無關三維重建。假設你想要從一臺未校準的相機中完成一個物體的三維重建,那麼通常有兩種選擇:

1)首先使用校準模式(通常爲象棋模式)校準相機;請參閱camera_calibration.cpp示例。 2)你可以同時校準和做三維重建,最簡單的過程是這樣的:首先使用ANY特徵檢測算法提取顯着點(特徵)(每個特徵檢測算法都有優缺點,但是有任何那麼你應該得到工作結果),爲找到的特徵提取描述符,匹配兩張有條件照片的描述符,找到基本矩陣F,從F中提取兩個投影矩陣(3×4矩陣),對匹配特徵進行三角化,然後通過切除遞歸地進行:使用已經計算出的3D點並匹配新照片中的特徵來計算其相機矩陣(內在和外在矩陣),對新照片帶來的新特徵進行三角測量,並且對整個重構空間(相機和3D點)。

祝你好運!

+0

我沒有辦法校準相機,因爲它們來自在線數據集,所以我無法計算內在和外在矩陣。我已經計算出兩張圖像之間的匹配。然後我已經計算了F矩陣和「stereoRectifyUncalibrated」H1和H2,然後是視差圖。我從視差圖和「虛構」Q矩陣計算了「reprojectImageTo3D」(我不知道如何構建這個矩陣,所以我使用了身份矩陣)。你對Triangulate意味着什麼?你可以更具體嗎?我想使用3D功能(如果你有任何想法使用什麼功能)進行識別 – Gappa

0

Altough我是你正試圖用這種方法對人臉圖像來完成不知道,我看到你的方法存在以下問題。

一切都很好,直到找到單應矩陣H1,H2但之後:

warpPerspective(img_front,out_right, H1, img_front.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT); 
 
warpPerspective(img_left,out_left, H2, img_left.size(), INTER_LINEAR | WARP_INVERSE_MAP, BORDER_TRANSPARENT);

見參考:warpPerspective on opencv doc

應該不會有WARP_INVERSE_MAP標誌,因爲H1是前向單應性而不是後向單應性。通過不使用此標誌並使用未校準的攝像頭圖像,我可以得到正確的結果。實際上,當您使用未經校準的相機時,實際上並沒有問題,只要您能夠在多次迭代中一致地識別基本矩陣即可。

試試這個,讓我們知道它是否適合你。