OpenCV相机标定与3D重建(23)用于在图像上绘制世界坐标系的三条轴函数drawFrameAxes()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
从姿态估计绘制世界/物体坐标系的轴。
cv::drawFrameAxes 是 OpenCV 库中的一个函数,用于在图像上绘制世界坐标系的三条轴(通常为X、Y和Z轴),这有助于可视化相机的姿态或物体的位置。此函数常用于增强现实、机器人视觉、3D重建等领域,以帮助理解或调试空间关系。
函数原型
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轴用蓝色绘制。
代码示例
#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;
}