2015-09-07 86 views
3

我有一個類似於this的不對稱圓點圖案。 我使用opencv solvePnP函數來根據a)已知的3D模式點估計模式的姿態; b)在2D圖像中檢測到的圖案點SolvePnP - 平面物體的姿態估計 - 模棱兩可的情況

我發現在某些情況下(當圖案正面朝向相機並傾斜一點時),solvePnP函數返回的估計姿態不穩定。對於幾乎相同的圖案姿態有兩個結果(不移動)。我想這是由於模糊的平面姿態具有相同的2D投影。

有如下建議任何解決方案,它除了時間濾波: Similar issue

更新: 我嘗試着將這個paper它解決了模棱兩可的情況,但沒有奏效。 我使用的代碼是here。 通過使用該算法,我可以得到與cv::solvePNP幾乎相同的結果,但不穩定的情況仍然存在。

+0

如果你知道場景是平面的,爲什麼不使用'findHomography'? – Photon

+0

@Photon對不起,我可能會誤解你。我需要一個3D物體的姿勢。但'findHomography'返回源平面和目標平面之間的透視變換H. H是3x3矩陣,我認爲它是2D單應矩陣? –

+0

圖像鏈接指向404.是[this](http://robocraft.ru/files/opencv/acircles_pattern.png)您鏈接的圖像? – m00am

回答

0

如已經提出,使用findHomography,然後分解的結果。見張有友的paper here。特別是,關於這個概念,請參閱公式2.18,解決方案請參閱2.26 - 您想要的情況是隻有一個圖像的情況。

+0

謝謝你的回答。我檢查了'cv :: solvePnP'的源代碼,它實際上使用了本文提到的方法來解決外部參數(即姿態)。此外,他們還添加了一個迭代過程來改進姿勢。請[calibration.cpp]見'cvFindExtrinsicCameraParams2'(https://github.com/Itseez/opencv/blob/master/modules/calib3d/src/calibration.cpp) –

2

您可以設置爲設定useExtrinsicGuess solvePnP功能;使用此參數,solvePnP使用solvePnP內解算器的第一次迭代中的最後計算姿態,請參閱https://en.wikipedia.org/wiki/Levenberg–Marquardt_algorithm。 例如:

void getPose(cv::Mat& t_vec, cv::Mat& r_vec) 
{ 
    static cv::Mat raux, taux; 
    static bool useExtrinsicGuess = false 
    cv::Mat objPoints (4, 3, CV_32FC1); // Your 3d points 
    cv::Mat imagePoints(4, 2, CV_32FC1); // Your 2d points 

    cv::solvePnP (objPoints, 
        imagePoints, 
        camera.getCameraMatrix(), // Camera matrix 
        camera.getDistorsion(), // Camera distorsion 
        raux, taux, useExtrinsicGuess, CV_ITERATIVE); 
    if (!useExtrinsicGuess) { 
     useExtrinsicGuess = true; 
    } 
    raux.convertTo(r_vec, CV_32F); 
    taux.convertTo(t_vec, CV_32F); 
} 

你也可以使用更多的點,在不同的平面。

+0

其實我已經嘗試過這一點,但如果它是一個模棱兩可的姿勢,即使我從一個正確的姿勢開始,它會在LM優化之後收斂到錯誤的一個,因爲再投影誤差可能稍小。由於姿勢不再含糊不清,因此在不同飛機上使用更多的點可以解決問題。 –

+0

我使用_solvePnPRansac_而不是_solvePnP_和_CV_P3P_而不是_CV_ITERATIVE_獲得了更好的結果。讓我知道如果使用這些MODS會增加姿態估計的準確性。 –

+0

更好的意思是準確性或魯棒性? –