1.環境說明與應用說明
? ? VS2015+opencv3.4,實際應用在MFC環境中!主要是用來做定位,利用平面靶標給機器人的工具快換提供定位信息
2.實際調用
CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints,
? ? ? ? ? ? ? ? ? ? ? ? ? ? InputArray cameraMatrix, InputArray distCoeffs,
? ? ? ? ? ? ? ? ? ? ? ? ? ? OutputArray rvec, OutputArray tvec,
? ? ? ? ? ? ? ? ? ? ? ? ? ? bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );
參數變量名 | 類型 | 說明 |
objectPoints | std::vector<cv::Point3d> | 特征點物理坐標 |
imagePoints | std::vector<cv::Point2d> | 特征點圖像坐標 |
cameraMatrix | cv::Mat(3, 3, CV_32FC1) | 相機內參:3*3的float矩陣 |
distCoeffs | cv::Mat(1, 5, CV_32FC1) | 相機畸變參數 |
rvec | ? | 輸出的旋轉向量 |
tvec | ? | 輸出的平移向量 |
useExtrinsicGuess | 0 | ? |
flags | ? | 計算方法 |
?
其中重點flags參數選擇選擇如下所示:
enum { SOLVEPNP_ITERATIVE = 0,
? ? ? ?SOLVEPNP_EPNP ? ? ?= 1, //!< EPnP: Efficient Perspective-n-Point Camera Pose Estimation @cite lepetit2009epnp
? ? ? ?SOLVEPNP_P3P ? ? ? = 2, //!< Complete Solution Classification for the Perspective-Three-Point Problem?
? ? ? ?SOLVEPNP_DLS ? ? ? = 3, //!< A Direct Least-Squares (DLS) Method for PnP ?@cite hesch2011direct
? ? ? ?SOLVEPNP_UPNP ? ? ?= 4, //!< Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation?
? ? ? ?SOLVEPNP_AP3P ? ? ?= 5, //!< An Efficient Algebraic Solution to the Perspective-Three-Point Problem?
? ? ? ?SOLVEPNP_MAX_COUNT ? ? ?//!< Used for count
};
本文的應用主要是基于同一平面上的標準特征點,所以采用SOLVEPNP_ITERATIVE 方法。
結果直接上圖:
warning:
切記,雖然Opencv的參數偏愛float類型,但是solvepnp中除了相機內參和畸變參數矩陣是用float類型外,其余的矩陣都是double類型,不然出出現計算結果不正確的情況。
?
?
?