OpenCV相机标定与3D重建(11)用于在图像上绘制世界坐标系的三条轴函数drawFrameAxes()的使用

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

算法描述

从姿态估计绘制世界/物体坐标系的轴。

cv::drawFrameAxes 是 OpenCV 库中的一个函数,用于在图像上绘制世界坐标系的三条轴(通常为X、Y和Z轴),这有助于可视化相机的姿态或物体的位置。此函数常用于增强现实、机器人视觉、3D重建等领域,以帮助理解或调试空间关系。

函数原型

cpp 复制代码
void cv::drawFrameAxes	
(
	InputOutputArray 	image,
	InputArray 	cameraMatrix,
	InputArray 	distCoeffs,
	InputArray 	rvec,
	InputArray 	tvec,
	float 	length,
	int 	thickness = 3 
)		

参数

  • 参数image 输入/输出图像。它必须有1或3个通道。通道数量不会被改变。
  • 参数cameraMatrix 输入的3×3 浮点数矩阵,表示相机的内参矩阵。 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 输入的畸变系数向量 ( k 1 , k 2 , p 1 , p 2 , k 3 \[ , k 4 , k 5 , k 6 \[ , s 1 , s 2 , s 3 , s 4 \[ , τ x , τ y ] ] ] ) (k_1, k_2, p_1, p_2, k_3\[, k_4, k_5, k_6\[, s_1, s_2, s_3, s_4\[, \\tau_x, \\tau_y]]]) (k1,k2,p1,p2,k3\[,k4,k5,k6\[,s1,s2,s3,s4\[,τx,τy]]]),包含4、5、8、12或14个元素。如果该向量为空,则假设畸变为零。
  • 参数rvec 旋转向量(见 Rodrigues 公式),与 tvec 一起将模型坐标系中的点转换到相机坐标系中。
  • 参数tvec 平移向量。
  • 参数length 绘制的轴的长度,单位与 tvec 相同(通常为米)。
  • 参数thickness 绘制的轴的线宽。

此函数绘制世界/物体坐标系相对于相机坐标系的轴。OX轴用红色绘制,OY轴用绿色绘制,OZ轴用蓝色绘制。

代码示例

cpp 复制代码
#include <opencv2/calib3d/calib3d.hpp>  // 确保包含了必要的头文件
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 假设我们已经有了以下参数
    Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 400, 0, 220, 0, 400, 140, 0, 0, 1 );  // 示例相机内参矩阵
    Mat distCoeffs   = Mat::zeros( 5, 1, CV_64F );                                       // 假设没有畸变或已校正

    // 示例旋转和平移向量(实际应用中这些应该通过姿态估计获得)
    Vec3d rvec( 0.01, 0.02, 0.03 );  // 旋转向量
    Vec3d tvec( 0.1, 0.2, 0.3 );     // 平移向量

    // 加载一张图片作为背景
    Mat image = imread( "/media/dingxin/data/study/OpenCV/sources/images/line.jpg" );  // 替换为你的图像路径
    if ( image.empty() )
    {
        cout << "Could not open or find the image!" << endl;
        return -1;
    }

    // 定义轴的长度(单位与 tvec 相同,通常是米)
    float axis_length = 0.1;

    // 绘制坐标轴
    drawFrameAxes( image, cameraMatrix, distCoeffs, rvec, tvec, axis_length );

    // 显示结果图像
    imshow( "Image with Axes", image );
    waitKey( 0 );  // 按任意键退出

    return 0;
}

运行结果

相关推荐
W_3260013 小时前
Python-OpenCV图像像素与通道:通道拆分合并、深浅拷贝
图像处理·人工智能·python·opencv·机器学习
欧特克_Glodon14 小时前
OpenCV计算机视觉开发入门与实践<十一>:矩阵的复制和矩形类Rect
c++·opencv·计算机视觉·矩阵
雪的季节15 小时前
OPENCV学习(补充1)
人工智能·opencv·学习
LateFrames17 小时前
3D Slicer 5.13 能力边界清单(87项)
3d·3d slicer
电子云与长程纠缠19 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 上
开发语言·学习·3d·ue5·游戏引擎
玖玥拾19 小时前
Unity3D RPG 入门项目(八)游戏设置面板、帧率控制、快捷技能药品栏、技能解锁系统
游戏·3d·unity·游戏引擎
W_3260019 小时前
Python-OpenCV图像滤波:卷积、高斯、中值、双边美颜滤波
开发语言·python·opencv
探索前端19 小时前
3dtiles加载时被地形遮挡问题研究及处理思路
前端·3d·cesium
AndrewHZ20 小时前
图像处理入门008 | 阶段总结:环境测试与基础概念测验
图像处理·python·opencv·计算机视觉·cv
进哥AI研习社2 天前
从像素到3D开放世界:Kimi K3在游戏开发中的引擎级能力实测
3d