costmap和OpenCV的坐标关系

costmap和OpenCV的坐标系关系
costmap原点在左下角,OpenCV图片的原点在左上。

cv::Mat map_mat = cv::Mat(m_y, m_x, CV_8U);type经常设置为CV_8U,无符号整数 0~255,Mat代表矩阵,该类声明在头文件opencv2/core/core.hpp。对(行,列)元素访问、赋值常使用m.at<类型>(行,列);

OpenCV的黑白图像是二维数组,255是白色,0是黑色. 数组中每个元素就是图像对应位置的像素值,数组索引、像素行列、像素坐标关系如下:

  • 数组行索引 = 像素所在行数 - 1 = 像素纵坐标
  • 数组列索引 = 像素所在列数 - 1 = 像素横坐标

在ROS中的地图像素扫描方向是从左下角向右上角扫描的。resolution表示地图上一个像素宽度代表实际的距离(通常为0.05,代表一个像素代表5cm*5cm),costmap的本质是栅格地图,其示意图如下:

OpenCV的图相当于costmap先逆时针转180°,再对y轴取对称。

1
2
3
4
5
6
7
8
9
10
11
// pgm的像素值,或者说保存方式和OpenCV是一样的
costmap_->saveMap("/home/user/costmap.pgm");

// 范围 0~255
cv::Mat map_mat = cv::Mat(m_y, m_x, CV_8U);

for (int x = 0; x < map_mat.cols; x++)
for (int y = 0; y < map_mat.rows; y++)
{
map_mat.at<uint8_t>(map_mat.rows -1 - y, x) = 255 - costmap_->getCharMap()[ y * map_mat.cols + x];
}