我正在使用SLAM构建环境。我使用激光雷达传感器来做这件事,它的工作非常酷。现在我有一个.tiff格式的环境地图。我想找到从A点到B点的最短路径(Dijkstra),但我的问题是我不知道如何以我可以使用的格式转换这个.tiff地图。我用C ++编写代码。
有人知道我该怎么做吗?
谢谢:)
编辑:
map看起来像这样。黑色像素是障碍物,灰色像素是移动的空间。
答案 0 :(得分:1)
我建议您使用CImg
- link here。它是C ++,非常轻巧,易于使用,因为它实现为“仅限标题” - 因此您只需下载并包含单个文件CImg.h
即可开始使用。
此代码将读取您的TIF地图并允许您访问像素:
#include <iostream>
#include "CImg.h"
using namespace std;
using namespace cimg_library;
int main(int argc, char** const argv)
{
// Load the map
CImg<unsigned char> map("map.tif");
// Get and print its dimensions
int w = map.width();
int h = map.height();
cout << "Dimensions: " << w << "x" << h << endl;
// Iterate over all pixels displaying their RGB values
for (int r = 0; r < h; r++){
for (int c = 0; c < w; c++){
cout << r << "," << c << "=" << (int)map(c,r,0,0) << "/" << (int)map(c,r,0,1) << "/" << (int)map(c,r,0,2) << endl;
}
}
return 0;
}
示例输出
Dimensions: 400x300
0,0=94/94/94
0,1=100/100/100
0,2=88/88/88
0,3=89/89/89
0,4=89/89/89
0,5=89/89/89
0,6=89/89/89
0,7=89/89/89
0,8=89/89/89
0,9=89/89/89
0,10=89/89/89
0,11=89/89/89
0,12=89/89/89
0,13=89/89/89
0,14=89/89/89
0,15=93/93/93
0,16=101/101/101
....
....
设置这样的编译标志,以包含TIFF的内置支持(不带ImageMagick):
g++ -Dcimg_use_tiff ... -ltiff
您需要安装lib tiff
。
如果您对颜色不感兴趣,可以将图像转换为黑白图像,这样它只是一个通道而不是三个通道,并将其设置为阈值,这样您就可以更容易处理纯黑色和纯白色。只需在上面的代码末尾添加此代码:
// Convert to single channel black and white
CImg<unsigned char> bw = map.get_RGBtoYCbCr().channel(0);
bw.normalize(0,255).threshold(1).normalize(0,255);
// Now get pointer to black and white pixels, or use bw(x,y,0)
unsigned char* data=bw.data();
bw.save_png("result.png");
dijkstra
实际上有一个CImg
方法,但我目前无法弄清楚如何使用它 - 如果有人知道,请在评论中标记我!感谢。
答案 1 :(得分:0)
作为替代方案,如果您允许您的数据“飞行前”,您可以使用 ImageMagick 将您的TIFF文件转换为极其简单的PGM文件。 ImageMagick 安装在大多数Linux发行版上,可用于OSX和Windows。
PGM格式非常简单,并且描述为here。由于您的图像是400x300,它将如下所示:
P5
400 300
255
120,000 unsigned char bytes of image data - uncompressed, unpadded
您可以像这样转换您的TIFF文件:
convert map.tif -normalize -threshold 1 map.pgm
然后您可以读取3行标题,然后直接将120,000个字节读入数组。这样,您就无需在平台上使用额外的库或软件。