pose_from_homography.cpp从图像中找到棋盘角点并进行姿态估计
从图像中找到棋盘角点并显示
计算角点在世界坐标系中的位置
读取相机内参和畸变系数并校正图像中的角点
计算从3D点到2D点的单应性矩阵
通过奇异值分解(SVD)优化对旋转矩阵的估计
基于单应矩阵分解及其优化结果,估计姿态,绘制世界坐标系
#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