运行WASS系统所遇到的部分问题及解决思路

所撰写文章目前只为了整理自己在科研上遇到的问题,方便自己日后查看,目前所撰写的博客没有形成体系,所以很多地方比较突兀,有时间的话会成体系的说明我自己理解和学习到有关WASS系统的内容。

简单来说WASS系统是一个基于双目视觉技术来重构波浪的系统,通过输入左目和右目相机拍摄的波浪影像以及相机的必要参数(内参、外参等)实现对波浪的重构。

WASS系统的开源网址:GitHub - fbergama/wass: WASS (Waves Acquisition Stereo System) is an optimized stereo processing pipeline for sea waves 3D reconstruction.

目前在运行wass系统时发现如下的问题:

1.output文件夹内的海平面方程文件(planes.txt)中出现了空值的现象,具体表现为文件中的某几行出现“ 0 0 1 NaN”,这种空值的现象直接导致了wassgridsurface(生成nc文件的程序)无法顺利运行。

解决方案:为了能够运行wassgridsurface程序,采用下面代码1删除掉含有空值的行,生成新的海平面方程文件(filtered_planes.txt),代码1基于Matlab运行:

clc;
clear;
% 读取原始文件
filename = 'F:\0.5m-15hz_1\output\planes.txt';
fid = fopen(filename);

% 创建临时字符数组以存储文件内容
fileContent = '';

% 逐行读取文件
while ~feof(fid)
    line = fgetl(fid);
    if ~isempty(line) && ~contains(line, '-nan(ind)')
        fileContent = [fileContent line newline];
    end
end

% 关闭文件
fclose(fid);

% 将过滤后的文件内容写入新文件
newFilename = 'filtered_planes.txt';
fid = fopen(newFilename, 'w');
fprintf(fid, '%s', fileContent);
fclose(fid);

disp('Filtered file has been created successfully.');

分析出现该现象的原因是output文件夹内存在一些没有生成.xyzC文件子文件夹,也就说在运行wass的过程中存在着部分双目影像无法重构出三维波浪的点云文件(我实际运行的情况是9000幅影像有268幅无法生成.xyzC文件),因此我认为这间接的导致了海平面方程文件(planes.txt)的缺失。

解决思路:删除掉没有生成.xyzC文件子文件夹,并记录删除文件夹的名称,代码2通过python实现:

import os
import shutil

def extract_number_from_folder_name(folder_path):
    """从文件夹名称中提取数字部分"""
    folder_name = os.path.basename(folder_path)
    number_part = ''.join(filter(str.isdigit, folder_name))
    return number_part

def check_and_delete_missing_mesh_cam(directory, output_file):
    subfolders = [f.path for f in os.scandir(directory) if f.is_dir()]
    no_mesh_cam_subfolders = []

    for subfolder in subfolders:
        mesh_cam_path = os.path.join(subfolder, 'mesh_cam.xyzC')
        if not os.path.exists(mesh_cam_path):
            no_mesh_cam_subfolders.append(subfolder)

    # 删除缺少 mesh_cam.xyzC 文件的子文件夹
    with open(output_file, 'w') as f:
        for subfolder in no_mesh_cam_subfolders:
            print(f"Deleting folder: {subfolder}")
            shutil.rmtree(subfolder, ignore_errors=True)  # 使用 shutil.rmtree 删除非空目录
            number_part = extract_number_from_folder_name(subfolder)
            f.write(number_part + '\n')

    if no_mesh_cam_subfolders:
        print("The following subfolders did not contain a mesh_cam.xyzC file and were deleted:")
        for subfolder in no_mesh_cam_subfolders:
            print(subfolder)
    else:
        print("All subfolders contained a mesh_cam.xyzC file.")

if __name__ == "__main__":
    directory = r"F:\0.5m-15hz_1\output"  # 请替换为你的文件夹路径
    output_file = r"F:\0.5m-15hz_1\output\deleted_folders_numbers.txt"  # 输出文件路径
    check_and_delete_missing_mesh_cam(directory, output_file)

通过代码1和代码2的操作已经可以解决wassgridsurface运行的问题,通过运行wassgridsurface生成nc文件,该nc文件包含重构波浪的三维信息。通过以下Matlab代码实现从nc文件中提取某一点的瞬时波高信息。

函数名称命名为:read_elevation_data

函数内容如下:

function elevation_data = read_elevation_data(nc_file_path, x_index, y_index)
    % 获取变量信息
    info = ncinfo(nc_file_path, 'Z');
    time_size = info.Size(3);

    % 初始化高程数据向量
    elevation_data = zeros(time_size, 1);

    % 逐块读取数据
    block_size = 100;  % 根据你的内存情况调整
    for start_idx = 1:block_size:time_size
        end_idx = min(start_idx + block_size - 1, time_size);
        z_values_block = ncread(nc_file_path, 'Z', [x_index, y_index, start_idx], [1, 1, end_idx - start_idx + 1]);
        elevation_data(start_idx:end_idx) = squeeze(z_values_block);
    end
end

调用函数的名称随意

调用函数的内容如下:

clc;
clear;

% 设置文件路径和输出路径
nc_file_path = 'F:\nc文件\2011_10-04_13_07_00_12hz\Surfaces_20111004_130700.nc';
output_csv_path = 'C:\Users\Administrator\Desktop\001\20111004_1307.csv';

% 读取nc文件并显示文件信息
ncdisp(nc_file_path);

% 读取网格数据
X_grid_values = ncread(nc_file_path, 'X');
Y_grid_values = ncread(nc_file_path, 'Y');

% 提取某一点的高程数据
x_index = 135; % 中心点的X索引
y_index = 135; % 中心点的Y索引
elevation_data = read_elevation_data(nc_file_path, x_index, y_index);

% 将高程数据转换为表格形式,以便导出到CSV
elevation_table = array2table(elevation_data, 'VariableNames', {'Elevation'});

% 导出高程数据到CSV文件
writetable(elevation_table, output_csv_path);

% 提示信息
disp(['已将选定点的高程数据导出到' output_csv_path '文件中。']);

解释一下调用函数的内容:选取nc文件的某一点的高程数据,示例选取的是(135,135)将其导出为一列csv文件。生成是csv文件我可以粗略的认为是我观测海域内某一时间段的瞬时波高数据。

根据代码2记录的删除文件夹的名称,可以将缺失的高程数据以0的形式重新赋值到缺失数据原有的位置上,(之所以以数字0的形式是为了方便后续的插值处理)例如我删除的文件夹名称是000246,那么其对应csv中的位置应该是247。

通过python代码3实现上述操作:

import csv

# 读取txt文件中的数字
with open(r'C:\Users\15206\Desktop\01\001\20240613_1111\deleted_folders_numbers.txt', 'r') as txt_file:
    insert_positions = [int(line.strip()) for line in txt_file]

# 读取csv文件中的数据
with open(r'C:\Users\15206\Desktop\01\001\20240613_1111\20240613_1111_49.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    data = list(csv_reader)

# 根据txt文件中的数字修改csv数据
for position in sorted(insert_positions):
    data.insert(position, ['0'])

# 将修改后的数据写回csv文件
with open(r'C:\Users\15206\Desktop\01\001\20240613_1111\modified_data.csv', 'w', newline='') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerows(data)

print("CSV文件已成功修改并保存为modified_data.csv")

通过代码3生成的csv文件包括全部的高程数据,之后通过应用oceanlyz软件(Getting Started (GUI Version) — OCEANLYZ 2.0 documentation)中的插值功能将缺失值进行插值并基于oceanlyz软件计算有效波高等海洋要素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值