Получить кратчайший путь на карте .tiff

Я работаю со SLAM для создания среды. Я делаю это с помощью лидарного датчика, и он работает довольно круто. Теперь у меня есть карта окружающей среды в формате .tiff. Я хочу найти кратчайший путь (Дейкстра) от точки А до В, но моя проблема в том, что я не знаю, как преобразовать эту карту .tiff в формат, с которым я могу работать. Я кодирую на C ++.

У кого-нибудь есть идеи, как я мог это сделать?

Спасибо 🙂

редактировать:

карта выглядит так Черные пиксели — это препятствия, а серые — пространство для движения.

1

Решение

В качестве альтернативы, если вам разрешено тратить свои данные «Предполетной», вы могли бы использовать ImageMagick конвертировать ваш файл TIFF в очень простой файл PGM. ImageMagick устанавливается в большинстве дистрибутивов Linux и доступна для OSX и Windows.

Формат PGM очень прост и описан Вот. Поскольку ваше изображение 400х300, оно будет выглядеть так:

P5
400 300
255
120,000 unsigned char bytes of image data - uncompressed, unpadded

Вы должны конвертировать ваш файл TIFF следующим образом:

convert map.tif -normalize -threshold 1 map.pgm

а затем вы можете прочитать 3 строки заголовка, а затем непосредственно прочитать ваши 120000 байтов в массив. Таким образом, вам не нужны дополнительные библиотеки или программное обеспечение на вашей платформе.

введите описание изображения здесь

0

Другие решения

Я бы порекомендовал вам использовать CImgссылка здесь. Это 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
....
....

Установите флаги компиляции следующим образом, чтобы включить встроенную поддержку (без ImageMagick) для TIFF:

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

По вопросам рекламы [email protected]