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];
}