Jump to content
Compvision.ru
fotomer

Textured mesh перевести в geoTiff

Recommended Posts

Есть текстурированная сетка, как на картинке, координаты сетки отмасштабированны и привязаны в соответcтвии с GPS, т.е. openMVG извлекает GPS координаты из картинок, расчитывает масштаб, поворот, перенос для сетки и умножает все координаты на эти величины. Нужно из этой сетки сделать geoTiff, но как это сделать совершенно не понятно, поиск ничего особо не дает. OpenDroneMap делает перевод через какие-то свои хитрые форматы и использовать их затруднительно. Может у кого есть идеи как сделать geoTiff?

 

[img94068a88216c.jpg[/img]

  • Like 1

Share this post


Link to post
Share on other sites

gdal, вроде, для этого есть.

Share this post


Link to post
Share on other sites
55 минут назад, Nuzhny сказал:

gdal, вроде, для этого есть.

gdal вроде только для работы с растрами, к примеру OpenDroneMap сам генерит картинку и только потом в gdal подсовывает для создания geoTiff.

 

P.S. Вот еще картинка, над одной базой полетали

01fe1bfe4f84.jpg

Share this post


Link to post
Share on other sites

А к GPS как привязано? каждый узел сетки? или общий bbox?

Меня тоже интересует этот вопрос, по идее достаточно только gps bbox + высоты точки (altitude) чтобы получить pixel to gps.

 

gdal не работает с point cloud или mesh, для привязки растра к GPS координатам можно использовать Affine GeoTransform

http://www.gdal.org/gdal_datamodel.html

В итоге orthomap выглядит как то так:

https://habrastorage.org/web/629/0e3/521/6290e352148b43f384513357847c26db.tif

Фотки отсюда, можно на этом поэксперементировать.

https://github.com/OpenDroneMap/odm_data_bellus

Share this post


Link to post
Share on other sites
21 минуту назад, mrgloom сказал:

А к GPS как привязано? каждый узел сетки? или общий bbox?

Меня тоже интересует этот вопрос, по идее достаточно только gps bbox + высоты точки (altitude) чтобы получить pixel to gps.

В итоге orthomap выглядит как то так:

https://habrastorage.org/web/629/0e3/521/6290e352148b43f384513357847c26db.tif

В OpenMvg есть проект openMVG_main_geodesy_registration_to_gps_position, она может все точки пересчитывать или, сейчас посмотрел код, ищет bound. А что потом с этой границей делать, в Affine GeoTransform подставлять?

Я пересчитывал все точки, единственно потом OpenMvs не корректно работает с пересчитанными точками, т.е. изначально координаты около единицы и сетка получается хорошей, после gps пересчета координаты становятся по x,y,z около 5 млн, и сетка получается щербатой. Еще если будешь в OpenMvs считать сетку, ставь параметр min-point-distance вместо дефолтных 2 -> 10. Сетки практически не отличается, а время расчета в 5 раз меньше.

Скачал tif по ссылке, открыл програмкой PhotoMe, которая все теги смотрит, что-то инфы о GPS не видно, или вместе с geoTiff еще файлики с привязкой лежат?



 

 

 

Share this post


Link to post
Share on other sites

Не помню точно, геореференсед ли этот tiff, но судя по проекции (которая кстати выглядит не как вид сверху ), не знаю как она называется Geographic ?

может Model Tie Point это то?

exiftool raw output:

ExifTool Version Number         : 10.59
File Name                       : ortho.tif
Directory                       : .
File Size                       : 32 MB
File Modification Date/Time     : 2016:07:31 20:27:32+03:00
File Access Date/Time           : 2016:07:31 20:27:30+03:00
File Creation Date/Time         : 2016:07:31 20:27:10+03:00
File Permissions                : rw-rw-rw-
File Type                       : TIFF
File Type Extension             : tif
MIME Type                       : image/tiff
Exif Byte Order                 : Little-endian (Intel, II)
Image Width                     : 3694
Image Height                    : 4096
Bits Per Sample                 : 8 8 8 8
Compression                     : LZW
Photometric Interpretation      : RGB
Strip Offsets                   : (Binary data 1085 bytes, use -b option to extract)
Orientation                     : Horizontal (normal)
Samples Per Pixel               : 4
Rows Per Strip                  : 32
Strip Byte Counts               : (Binary data 875 bytes, use -b option to extract)
Planar Configuration            : Chunky
Extra Samples                   : Unassociated Alpha
Sample Format                   : Unsigned; Unsigned; Unsigned; Unsigned
Pixel Scale                     : 1.86495400739727e-006 1.4079864172345e-006 0
Model Tie Point                 : 0 0 0 -81.7080861843233 41.2293646671544 0
Geo Tiff Version                : 1.1.0
GT Model Type                   : Geographic
GT Raster Type                  : Pixel Is Area
Geographic Type                 : WGS 84
Geog Citation                   : WGS 84
Image Size                      : 3694x4096
Megapixels                      : 15.1

 

Думаю более точно можно посмотреть через gdalinfo, там должна быть информация Corner Coordinates и Origin

http://www.gdal.org/gdalinfo.html

 

Да, что то не то, возможно я когда то ресайзил его и тэги дропнулись.

gdalinfo ortho.tif
Driver: GTiff/GeoTIFF
Files: ortho.tif
Size is 689, 576
Coordinate System is `'
Metadata:
  TIFFTAG_DOCUMENTNAME=/tmp/ortho.tif
  TIFFTAG_SOFTWARE=GraphicsMagick 1.3.18 2013-03-10 Q8 http://www.GraphicsMagick.org/
Image Structure Metadata:
  COMPRESSION=LZW
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (    0.0,    0.0)
Lower Left  (    0.0,  576.0)
Upper Right (  689.0,    0.0)
Lower Right (  689.0,  576.0)
Center      (  344.5,  288.0)
Band 1 Block=689x2 Type=Byte, ColorInterp=Red
  Mask Flags: PER_DATASET ALPHA
Band 2 Block=689x2 Type=Byte, ColorInterp=Green
  Mask Flags: PER_DATASET ALPHA
Band 3 Block=689x2 Type=Byte, ColorInterp=Blue
  Mask Flags: PER_DATASET ALPHA
Band 4 Block=689x2 Type=Byte, ColorInterp=Alpha

 

Меня кстати больше интересует генерация geotiff из point cloud. И еще раз geotiff != orthomap?

Share this post


Link to post
Share on other sites
1 час назад, mrgloom сказал:

 

Меня кстати больше интересует генерация geotiff из point cloud. И еще раз geotiff != orthomap?

 

Да вот сам бы хотел узнать, текстурированная сетка хорошая получается, а с geoTiff как в стену уперся. Вот есть кое что https://gis.stackexchange.com/questions/121903/how-to-create-a-raster-tiff-dem-heightmap-from-a-mesh-of-xyz-points

Сейчас в OpenMVS в проекте TextureMesh увидел флаг "orthographic-image", вроде оно. Но проблема, как писал выше, что OpenMVS не хочет принимать для расчета из OpenMvg гео-привязанные точки, вернее принимает, но сетку строит совсем плохую. Вот для примера сетка с пересчитанными координатами в gps, видимо OpenMVS  эти миллионые xyz не нравятся. Можно конечно пересчитывать в gps уже готовую текстурированную сетку, но там уже надо разбираться как текстуры к этому отнесутся.

ply
format ascii 1.0
element vertex 18468
property double x
property double y
property double z
property uchar red
property uchar green
property uchar blue
end_header
2868760.9609218323603272 2166603.1702711693942547 5250982.6711078854277730 102 92 57
2868748.8379191830754280 2166593.4763295799493790 5250993.8941893931478262 113 93 60
2868680.0388088696636260 2166557.1158213810995221 5251048.8029191521927714 76 74 35
2868724.3026116066612303 2166636.2629922572523355 5250991.0214411308988929 136 123 81
2868657.8424244783818722 2166570.4558626487851143 5251056.5254463842138648 82 89 47
2868691.3514573448337615 2166634.9753469135612249 5251011.7093280144035816 184 155 123

 

Share this post


Link to post
Share on other sites

Можете описать весь pipeline что вы делаете? а то я OpenMVG/OpenMVS не пользовался.

 

Большие числа это похоже на ECEF, а не GPS.

 

По идее всё же можно сначала решить задачу генерации ортофотоплана (вид сверху), а потом через gdal варпнуть и загеореференсить (но надо еще как то получить матрицу афинного преобразование gps to pixel).

Share this post


Link to post
Share on other sites
3 часа назад, mrgloom сказал:

Можете описать весь pipeline что вы делаете? а то я OpenMVG/OpenMVS не пользовался.

OpenMVG генерит только разреженное облако точек и все. Также может импортировать это облако точек в разные форматы, в т.ч. и для OpenMVS .

OpenMVS  уже делает облако точек более плотным, делает по нему сетку и накладывает текстуру. При накладывании текстуры есть флажок сделать ортофото, но картинку странную выдает, вроде и вид сверху, но очень разреженный. Это вид производственно базы сверху, но только почему-то контуры зданий, попробовал поиграться настройками положения камеры, не помогло.

d9cf49a62de0.png

 

3 часа назад, mrgloom сказал:

Большие числа это похоже на ECEF, а не GPS.

Точно, ECEF. http://openmvg.readthedocs.io/en/latest/software/Geodesy/geodesy/

Но ECEF по идее можно в любую координату пересчитать.

 

3 часа назад, mrgloom сказал:

 

По идее всё же можно сначала решить задачу генерации ортофотоплана (вид сверху), а потом через gdal варпнуть и загеореференсить (но надо еще как то получить матрицу афинного преобразование gps to pixel).

 

GDAL может сразу сетку всасывать https://gis.stackexchange.com/questions/121903/how-to-create-a-raster-tiff-dem-heightmap-from-a-mesh-of-xyz-points

правда не ясно всосет ли GDAL текстуру.

Или второй путь пытаться привязать ортофото, но тоже много непонятного. Надо держать друг друга в курсе у кого что получится ибо инфы очень мало по этой теме.

Еще такая книжка есть Westra E. - Python Geospatial Development, Third Edition 2016.

 

Share this post


Link to post
Share on other sites

Итак небольшой апдейт

OpenMVS может сделать orthophoto и у вас не получается потому что не правильно выставлена нормаль, но как её найти это вопрос, возможно можно попробовать нормаль к геоиду? или нормаль к 'поверхности земли'. В целом же проект OpenMVS вроде как не про это.

https://github.com/cdcseacave/openMVS/issues/232

OpenMVG - возможно скоро появится такая функциональность.

https://github.com/openMVG/openMVG/issues/914

https://github.com/openMVG/openMVG/issues/978

Есть еще такое - идея нашлепать изображения в мозаику используя матрицу гомографии, не знаю насколько это только получится orthophoto.

https://github.com/openMVG/openMVG/issues/447

OpenDroneMap - судя по описанию как раз всё что нужно умеет, но я не пробовал, хочу попробовать под VM или docker. Использует внутри другой SFM 'движок' не OpenMVG.

https://github.com/OpenDroneMap/OpenDroneMap

Share this post


Link to post
Share on other sites
2 часа назад, mrgloom сказал:

Итак небольшой апдейт

OpenMVS может сделать orthophoto и у вас не получается потому что не правильно выставлена нормаль, но как её найти это вопрос, возможно можно попробовать нормаль к геоиду? или нормаль к 'поверхности земли'. В целом же проект OpenMVS вроде как не про это. https://github.com/cdcseacave/openMVS/issues/232

 

OpenMVG по GPS координатам может рассчитать масштаб, вращение и перенос точек для перевода в коорд. ECEF. Но координату ECEF типа 2868760.9609218323603272 нельзя передать в OpenMVS т.к. там используется тип float(всего 8 digits), а переделать на double там не вдруг. Для эксперимента я попробовал пересчитать сетку только с масштабом и вращением, без переноса т.к. перенос дает эти значащие 2868760. Но нормаль получается чуть наклоненной к плоскости и orthophoto получается как бы чуть сбоку, а не ровно сверху. По идее можно уже конечную сетку с текстурой пересчитать, но сохранится ли при этом наложение текстуры не известно. nOrthoMapResolution это размер в пикселях ортофото картинки.

По идее нормаль можно посчитать самим, с учетом высоты снимков получить осредненную плоскость. Но если сделать нормальный ортофото, то я до конца так и не понимаю как из него geoTiff сделать. Не в курсе, в geoTiff пиксели по высоте привязаны?

 

2 часа назад, mrgloom сказал:

OpenMVG - возможно скоро появится такая функциональность.

https://github.com/openMVG/openMVG/issues/914

Хм, а как они будут делать оротофото если у них только разреженное облако?

 

2 часа назад, mrgloom сказал:

OpenDroneMap - судя по описанию как раз всё что нужно умеет, но я не пробовал, хочу попробовать под VM или docker. Использует внутри другой SFM 'движок' не OpenMVG.

https://github.com/OpenDroneMap/OpenDroneMap

OpenDroneMap говорят сетку плохую делает и движек OpenSFM вроде похуже, иногда не собирает модели, OpenMVG типа стабильнее. DroneMap каша из Питоновских скриптов и exe, не удобно в отладке.

Еще OpenMVS по идее надо переписать в один exe т.к. при сохранении к примеру 50млн точек и последующей загрузке в другом exe тратится масса времени.

 

З.Ы. Производственная база на ортофото, видно что чуть сбоку.

3d896035ca4b.jpg

 

 

 

 

Share this post


Link to post
Share on other sites

Продолжаю копаться в ортофото. В openMVG пересчет координат из локальных в глобальные делается просто, берутся центры снимков локальные и глобальные из EXIF и передаются в Eigen::umeyama. Функция высчитывает R, T и S между подобными облаками точек. Пробовал на нескольких полетах, но точного вида сверху ни разу не вышло. Придется вручную считать нормаль, что-то типа перепендикулярная плоскость к высотам gps точек съемки.



 

Share this post


Link to post
Share on other sites
2 часа назад, mrgloom сказал:

В Photoscan кстати есть генерация DEM / Orthophoto from Dense cloud, не знаю как  по поводу качества, но по памяти это должно быть экономнее чем из меша.

http://www.agisoft.com/forum/index.php?topic=5357.0

По качеству будет явно хуже. Чуть выше кривоватое ортофото произв.базы 30000х25000 точек, при увеличении можно надпись на капоте легковушки рассмотреть, в плотном облаке эта надпись непонятное пятнышко. Интересно что Pix4D все надписи сильно мажет в отличие от MVS.

Еще интересно посмотреть как реализован алгоритм ортофото, там ведь кривизну Земли надо учитывать.

Share this post


Link to post
Share on other sites

а ODM может работать с фотками без gps? или в каком формате ему надо эту инфу подкладывать?

Как тест гоняю https://github.com/OpenDroneMap/odm_data_bellus

и там в exif должны быть gps данные

Пока у меня всё заканчивается на

 

Building objmodel:
    Saving model... done.
Whole texturing procedure took: 27.507s
�[94m[INFO]    Running ODM Texturing Cell - Finished�[0m
�[94m[INFO]    Running ODM Georeferencing Cell�[0m
�[92m[DEBUG]   None�[0m
�[93m[WARNING] No coordinates file. Generating coordinates file: /code/odm_georeferencing/coords.txt�[0m
�[93m[WARNING] Could not generate coordinates file. Ignore if there is a GCP file. Error: Error in OdmExtractUtm:
Image is missing GPS Latitude data
For more detailed information, see log file.
�[0m
�[93m[WARNING] Georeferencing failed. Make sure your photos have geotags in the EXIF or you have provided a GCP file. �[0m
�[93m[WARNING] Found a valid georeferenced model in: /code/odm_georeferencing/odm_georeferenced_model.ply�[0m
�[94m[INFO]    Running ODM Georeferencing Cell - Finished�[0m
�[94m[INFO]    Running ODM DEM Cell�[0m
�[92m[DEBUG]   running l2d_classify --help > /dev/null�[0m
�[94m[INFO]    Create DSM: False�[0m
�[94m[INFO]    Create DTM: False�[0m
�[94m[INFO]    DEM input file /code/odm_georeferencing/odm_georeferenced_model.las found: False�[0m
�[93m[WARNING] DEM will not be generated�[0m
�[94m[INFO]    Running ODM DEM Cell - Finished�[0m
�[94m[INFO]    Running ODM Orthophoto Cell�[0m
�[92m[DEBUG]   running /code/build/bin/odm_orthophoto -inputFile /code/odm_texturing/odm_textured_model.obj -logFile /code/odm_orthophoto/odm_orthophoto_log.txt -outputFile /code/odm_orthophoto/odm_orthophoto.png -resolution 20.0  -outputCornerFile /code/odm_orthophoto/odm_orthophoto_corners.txt�[0m
Error in OdmOrthoPhoto:
Argument '-logFile' has a bad value.
Traceback (most recent call last):
  File "/code/run.py", line 46, in <module>
    plasm.execute(niter=1)
  File "/code/scripts/odm_orthophoto.py", line 74, in process
    '-outputCornerFile {corners}'.format(**kwargs))
  File "/code/opendm/system.py", line 34, in run
    raise Exception("Child returned {}".format(retcode))
Exception: Child returned 1

 

Share this post


Link to post
Share on other sites

Я OpenDroneMap не собирал, т.к. на Винде пишу.  А будет ортофото без gps инфы делать сложно сказать, т.к. точки GPS дают плоскость в пространстве от которой можно плясать. Я ортофото сам закодил, вначале ищу gps точки с равной высотой, потом эти же точки, но полученные через SFM, апроксимирую плоскостью, потом нахожу матрицу вращения которая развернет эту плоскость перпендикулярно оси Z, и после openMVS делает хорошее ортофото, также рассчитываю GPS координаты углов картинки. По идее картинку с координатами углов нужно всунуть в GDAL и получить geoTiff. Но как это сделать конкретно я до сих пор не асилил, в GDAL столько параметров и координат что черт ногу сломит.

Такое ортофото пирамиды из первого поста в этой теме, Яндекс-карта https://yandex.ru/maps/?ll=37.066042%2C55.783674&z=17&l=sat%2Cskl

40278c00dec8.jpg

Share this post


Link to post
Share on other sites

Вот примерный код tiff -> geoTiff . Единственно не понятно как определить UTM зону и как размер ортофото на местности допустим 200х200м добавить к UTM. Сам UTM в метрах, но там есть какой-то масштабный коэффициент 0.9996.

string  pszFilename("Scene_dense_mesh_texture_orthomap.tif");
GDALDataset  *poSrcDS;
GDALAllRegister();
poSrcDS = (GDALDataset *)GDALOpen(pszFilename.c_str(), GA_ReadOnly);

.....

double adfGeoTransform[6] = { TopLeftX, WidthResolution, 0, TopLeftY, 0, HeightResolution };

const char *pszFormat = "GTiff";
GDALDriver *poDriver;
GDALDataset *dstDataset;
GDALAllRegister();
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
dstDataset = poDriver->CreateCopy("Scene_dense_mesh_texture_orthomap_gdal2.tif", poSrcDS, false, NULL, NULL, NULL);

OGRSpatialReference geographicRef;
geographicRef.SetWellKnownGeogCS("WGS84"); // standard WGS84 coordinate system
geographicRef.SetUTM( 37, TRUE );


char *pszDstWkt;
geographicRef.exportToWkt(&pszDstWkt);
dstDataset->SetProjection(pszDstWkt);
cout << pszDstWkt;

GDALSetGeoTransform(dstDataset, adfGeoTransform);

if (dstDataset != NULL) GDALClose((GDALDatasetH)dstDataset);        
if (poSrcDS != NULL) GDALClose((GDALDatasetH)dstDataset);

 

Share this post


Link to post
Share on other sites

т.е. affine transform правильный не совпадает только по масштабу?

В итоге что на вход идёт?

И проверяете вы как наложилось через что? через Google Earth?

 

У GDAL есть бинарники gdal-bin и еще python-gdal хотя там помоему другой функционал или частично пересечкающийся, на С/C++ наверно API пошире.

 

Share this post


Link to post
Share on other sites
2 часа назад, mrgloom сказал:

т.е. affine transform правильный не совпадает только по масштабу?

В openMVG_main_geodesy_registration_to_gps_position я сразу запрограммировал на разворот в соответствии с Север-Югом,  я брал самую западную GPS точку съемки и самую восточную, рассчитывал угол линии между ними и на этот же угол доворачивал SFM модель

2 постами выше  ортофото и ссылка на Яндекс-карты, там видно что развернуто верно. Т.е. в моем случае нужен только масштаб.

Верность geoTiff проверяю в gdalinfo и в QGIS, в последней сразу видно изменение координат под курсором. Но до конца у меня пока не получилось, координаты косячные в QGIS. Ну и определением UTM зоны остается вопрос, поиском ничего пока не нашел. Я на гео-форуме темку создал, но геологи ничего толкового не сказали ))) http://gis-lab.info/forum/viewtopic.php?t=23007

 

2 часа назад, mrgloom сказал:

У GDAL есть бинарники gdal-bin и еще python-gdal хотя там помоему другой функционал или частично пересечкающийся, на С/C++ наверно API пошире.

Потом через API буду пробовать XYZ сетку подсовывать чтоб карта высот получилась.

 

 

Update

WidthResolution =  MapWidth/pixelWidth;
HeightResolution =  MapHeight/pixelHeight;

double adfGeoTransform[6] = { TopLeftX2, WidthResolution2, 0, TopLeftY2, 0, -HeightResolution };

Вот так работает, QGIS расстояния правильно измеряет, совпадает с Яндекс-картами. MapWidth, MapHeight в метрах.

Share this post


Link to post
Share on other sites

Вот примерный вид картинок geoTiff, скриншоты из QGIS, карта OSM standart, видно что привязанные картинки совпадают с рельефом местности, на первой картинке дорожки, на второй линия забора и граница участка, на третьей река.

Snap2b.thumb.jpg.5e057f5ace92890c8ceddcb11e4c6f04.jpg

 

 

Snap3b.jpg

Snap4b.jpg

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×