DroneDev 专题,关注无人机软件项目开发,拓展无人机更多的可能性。
当你驾轻就熟地用无人机拍摄了某个地区的航拍图像后,除了分享到微信朋友圈里,还可以做些什么呢?或许 OpenDroneMap 能助你开启思路。
OpenDroneMap 是一个开源的航拍图像处理工具,可以把航拍图像进行点云、正射影像和高程模型等转换处理。
一般的无人机用的都是「傻瓜式」的相机,其实这跟你用手机或普通数码相机拍的没差,只是拍摄的角度不一样而已。它们拍出来的照片都是非量测影像(non-metric imagery),而 OpenDroneMap 则可以将这些非量测影像转换成三维地理建模数据,并应用在地理信息系统中。
具体而言,OpenDroneMap 可以将航拍图像处理为下面几种格式的数据:
- 点云(Point Clouds)
- 纹理数字表面建模(Textured Digital Surface Models)
- 正射校正影像(Orthorectified Imagery)
- 数字高程模型(Digital Elevation Models)
- ……
使用方法
OpenDroneMap 支持 Docker,这意味着你可以在不同的操作系统上运行 OpenDroneMap。下面以 Mac OS 为例,介绍 OpenDroneMap 的使用方法。
1、安装 Docker CE
到 Docker 官网 https://docs.docker.com/engine/installation/ 找到并下载适用于你所使用的操作系统的 Docker CE 版本(Docker EE 是企业版,暂时用不上)。经过「傻瓜式」的安装后,可以在 Terminal 上输入 docker --version
检验 Docker 是否安装成功。
2、下载 OpenDroneMap 的镜像
确认 Docker 成功安装后,在 Terminal 上输入以下指令:
docker pull opendronemap/opendronemap
Docker 就会从 Docker Hub 中下载 OpenDroneMap 的镜像到本地中。为提高下载速度,建议提前使用 Proxifier 之类的工具(建议自行 Google)让 Terminal 走上代理道路。镜像下载完成后,在 Terminal 输入 docker images
指令,就能查看到刚才下载的 OpenDroneMap 的镜像了。
3、创建文件目录
在 Finder 上任意一目录新建一个名为 images 的文件夹,作为待处理图片的存放位置。我的习惯是以「项目名 / images」的方式来对目录进行命名,这样能更直观地管理文件。比如:
//odm_test_1/images
//odm_test_2/images
接下来,就需要把你需要进行处理的航拍影像拷贝到 images 文件夹中了,如果你暂时没有这些航拍图像的话,可以在 https://github.com/OpenDroneMap/odm_data 上下载范例素材。
我在网站上下载了「aukerman」素材的图像文件,这个范例素材似乎是对某个绿化公园连续拍摄的航拍图像,查看每个图像文件的 info(Command + I),都能找到它的经纬度信息。我们可以用 OpenDroneMap 对这些文件进行「正射影像(拼接)」和「纹理网面建模」的处理。
4、运行 OpenDroneMap
在航拍图像文件拷贝到 images 目录以后,打开 Terminal 并定位到项目文件夹(比如 odm_test_1)中,执行以下指令:
docker run -it --rm \
-v $(pwd)/images:/code/images \
-v $(pwd)/odm_orthophoto:/code/odm_orthophoto \
-v $(pwd)/odm_texturing:/code/odm_texturing \
opendronemap/opendronemap
指令的作用是:通过 OpenDronMap 对 odm_test_1/images 目录下的图像文件同时进行「正射影像(odm_orthophoto)」和「纹理网面建模(odm_texturing)」的图像处理(作为测试,为了节省时间,你可以只选取 odm_orthophoto 或 odm_texturing 其中一种处理方式):
指令解释:
docker run -it --rm
Docker 的运行指令。-it 指让 Docker 分配一个伪输入终端并以交互模式运行容器;--rm 是指在容器运行完之后自动清除以节省电脑存储空间。
-v $(pwd)/images:/code/images
-v 是用来将本地目录绑定到容器中的,在本例子中,是让 OpenDroneMap 知道待处理的照片在哪里;冒号前面,代表的是本地 images 路径,其中 (pwd) 代表当前 Teminal 定位目录的绝对路径,你可以更改为其他目录的绝对路径;冒号后面,是指容器的路径,这个是不能更改的。
-v $(pwd)/odm_orthophoto:/code/odm_orthophoto
这行指令,是指希望使用 OpenDroneMap 对图像文件进行怎么样的处理,你可以根据项目的需要,输入不同的处理指令,OpenDroneMap 提供了以下几种处理方式:
- odm_meshing # 3D 网面建模
- odm_texturing # 纹理网面建模
- odm_georeferencing # 地理配准后的点云图
- odm_orthophoto # 正射影像图
opendronemap/opendronemap
这是指明需要调用的镜像,这里是调用 Repository 为 opendronemap/opendronemap 的镜像,可以用该镜像的 tag(如果有设置的话)和镜像 ID 替代。
5、查看结果
指令执行后,就交给程序去处理了。运行时间可能会稍长,请耐心等候,一切顺利的话,Terminal 就会下面的提示:
然后在项目的文件夹中(比如 odm_test_1),就能在 odm_orthophoto 和 odm_texturing 目录中看到对应的输出结果了。
正射影像的输出结果的 png 预览图:
或许有朋友会说,最后还不是一张常见的无人机俯视航拍图,但其实 odm_orthophoto 的输出结果还有一个后缀为 tif 的 GeoTIFF 文件,这可以应用在 QGIS 上作为光栅图层,供地理信息分析之用(比如实现地图的修测更新)。
小结
上述教程中的 GIS 术语可能翻译得不够到位,如有不妥的地方望请指出。
整体来说,有 docker 这样的工具能很大程度上减少配置开发环境的时间,也简化了不少的操作步骤,不过需要注意的是 OpenDroneMap 的项目还是挺占用电脑空间的,所以在操作之前,最好能确保电脑有足够的剩余空间。
上面的例子采用的是范例素材的航拍图像,如果要实际应用到自己的项目中,则需要自己使用无人机,结合相关软件的航线规划和定时拍摄功能,对某一个地区进行连续拍摄,将拍摄的图像文件导入到「images」文件夹中,再按教程步骤执行就能实现数据处理了。
此外,Docker 也有 Windows 版本,把教程中 Terminal 的操作换成 Windows 系统的 Cmd,或许也能实现(没有尝试过,不敢打包票)。