【opencv】教程代码 —features2D(7)根据单应性矩阵估计相机坐标系下的物体位姿...

本文介绍了如何使用OpenCV库从图像中识别棋盘角点,通过计算和校正,确定它们在世界坐标系中的位置,并利用摄像机内参进行姿态估计。过程包括找角点、校正、单应性矩阵估计和旋转矩阵优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pose_from_homography.cpp从图像中找到棋盘角点并进行姿态估计

从图像中找到棋盘角点并显示

计算角点在世界坐标系中的位置

读取相机内参和畸变系数并校正图像中的角点

计算从3D点到2D点的单应性矩阵

通过奇异值分解(SVD)优化对旋转矩阵的估计

基于单应矩阵分解及其优化结果,估计姿态,绘制世界坐标系

923cc5161ab66f142a28864271ea89dd.png

8a72ea7d86a383a373f5df60b23f3d47.png

65564d5f22cb9a111987302afca0135d.png

#include <iostream>                         // 包含标准输入输出头文件
#include <opencv2/core.hpp>                 // 包含OpenCV核心功能的头文件
#include <opencv2/imgproc.hpp>              // 包含OpenCV图像处理功能的头文件
#include <opencv2/calib3d.hpp>              // 包含OpenCV摄像机标定和3D重建的头文件
#include <opencv2/highgui.hpp>              // 包含OpenCV图像显示功能的头文件


using namespace std;                        // 使用命名空间std,避免每次使用标准库时都要加std::
using namespace cv;                         // 使用命名空间cv,避免每次调用OpenCV函数时都要加cv::


namespace                                   // 匿名命名空间,内部的变量和函数仅在本文件内有效
{
enum Pattern { CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID }; // 枚举类型Pattern,代表不同的标定板类型


// 计算棋盘角点的函数
void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners, Pattern patternType = CHESSBOARD)
{
    corners.resize(0);                      // 清空角点向量


    switch (patternType)                    // 根据不同的标定板类型进行计算
    {
    case CHESSBOARD:
    case CIRCLES_GRID:
        //! [compute-chessboard-object-points]
        for( int i = 0; i < boardSize.height; i++ )
            for( int j = 0; j < boardSize.width; j++ )
                corners.push_back(Point3f(float(j*squareSize), // 将每个角点的3D位置按行和列添加到corners向量中
                                          float(i*squareSize), 0));
        //! [compute-chessboard-object-points]
        break;


    case A
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值