采用OpenCV解算鱼眼相机的PnP问题
·
对于针孔相机,解算PnP,直接调用cv::solvePnP函数即可,示例如下:
const cv::Mat K;
const cv::Mat D;
std::vector<cv::Point3f> objectPoints;
std::vector<cv::Point2f> imagePoints;
// TODO: 给上述四个变量赋值
cv::Mat rvec, tvec;
cv::solvePnP(objectPoints, imagePoints, K, D, rvec, tvec, false, cv::SOLVEPNP_ITERATIVE);
而对于鱼眼相机,需要对图像点进行畸变矫正,再解算,示例如下:
#include <utility>
#include <opencv2/opencv.hpp>
#include <opencv2/calib3d.hpp>
// 鱼眼相机参数: K, D
// 有畸变的图像坐标:imagePoints
std::pair<cv::Mat, cv::Mat> solvePnPOfFisheye(const cv::Mat K&, const cv::Mat& D,
const std::vector<cv::Point3f>& objectPoints,
const std::vector<cv::Point2f>& imagePoints)
{
// 消除畸变
std::vector<cv::Point2f> undistortedPoints;
cv::fisheye::undistortPoints(imagePoints, undistortedPoints, K, D);
// 求解PnP
cv::Mat rvec, tvec;
cv::solvePnP(objectPoints, undistortedPoints,
cv::Mat::eye(3,3,CV_64F), cv::noArray(), rvec, tvec);
// 特别注意: 调用该函数的方法和针孔相机不同,这里不显式输入相机内参数
return std::make_pair(rvec, tvec);
}
更多推荐




所有评论(0)