Eigen::Matrix<3,4,float>的setIdentity
时间: 2024-02-05 20:11:31 浏览: 131
Eigen::Matrix<3,4,float>是一个3行4列的矩阵,setIdentity()函数是将矩阵设置为单位矩阵的函数。因此,使用setIdentity()函数可以将Eigen::Matrix<3,4,float>矩阵设置为3x4的单位矩阵,代码如下:
```
Eigen::Matrix<3,4,float> mat;
mat.setIdentity();
```
这样就会创建一个名为mat的3x4的矩阵,并将其设置为单位矩阵。
相关问题
OpenGL补充修改下列代码Eigen::Matrix4f myLookAt(float ex, float ey, float ez, float atx, float aty, float atz, float upx, float upy, float upz) { Eigen::Matrix4f m; m.setZero(); mModelView *= m; return m; }
这段代码存在一些问题,需要进行修改和补充。根据OpenGL的标准视图变换函数gluLookAt()的功能,我们需要将眼睛坐标(ex, ey, ez)指向目标点(atx, aty, atz),并且指定上方向向量(upx, upy, upz)。从而生成一个视图矩阵,用于将场景中的对象变换到观察者视角下的坐标系。
修改后的代码如下所示:
```
Eigen::Matrix4f myLookAt(float ex, float ey, float ez, float atx, float aty, float atz, float upx, float upy, float upz) {
Eigen::Vector3f forward = Eigen::Vector3f(atx - ex, aty - ey, atz - ez).normalized();
Eigen::Vector3f up = Eigen::Vector3f(upx, upy, upz).normalized();
Eigen::Vector3f right = forward.cross(up).normalized();
up = right.cross(forward);
Eigen::Matrix4f m;
m << right.x(), up.x(), -forward.x(), 0.0f,
right.y(), up.y(), -forward.y(), 0.0f,
right.z(), up.z(), -forward.z(), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f;
Eigen::Matrix4f translation = Eigen::Matrix4f::Identity();
translation.col(3) << -ex, -ey, -ez, 1.0f;
m = m * translation;
mModelView *= m;
return m;
}
```
这里我们首先计算出视线方向向量、上方向向量和右方向向量,并将它们组合成一个旋转矩阵。然后我们再计算出平移矩阵,将眼睛位置平移到原点处。最后我们将视图矩阵m和模型视图矩阵mModelView相乘,更新模型视图矩阵,并返回视图矩阵m。
for (int camera_index = 0; camera_index < this->m_safe_camera_list.size(); ++camera_index) { camera* cam = &(this->m_safe_camera_list[camera_index]); if (cam->m_is_exter_calib_check_mark == true) { // as a Internal reference K of the camera, the K-1 is : // 1/ax 0 -px/ax // 0 1/ay -py/ay // 0 0 1 Eigen::Matrix3f invk; invk.setIdentity(); invk(0, 0) = 1.0 / cam->m_inter_calib(0, 0); invk(0, 2) = -1.0 * cam->m_inter_calib(0, 2) / cam->m_inter_calib(0, 0); invk(1, 1) = 1.0 / cam->m_inter_calib(1, 1); invk(1, 2) = -1.0 * cam->m_inter_calib(1, 2) / cam->m_inter_calib(1, 1); Eigen::Vector3f tmp_t_verts = cam->m_exter_calib.topRightCorner(3, 1); Eigen::Matrix3f tmp_inv_r_mat= cam->m_exter_calib.topLeftCorner(3, 3).transpose(); Eigen::Vector3f tmp_root_point = -tmp_inv_r_mat * tmp_t_verts; for (int pose_index = 0; pose_index < cam->m_2D_pose_list.size(); ++pose_index) { Eigen::MatrixXf pose = cam->m_2D_pose_list[pose_index]; // check the pose's Confidence, if all the joints's confidiance is smaller than the gain, drop out float confidence = pose.row(2).maxCoeff(); if (confidence < this->m_joint_confidence_gian) { continue; }; my_radials tmpradials; tmpradials.m_2d_pose = pose; tmpradials.m_root_point = tmp_root_point; tmpradials.m_radials_points = (invk * pose.topRows(2).colwise().homogeneous()).colwise().normalized(); tmpradials.m_radials_points = tmp_inv_r_mat * tmpradials.m_radials_points; tmpradials.m_3d_pose_ID = -1; tmpradials.m_camera_index = camera_index; tmpradials.m_poes_index = pose_index; tmpradials.m_pose_confidence = pose.row(2).leftCols(7).sum(); this->m_3d_radials.push_back(tmpradials); } } }
这段代码是一个 for 循环,遍历了一个名为 m_safe_camera_list 的相机列表。对于列表中的每个相机,如果其 m_is_exter_calib_check_mark 属性为 true,则进行以下操作:
1. 计算相机的内参矩阵 K 的逆矩阵 invk,其中 K 的值被存储在相机的 m_inter_calib 属性中;
2. 计算相机的外参矩阵 m_exter_calib 的逆矩阵的转置矩阵 tmp_inv_r_mat;
3. 根据 tmp_inv_r_mat 和 m_exter_calib 中的平移向量计算相机在世界坐标系下的位置 tmp_root_point;
4. 遍历相机 m_2D_pose_list 中的姿态,对于每个姿态:
- 检查该姿态的置信度是否大于设定的阈值 m_joint_confidence_gian,如果不是则跳过;
- 构建一个名为 tmpradials 的结构体,存储该姿态的相关信息,包括姿态的 2D 坐标、3D 坐标、相机索引、姿态索引等;
- 将 tmpradials 添加到名为 m_3d_radials 的结构体列表中。
整个代码的作用是将相机的 2D 姿态转换为 3D 姿态,并将结果存储在 m_3d_radials 中。
阅读全文