欢迎查阅EasyIDP官方文档#

header_v2.0.png

EasyIDP(中间数据处理助手)是一个处理三维重建(Metashape和Pix4D)产品上兴趣区域(ROI)的软件包(主要是农业应用),提供如下的功能:

  • 把ROI逆投影回原始图片上

  • 在正射地图(DOM)、高程图(DSM)和点云上把ROI切出来

  • 把切块后的结果保存为对应文件格式

PyPI - Python Version GitHub GitHub top language GitHub Downloads Pypi downloads

其他语言

这是一个多语言文档,你可以通过这里或左下角切换语言

备注

EasyIDP中使用(水平轴, 垂直轴, 维度/深度)顺序作为坐标顺序。当坐标为地理信息坐标时,对应(经度,纬度,海拔/高度)。

举些栗子#

快速开始#

可以通过PyPi来安装:

pip install easyidp

备注

如果你在pypi版本中遇到了Bug,请考虑使用最新版的源码。使用教程可以参考这个链接:使用源码.

然后在你的python环境中导入包:

import easyidp as idp

小心

在执行下面的示例代码前,请确保基本理解了Metashape或Pix4D的图像三维重建的工作流程,并且知道如何导出地图(DOM和DSM的tiff文件格式)和点云(ply文件格式)。并且知道一些基本的GIS矢量文件(shp)的格式与制作方法。

1. 读取ROI#

roi = idp.ROI("xxxx.shp")  # lon and lat 2D info

# get z values from DSM
roi.get_z_from_dsm("xxxx_dsm.tiff")  # add height 3D info

二维的ROI可以用来切正射地图、高程图和点云(参考 2. 切ROI )。三维点ROI可以用来逆投影回原始图片上(参考 4. 逆投影 )。

小心

强烈推荐保证shapefile文件和geotiff文件的地理坐标系(CRS)一致,EasyIDP内置的转换算法可能会有一定的精度损失。

  • 推荐使用UTM地理坐标系(WGS 84 / UTM grid system),该坐标系的XY轴单位是米,方便后续计算且经过开发者的验证。

  • 也支持传统的经纬度坐标系,如EPSG4326。但是当你需要计算距离的场景下不推荐使用因为它的单位是度。

  • 特定国家内部的特殊坐标系,如北京54(BJZ54), 2000国家大地坐标系(CGCS2000), 日本測地系2011(JDG2011)等,没有经过测试且难以保证可用性。如果遇到任何问题,建议使用GIS软件先转换成UTM坐标系。

可接受的ROI类型仅为多边形类型(网格是一种多边形的特殊形式),并且每个多边形ROI的尺寸应该可以被完整的包含进单张原始照片(推荐最佳大小约为原始图片的1/4)

ROI类型

第四个可能太大了,没法被涵盖进单张照片里,推荐使用更小的多边形。#

2. 切ROI#

读取正射地图和高程图文件

dom = idp.GeoTiff("xxx_dom.tif")
dsm = idp.GeoTiff("xxx_dsm.tif")

读取点云文件

ply = idp.PointCloud("xxx_pcd.ply")

把兴趣区域(ROI)切出来:

dom_parts = roi.crop(dom)
dsm_parts = roi.crop(dsm)
pcd_parts = roi.crop(ply)

如果你想在切的时候,顺便保存切块的结果:

dom_parts = roi.crop(dom, save_folder="./crop_dom")
dsm_parts = roi.crop(dsm, save_folder="./crop_dsm")
pcd_parts = roi.crop(ply, save_folder="./crop_pcd")

3. 读取重建项目#

可以单独添加一块重建的样地或者使用批处理添加。

Metashape项目本身支持使用不同的块(chunk)来实现在一个项目中(*.psx)创建不同的重建样地,所以需要使用 chunk_id 来指定处理哪一个样地。

ms = idp.Metashape("xxxx.psx", chunk_id=0)

小心

尽管这边只给了 xxxx.psx 项目文件参数,但其实Metashape自动生成的 xxxx.files 同名文件夹更加重要。请把他们两个放在同一个路径下。

目前,EasyIDP尚不支持从元信息中获取原始图片的文件夹路径,所以如果需要进行逆投影,请手动指定 raw_img_folder 原始图片文件夹的路径

p4d = idp.Pix4D(project_path="xxxx.p4d",
                raw_img_folder="path/to/folders/with/raw/photos/",
                # optional, in case you changed the pix4d project folder
                param_folder="path/to/pix4d/parameter/folders")

小心

尽管这边只给了 xxxx.p4d 项目文件参数,但其实Pix4D自动生成的 xxxx 同名文件夹更重要。请把他们两个放在同一个路径下,并且不推荐调整该文件夹内部的文件。

4. 逆投影#

img_dict = roi.back2raw(chunk1)

然后检查运算结果:

# find the raw image name list
>>> img_dict.keys()
dict_keys(['DJI_0177', 'DJI_0178', 'DJI_0179', 'DJI_0180', ... ]

# the roi pixel coordinate on that image
>>> img_dict['DJI_0177']
array([[ 779,  902],
       [1043,  846],
       [1099, 1110],
       [ 834, 1166],
       [ 779,  902]])

保存反投影的图片结果:

img_dict = roi.back2raw(ms, save_folder="folder/to/put/results/")
img_dict = roi.back2raw(p4d, save_folder="folder/to/put/results/")

5. 正投影#

This function support bring results and image itself from corresponding raw images to geotiff.

小心

The following features have not been supported.

请使用下面的代码来把原始图正投影到正射影像DOM上( raw forward dom 缩减为 raw4dom

该特性尚未支持

imarray_dict = roi.raw4dom(ms)

这是一个包含使用每个ROI的编号作为键值的图片字典,把原始图上对应部位的图片投影到正射影像DOM上。

>>> geotif = imarray_dict['roi_111']
>>> geotif
<class 'easyidp.geotiff.GeoTiff'>

也可以把原始图上检测到的结果正投影到正射影像上,多边形顶点会使用地理坐标。在做这件事之前,请先准备检测的结果(通过深度学习的检测或分割得到的,顶点为像素坐标)

result_on_raw = idp.roi.load_results_on_raw_img(r"C:/path/to/detected/results/folder/IMG_2345.txt")

然后使用下面的函数把两个都进行正投影:

>>> imarray_dict, coord_dict = roi.raw4dom(ms, result_on_raw)
>>> coord_dict['roi_111']
{0: array([[139.54052962,  35.73475194],
           ...,
           [139.54052962,  35.73475194]]),
 ...,
 1: array([[139.54053488,  35.73473289],
           ...,
           [139.54053488,  35.73473289]]),

保存单个ROI为单个GeoTiff文件

>>> geotif = imarray_dict['roi_111']
>>> geotif.save(r"/file/path/to/save/geotif_roi_111.tif")

批量保存每个ROI为单个GeoTiff文件

>>> imarray_dict = roi.raw4dom(ms, save_folder="/path/to/save/folder")

参考资料#

发表论文#

如果您的研究受益于该项目,请引用我们的论文:

@Article{wang_easyidp_2021,
AUTHOR = {Wang, Haozhou and Duan, Yulin and Shi, Yun and Kato, Yoichiro and Ninomiya, Seish and Guo, Wei},
TITLE = {EasyIDP: A Python Package for Intermediate Data Processing in UAV-Based Plant Phenotyping},
JOURNAL = {Remote Sensing},
VOLUME = {13},
YEAR = {2021},
NUMBER = {13},
ARTICLE-NUMBER = {2622},
URL = {https://www.mdpi.com/2072-4292/13/13/2622},
ISSN = {2072-4292},
DOI = {10.3390/rs13132622}
}

第三方库#

我们也感谢下面所有开源工程对本项目的贡献:

资金来源#

该项目的部分资金来自于:

  • the JST AIP Acceleration Research “Studies of CPS platform to raise big-data-driven AI agriculture”;

  • the SICORP Program JPMJSC16H2;

  • CREST Programs JPMJCR16O2 and JPMJCR16O1;

  • the International Science & Technology Innovation Program of Chinese Academy of Agricultural Sciences (CAASTIP);

  • 国家自然科学基金U19A2061