예제 #1
0
                pixel_size = sensor_width / image_cols  # unit: mm/px
                pixel_size = pixel_size / 1000  # unit: m/px

                end_time = time.time()
                print("--- %s seconds ---" % (time.time() - start_time))

                read_time = end_time - start_time

            else:
                print('Read EOP - ' + file)
                print('Longitude | Latitude | Height | Omega | Phi | Kappa')
                eo = readEO(file_path)
                eo = latlon2tmcentral(eo)

                # 3. System Calibration
                OPK = calibrate(eo[3], eo[4], eo[5], R_CB)
                eo[3] = OPK[0]
                eo[4] = OPK[1]
                eo[5] = OPK[2]
                R = Rot3D(eo)

                # 4. Extract a projected boundary of the image
                print('boundary')
                bbox = boundary(restored_image, eo, R, ground_height,
                                pixel_size, focal_length)
                print("--- %s seconds ---" % (time.time() - start_time))

                # 5. Compute GSD & Boundary size
                # GSD
                gsd = (pixel_size *
                       (eo[2] - ground_height)) / focal_length  # unit: m/px
def rectify(path, name):
    print(path, name)

    ground_height = 0  # unit: m
    height_threshold = 100  # unit: m
    focal_length = 5 / 1000  # unit: m
    pixel_size = 0.00375 / 1000  # unit: m/px

    # 190911
    R_CB = np.array(
        [[0.990635238726878, 0.135295782209043, 0.0183541578119133],
         [-0.135993334134149, 0.989711806459606, 0.0444561944563446],
         [-0.0121505910810649, -0.0465359159242159, 0.998842716179817]],
        dtype=float)

    dst_path = path + "/" + name + '/odm_orthophoto/'
    if not (os.path.isdir(dst_path)):
        os.mkdir(dst_path)

    dst_path2 = path + "/" + name + '/odm_individual_orthophoto/'
    if not (os.path.isdir(dst_path2)):
        os.mkdir(dst_path2)

    file_list = []
    for root, dirs, files in os.walk(path + "/" + name + '/images'):
        files.sort()
        count = 0
        len_files = len(files)
        for file in files:
            filename = os.path.splitext(file)[0]
            extension = os.path.splitext(file)[1]
            file_path = root + '/' + file

            if extension == '.JPG' or extension == '.jpg':
                print('Read the image - ' + file)
                image = cv2.imread(file_path, -1)

            elif extension == '.txt':
                print('Read EOP - ' + file)
                eo = read_eo(file_path, 3)
                eo = convertCoordinateSystem(eo)

                if eo[2] - ground_height <= height_threshold:
                    print("The height of the image is too low: ",
                          eo[2] - ground_height, " m")
                    return "The height of the image is too low"

                # System Calibration
                OPK = calibrate(eo[3], eo[4], eo[5], R_CB)
                eo[3:] = OPK
                print(eo)

                if abs(OPK[0]) > 30 * (np.pi / 180) or abs(
                        OPK[1]) > 30 * (np.pi / 180):
                    print('Too much omega/phi will kill you')
                    return

                R = Rot3D(eo)

                # 4. Extract a projected boundary of the image
                bbox = boundary(image, eo, R, ground_height, pixel_size,
                                focal_length)

                # 5. Compute GSD & Boundary size
                # GSD
                gsd = (pixel_size *
                       (eo[2] - ground_height)) / focal_length  # unit: m/px
                print("GSD: ", gsd)
                # Boundary size
                boundary_cols = int((bbox[1, 0] - bbox[0, 0]) / gsd)
                boundary_rows = int((bbox[3, 0] - bbox[2, 0]) / gsd)
                print(boundary_rows, boundary_cols)

                # 6. Compute coordinates of the projected boundary
                proj_coords = projectedCoord(bbox, boundary_rows,
                                             boundary_cols, gsd, eo,
                                             ground_height)

                # Image size
                image_size = np.reshape(image.shape[0:2], (2, 1))

                # 6. Back-projection into camera coordinate system
                backProj_coords = backProjection(proj_coords, R, focal_length,
                                                 pixel_size, image_size)

                # 7. Resample the pixels
                b, g, r, a = resample(backProj_coords, boundary_rows,
                                      boundary_cols, image)

                # 8. Create GeoTiff
                dst = dst_path2 + filename
                createGeoTiff(b, g, r, a, bbox, gsd, boundary_rows,
                              boundary_cols, dst)

                # file_list.append("../../" + dst + '.tif')   # in relative path
                file_list.append(dst + '.tif')  # in absolute path

                count += 1
                progressbc.send_update(count / len_files * 100 * 0.9)

    # 10. Mosaic individual orthophotos for each band
    working_path1 = './OTB-7.0.0-Linux64/'
    working_path2 = './bin/'
    set_env = './otbenv.profile'
    mosaic_execution = './otbcli_Mosaic'

    start_time = time.time()
    os.chdir(working_path1)  # change path
    # https://stackoverflow.com/questions/13702425/source-command-not-found-in-sh-shell/13702876
    subprocess.call(set_env, shell=True)

    os.chdir(working_path2)
    # subprocess.call("ls", shell=True)
    print(file_list)
    # subprocess.call(mosaic_execution + ' -il ' + ' '.join(file_list) +
    #                 ' -comp.feather ' + 'large' +
    #                 ' -out ' + dst_path + 'IMG_RGB.tif', shell=True)
    # subprocess.call(mosaic_execution + ' -il ' + ' '.join(file_list) +
    #                 ' -out ' + "../../" + dst_path + 'odm_orthophoto.tif', shell=True)  # in relative path
    subprocess.call(mosaic_execution + ' -il ' + ' '.join(file_list) +
                    ' -out ' + dst_path + 'odm_orthophoto.tif',
                    shell=True)  # in absolute path
    print("--- %s seconds ---" % (time.time() - start_time))

    progressbc.send_update(100)
    print("Sent!")