首页 > 其他分享 >OpenCV相机标定与3D重建(53)解决 Perspective-3-Point (P3P) 问题函数solveP3P()的使用

OpenCV相机标定与3D重建(53)解决 Perspective-3-Point (P3P) 问题函数solveP3P()的使用

时间:2025-01-10 12:59:35浏览次数:3  
标签:tvecs Point 0.0 Solution 53 OpenCV Vector solveP3P P3P

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

根据 3 个 3D-2D 点对应关系找到物体的姿态。
cv::solveP3P 是 OpenCV 中的一个函数,用于解决 Perspective-3-Point (P3P) 问题。该问题的目标是根据给定的三个空间点(世界坐标系中的已知位置)及其对应的图像点(在图像平面上的位置),估计相机的姿态(旋转和平移)。这是计算机视觉和机器人学中一个经典的问题,常用于单目视觉定位、增强现实等领域。

函数原型


int cv::solveP3P
(
	InputArray 	objectPoints,
	InputArray 	imagePoints,
	InputArray 	cameraMatrix,
	InputArray 	distCoeffs,
	OutputArrayOfArrays 	rvecs,
	OutputArrayOfArrays 	tvecs,
	int 	flags 
)	

参数

  • 参数objectPoints 物体坐标空间中的物体点数组,格式为 3x3 的单通道或 1x3/3x1 的三通道。也可以传递 vector。
  • 参数imagePoints 对应的图像点数组,格式为 3x2 的单通道或 1x3/3x1 的双通道。也可以传递 vector。
  • 参数cameraMatrix 输入的相机内参矩阵 A = [ f x 0 c x 0 f y c y 0 0 1 ] A = \begin{bmatrix}f_x & 0 & c_x \\0 & f_y & c_y \\0 & 0 & 1\end{bmatrix} A= ​fx​00​0fy​0​cx​cy​1​ ​。
  • 参数distCoeffs 输入的畸变系数向量 (k1, k2, p1, p2 [,k3 [,k4, k5, k6 [,s1, s2, s3, s4 [,τx, τy]]]]),包含 4、5、8、12 或 14 个元素。如果该向量为空,则假设畸变为零。
  • 参数rvecs 输出的旋转向量(见 Rodrigues),与 tvecs 一起将模型坐标系中的点变换到相机坐标系中。一个 P3P 问题最多有 4 个解。
  • 参数tvecs 输出的平移向量。
  • 参数flags 解决 P3P 问题的方法:
    • SOLVEPNP_P3P 方法基于高小山、侯晓荣、唐建生、常华峰的论文 “Complete Solution Classification for the Perspective-Three-Point Problem” ([96])。
    • SOLVEPNP_AP3P 方法基于 T. Ke 和 S. Roumeliotis 的论文 “An Efficient Algebraic Solution to the Perspective-Three-Point Problem” ([141])。
      该函数根据 3 个物体点、它们对应的图像投影、相机内参矩阵和畸变系数估计物体的姿态。

注意
解按照重投影误差从小到大排序。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 定义世界坐标系中的3D点
    vector< Point3f > objectPoints = { Point3f( 0.0f, 0.0f, 0.0f ), Point3f( 1.0f, 0.0f, 0.0f ), Point3f( 0.0f, 1.0f, 0.0f ) };

    // 定义图像平面上的2D点
    vector< Point2f > imagePoints = { Point2f( 300.0f, 200.0f ), Point2f( 400.0f, 200.0f ), Point2f( 300.0f, 300.0f ) };

    // 定义相机内参矩阵
    Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 500, 0, 320, 0, 500, 240, 0, 0, 1 );

    // 定义畸变系数(假设无畸变)
    Mat distCoeffs = Mat::zeros( 5, 1, CV_64F );

    // 存储结果的旋转和平移向量
    vector< Vec3d > rvecs, tvecs;

    // 调用 solveP3P 函数
    int solutions = solveP3P( objectPoints, imagePoints, cameraMatrix, distCoeffs, rvecs, tvecs, SOLVEPNP_AP3P );

    // 打印结果
    cout << "Number of solutions: " << solutions << endl;
    for ( int i = 0; i < solutions; ++i )
    {
        cout << "Solution " << i + 1 << ":" << endl;
        cout << "Rotation Vector: " << rvecs[ i ] << endl;
        cout << "Translation Vector: " << tvecs[ i ] << endl;
    }

    return 0;
}

运行结果

Number of solutions: 4
Solution 1:
Rotation Vector: [0.126348, -0.108248, -0.00179646]
Translation Vector: [-0.195386, -0.390773, 4.88466]
Solution 2:
Rotation Vector: [0.0710923, 0.375849, 0.0164948]
Translation Vector: [-0.197736, -0.395471, 4.94339]
Solution 3:
Rotation Vector: [0, 0, 0]
Translation Vector: [-0.2, -0.4, 5]
Solution 4:
Rotation Vector: [-0.277914, -0.0306778, -0.00682145]
Translation Vector: [-0.198903, -0.397806, 4.97257]

标签:tvecs,Point,0.0,Solution,53,OpenCV,Vector,solveP3P,P3P
From: https://blog.csdn.net/jndingxin/article/details/145055829

相关文章

  • OpenCV插值运算---记录贴
    在Qt中结合OpenCV进行线性插值,并将3x3的数据扩展为15x15的图像显示,步骤可以分为以下几步:1.安装OpenCV2.创建3x3数据并进行线性插值我们可以使用OpenCV的cv::resize函数来执行线性插值,并且可以选择将数据从3x3转换为15x15。3.转换为图像并显示使用QI......
  • P5360
    有点牛的题。一个可能比较前置的技巧是LCT维护MST的方法,具体来说就是加边的时候,如果两边原本就是连通的,那么就把路径上的最大边权拿出来和要加的边进行比较,选择更优的那一个。这个技巧启示我们,在MST中只有任意两点的路径的最大边权是重要的,并且两张图的MST是支持进行合并......
  • SpringBoot热贡文化艺术展示与定制平台a537e(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,分类,艺术品开题报告内容一、选题背景与意义随着社会的进步和人们生活水平的提高,对文化艺术展示与定制的需求日益增加。热贡文化作为青海省黄南藏族自治州......
  • PCL点云库入门——PCL库点云特征之FPFH点快速特征直方图(Fast Point Feature Histogram
    1、FPFH原理        快速点特征直方图(FastPointFeatureHistograms,简称FPFH)是对PFH(PointFeatureHistograms)计算方法的一种简化,具体内容看参考十四节内容。该方法的核心在于独立计算查询点的K邻域内每个点的简化点特征直方图(SimplifiedPointFeatureHistogram,简......
  • OpenCV 4.5至4.10版本更新概述
    OpenCV4.5至4.10版本更新概述OpenCV从4.5到4.10版本的更迭中,每个版本都引入了新功能、优化和修复。以下是主要版本的更新内容概述:OpenCV4.5.x系列4.5.0(2020年10月)新增对YOLOv4的支持。引入DNN模块的改进,包括对ONNX和TensorFlow的更好支持。增加了对......
  • 1539. Kth Missing Positive Number
    Givenanarray arr ofpositiveintegerssortedina strictlyincreasingorder,andaninteger k.Return the kth positive integerthatis missing fromthisarray.Example1:Input:arr=[2,3,4,7,11],k=5Output:9Explanation:Themissingpositive......
  • OpenCV安装教程
    在OpenCV官方网站可以下载最新的且完整的源码以及大部分的release版本源码。安装现在,OpenCV使用Git作为版本管理工具,使用Cmake来构建工程。在早些时候,OpenCV开发者使用Subversion作为版本管理工具以及automake来构建工程项。当然,这些日子都一去不复返了。在......
  • 【OpenCV编译教程】VS2017+OpenCV环境配置
    下载安装visualstudio、下载安装OpenCV(安装教程)后,需要在项目中配置OpenCV。步骤1:打开VisualStudio2017,创建一个新的C++项目或打开现有项目。步骤2:点击“视图”菜单,选择“其他窗口”>“属性管理器”,打开属性管理器窗口,如图1所示。图1步骤3:双击指定运行环境,打开配......
  • 【游戏设计原理】53 - 解决问题的障碍
    1.分析并总结原理核心观点游戏本质是一系列问题解决的过程,通过设计巧妙的问题和决策场景,游戏能激发玩家的兴趣和投入感。然而,当问题解决的过程被阻碍时,会降低玩家的体验甚至让他们放弃游戏。文中提到的四种障碍反映了玩家在面对复杂问题时可能遇到的心理和认知问题:功能......
  • P11531 [THUPC2025 初赛] 检查站
    检查站题目链接。Problem小I是一个巨大的铁路公司的主管,他管理着\(n\)个火车站,用\(1\)至\(n\)的整数给它们编号。铁路公司有\(c\)个分部,第\(i\)个分部的办公室位于火车站\(p_i\)。可能有火车站没有分部办公室,一个火车站也有可能有多个分部办公室。\(n\)个火车站......