undistorted_points()
时间: 2024-04-06 15:30:26 浏览: 62
`undistorted_points` 是一个 `cv::Mat` 类型的矩阵,存储了畸变校正后的图像坐标系下的点云信息。在这段代码中,`undistorted_points` 被用于进行规范化处理,即将其转换为齐次坐标系下的形式。
`undistorted_points` 矩阵可以使用 `()` 运算符来访问其元素。具体来说,`undistorted_points(cv::Rect(0, 0, rows * cols, 1))`、`undistorted_points(cv::Rect(0, 1, rows * cols, 1))` 和 `undistorted_points(cv::Rect(0, 2, rows * cols, 1))` 分别表示 `undistorted_points` 矩阵中的第一行、第二行和第三行的子矩阵。这里使用子矩阵是为了方便地对 `undistorted_points` 矩阵中的每一行进行操作。
例如,`undistorted_points(cv::Rect(0, 0, rows * cols, 1)) /= undistorted_points(cv::Rect(0, 2, rows * cols, 1))` 表示将 `undistorted_points` 矩阵中的第一行的所有元素都除以第三行对应位置上的元素,以实现第一行的规范化处理。
相关问题
cv::split(undistorted_points_temp, channels); cv::merge(channels, undistorted_mat);中undistorted_points_temp=undistorted_mat?
不是,undistorted_points_temp 和 undistorted_mat 是两个不同的矩阵。
cv::split(undistorted_points_temp, channels) 将 undistorted_points_temp 矩阵拆分成多个通道,存储在名为 channels 的 vector 中,而不是 undistorted_mat。
cv::merge(channels, undistorted_mat) 将 channels 中的通道合并成一个矩阵 undistorted_mat,而不是 undistorted_points_temp。
// from ground points to undistorted points via Homography cv::Mat undistorted_points = cv::Mat::ones(3, rows * cols, CV_64FC1); undistorted_points = H.inv() * ground_points; // 由单应性矩阵获取矫正图上的点
这段代码是用于将地面坐标系下的点云矩阵 `ground_points` 转换为畸变校正后的图像坐标系下的点云矩阵 `undistorted_points`。具体来说,该代码首先创建一个与 `ground_points` 矩阵大小相同的矩阵 `undistorted_points`,并将其所有元素初始化为 1,数据类型为 CV_64FC1(即 64 位单通道浮点数)。
然后,通过计算地面坐标系到畸变校正后的图像坐标系的变换矩阵的逆矩阵 `H.inv()`,将地面坐标系下的点云矩阵 `ground_points` 转换为畸变校正后的图像坐标系下的点云矩阵 `undistorted_points`。该转换同样通过矩阵乘法实现,即 `undistorted_points = H.inv() * ground_points`。
需要注意的是,由于 `ground_points` 和 `undistorted_points` 矩阵均为 3x(rows*cols) 的矩阵,因此它们可以在矩阵乘法中相乘。此外,由于 `H.inv()`、`ground_points` 和 `undistorted_points` 矩阵中的数据类型均为双精度浮点数,因此在计算矩阵乘法时不会产生数据类型转换的问题。
阅读全文