对于针孔相机,解算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);
}

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐