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

ops/2025/1/11 21:28:53/
  • 操作系统: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= fx000fy0cxcy1
  • 参数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]

http://www.ppmy.cn/ops/149253.html

相关文章

Redis 安装与 Spring Boot 集成指南

安装 Redis 和将其与 Spring Boot 应用集成是构建高效缓存解决方案的常见步骤。以下是详细的指南&#xff0c;帮助你在本地环境中安装 Redis&#xff0c;并在 Spring Boot 项目中配置和使用它。 1. 安装 Redis Windows 环境 Redis 官方并不直接支持 Windows&#xff0c;但你…

自动驾驶领域的基础模型综述

论文地址&#xff1a;Forging Vision Foundation Models for Autonomous Driving: Challenges, Methodologies, and Opportunitie 0 Abstract 论文摘要解读 这篇论文讨论了**大规模基础模型&#xff08;Foundation Models&#xff09;在人工智能&#xff08;AI&#xff09;领…

Jmeter全流程性能测试实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 项目背景&#xff1a; 我们的平台为全国某行业监控平台&#xff0c;经过3轮功能测试、接口测试后&#xff0c;98%的问题已经关闭&#xff0c;决定对省平台向…

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…

分布式训练相关问题总结

1. 训练 大语言模型 存在哪些问题&#xff1f; 计算资源需求&#xff1a;训练大型语言模型需要大量的计算资源&#xff0c;包括高端 GPU、大量的内存和高速存储器。这可能限制了许多研究人员和组织的训练能力&#xff0c;因为这些资源通常很昂贵。数据需求&#xff1a;训练大型…

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

CAPL概述与环境搭建

CAPL概述与环境搭建 目录 CAPL概述与环境搭建1. CAPL简介与应用领域1.1 CAPL简介1.2 CAPL的应用领域 2. CANoe/CANalyzer 安装与配置2.1 CANoe/CANalyzer 简介2.2 安装CANoe/CANalyzer2.2.1 系统要求2.2.2 安装步骤 2.3 配置CANoe/CANalyzer2.3.1 配置CAN通道2.3.2 配置CAPL节点…