相机位姿和相机外参定义以及它们的关系(画出相机位置)

最近研究相机,看一些相机位姿和相机外参,但总是将世界坐标系和相机坐标系进行记错,,也不理解什么是相机位姿和相机外参的关系,在实际应用中发现很多问题。所以这几天在实际应用中,重新对于相机坐标和世界坐标系的讨论和实践,然后整理了一下。
看了一下《视觉SLAM》,
相机位姿和相机外参定义以及它们的关系(画出相机位置)_第1张图片
画出相机在世界坐标系的位置和它的朝向代码(z轴就是朝向)如下:

void SaveCamPoseIntoOBJ(std::vector<Eigen::Matrix4f>& cams_pose, const std::string& path)
	{
		std::ofstream fh(path);
		int step_size = 1000;
		float step = 0.05;

		for (int i = 0; i < cams_pose.size(); ++i)
		{

			Eigen::Matrix3f R_wc = cams_pose[i].topLeftCorner(3, 3);
			Eigen::Vector3f T_wc = cams_pose[i].topRightCorner(3, 1);

			--------------------三根轴------------------------//
			//x轴
			Eigen::Vector3f local_x = R_wc.col(0);
			//y轴
			Eigen::Vector3f local_y = R_wc.col(1);
			//z轴
			Eigen::Vector3f local_z = R_wc.col(2);

			std::vector<Eigen::Vector3f> cam_x_local_pnts;
			std::vector<Eigen::Vector3f> cam_y_local_pnts;
			std::vector<Eigen::Vector3f> cam_z_local_pnts;

			for (int i = 0; i < step_size; ++i)
			{
				//x轴
				float x_x = T_wc(0) + i * step * local_x(0);
				float x_y = T_wc(1) + i * step * local_x(1);
				float x_z = T_wc(2) + i * step * local_x(2);
				Eigen::Vector3f tmp_x(x_x, x_y, x_z);
				cam_x_local_pnts.emplace_back(tmp_x);
				//y轴
				float y_x = T_wc(0) + i * step * local_y(0);
				float y_y = T_wc(1) + i * step * local_y(1);
				float y_z = T_wc(2) + i * step * local_y(2);
				Eigen::Vector3f tmp_y(y_x, y_y, y_z);
				cam_y_local_pnts.emplace_back(tmp_y);
				//z轴
				float z_x = T_wc(0) + i * step * local_z(0);
				float z_y = T_wc(1) + i * step * local_z(1);
				float z_z = T_wc(2) + i * step * local_z(2);
				Eigen::Vector3f tmp_z(z_x, z_y, z_z);
				cam_z_local_pnts.emplace_back(tmp_z);
			}
			for (int i = 0; i < step_size; ++i)
			{
				fh << "v " << cam_x_local_pnts[i](0) << " " << cam_x_local_pnts[i](1) << " " << cam_x_local_pnts[i](2) <<
					" " << 255 << " " << 0 << " " << 0 << std::endl;
				fh << "v " << cam_y_local_pnts[i](0) << " " << cam_y_local_pnts[i](1) << " " << cam_y_local_pnts[i](2) <<
					" " << 0 << " " << 255 << " " << 0 << std::endl;
				fh << "v " << cam_z_local_pnts[i](0) << " " << cam_z_local_pnts[i](1) << " " << cam_z_local_pnts[i](2) <<
					" " << 0 << " " << 0 << " " << 255 << std::endl;
			}
		}
		fh.close();
	}

计算得到的如下:
相机位姿和相机外参定义以及它们的关系(画出相机位置)_第2张图片
2,下面是相机参数定义:
相机位姿和相机外参定义以及它们的关系(画出相机位置)_第3张图片
3:相机外参和相机位姿的关系:

在这里插入图片描述
4:实践中的投影(从三维点投影到二维图像上)应用和画出相机(调试):

在这里插入图片描述

你可能感兴趣的:(c++,图形学,slam)