所撰写文章目前只为了整理自己在科研上遇到的问题,方便自己日后查看,目前所撰写的博客没有形成体系,所以很多地方比较突兀,有时间的话会成体系的说明我自己理解和学习到有关WASS系统的内容。
简单来说WASS系统是一个基于双目视觉技术来重构波浪的系统,通过输入左目和右目相机拍摄的波浪影像以及相机的必要参数(内参、外参等)实现对波浪的重构。
目前在运行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软件计算有效波高等海洋要素。