Ubuntu 22.04(Jetson Orin Nano)下Librosa无法保存图像求助
解决Jetson Orin Nano上matplotlib无法保存图像的问题
针对你在Jetson Orin Nano(Ubuntu 22.04 LTS)上遇到的plt.savefig无法生成图像文件的问题,以下是排查和修复方案:
核心问题排查方向
1. 路径分隔符跨平台兼容问题
代码中使用split('\\')分割文件名,这是Windows系统的路径分隔符,在Linux下会失效。比如Linux下音频文件路径是./Record/xxx.wav,用split('\\')无法分割出文件名,最终生成的保存路径会包含整个原始路径,导致文件无法写入。
修复方法:使用Python内置的os.path模块处理路径,保证跨平台兼容:
filename = os.path.splitext(os.path.basename(wav_file[num]))[0]
2. 目标目录不存在
如果./Spectrogram/5s/目录未提前创建,plt.savefig不会自动递归创建目录,直接导致保存失败。
修复方法:在保存图像前检查并创建目录:
save_dir = './Spectrogram/5s/' os.makedirs(save_dir, exist_ok=True) # exist_ok=True避免目录已存在时报错
3. matplotlib后端适配问题
Jetson设备通常运行无桌面环境,matplotlib默认的交互式后端(如TkAgg)可能未安装或无法正常工作,导致图像无法渲染保存。
修复方法:在导入matplotlib后设置无界面后端Agg:
import matplotlib.pyplot as plt plt.switch_backend('Agg') # 切换到无界面后端
4. 目录写入权限问题
如果当前用户没有./Spectrogram/5s/目录的写入权限,plt.savefig会静默失败(无报错但无文件生成)。
修复方法:
- 检查目录权限:
ls -ld ./Spectrogram/5s/ - 赋予写入权限:
chmod 755 ./Spectrogram/5s/(或根据需求调整权限)
修改后的完整代码
import librosa import glob from PIL import Image import os import numpy as np import matplotlib.pyplot as plt import time # 切换matplotlib后端为无界面的Agg,适配Jetson环境 plt.switch_backend('Agg') hop_length = 1024 num = 0 num_10s = 1 # 提前创建保存目录 save_dir = './Spectrogram/5s/' os.makedirs(save_dir, exist_ok=True) while True: wav_file = glob.glob('./Record/*.wav') if not wav_file: print("Record目录下无wav文件") time.sleep(1) continue data_5s_y, data_5s_sr = librosa.load(wav_file[num]) d_data_5s_y = librosa.amplitude_to_db(np.abs(librosa.stft(data_5s_y, hop_length=hop_length)), ref=np.max) librosa.display.specshow(d_data_5s_y, y_axis='log', x_axis='time', sr=data_5s_sr, hop_length=hop_length) plt.axis('off') # 跨平台方式获取文件名 filename = os.path.splitext(os.path.basename(wav_file[num]))[0] save_path = os.path.join(save_dir, f"{filename}.png") plt.savefig(save_path, bbox_inches='tight', pad_inches=0) plt.close() # 关闭图形释放内存,避免内存泄漏 png_file = glob.glob(os.path.join(save_dir, '*.png')) if png_file: im = Image.open(png_file[0]) # 这里可以添加对im的处理逻辑 else: print("未生成png文件") num += 1 # 可选:循环处理完所有文件后重置num if num >= len(wav_file): num = 0 time.sleep(1) # 避免循环过快占用资源
额外优化点
- 添加
plt.close():每次保存后关闭图形,避免Jetson设备内存泄漏 - 增加文件存在性检查:避免因
wav_file为空或png_file为空导致报错 - 使用
os.path.join拼接路径:进一步保证跨平台兼容性
内容的提问来源于stack exchange,提问作者TRUE
相关产品推荐
相关产品推荐

