if __name__ == "__main__": output = 'my_output.png' clip = cv2.imread('1.png', 0) out_clip = clip.fl_image(process_an_image) out_clip.write_image(output, audio=False)改成使用图片输出
时间: 2024-01-17 14:02:51 浏览: 145
如果要使用图片输出,可以按照以下方式修改代码:
```python
import cv2
from moviepy.video.io.VideoFileClip import VideoFileClip
if __name__ == "__main__":
output = 'my_output.png'
clip = VideoFileClip('my_video.mp4')
frame = clip.get_frame(0) # 获取第一帧图像
out_frame = process_an_image(frame) # 处理图像
cv2.imwrite(output, out_frame) # 保存图像
```
这里使用了`moviepy`库来读取视频文件,并获取第一帧图像,然后对图像进行处理,并最终保存为图片。需要注意的是,`cv2.imwrite()`函数输出的是BGR格式的图像,如果你的处理函数中输出的是RGB格式的图像,需要先将其转换为BGR格式再保存。
相关问题
import cv2 import torch import numpy as np from pathlib import Path from models.fgd_net import FGDNet # 确保模型定义可访问 class SimpleDeploy: def __init__(self, weight_path="weights/best_model.pth"): self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") self.model = FGDNet().to(self.device) self.model.load_state_dict(torch.load(weight_path, map_location=self.device)) self.model.eval() # 切换到推理模式 @staticmethod def preprocess(img_path, target_size=(1024, 1024)): """ 图像预处理:灰度化 -> 归一化 -> 张量转换 """ img = cv2.imread(str(img_path), cv2.IMREAD_GRAYSCALE) img = cv2.resize(img, target_size) # 确保与训练尺寸一致 tensor = torch.from_numpy(img.astype(np.float32) / 255.0) return tensor.unsqueeze(0).unsqueeze(0) # (1,1,H,W) def process_pair(self, ir_path, fused_path, output_dir="output"): """ 处理单对图像 """ # 加载数据 ir_tensor = self.preprocess(ir_path).to(self.device) fused_tensor = self.preprocess(fused_path).to(self.device) # 生成引导特征 with torch.no_grad(): guide_feat = self.model.enc2(self.model.enc1(fused_tensor)) # 执行推理 output = self.model(ir_tensor, guide_feat) # 后处理与保存 output_np = output.squeeze().detach().cpu().numpy() * 255 output_np = np.clip(output_np, 0, 255).astype(np.uint8) # 确保像素值在 [0, 255] 范围内 output_dir = Path(output_dir) output_dir.mkdir(parents=True, exist_ok=True) # 确保输出目录存在 output_path = output_dir / f"result_{Path(ir_path).name}" try: cv2.imwrite(str(output_path), output_np) print(f"处理完成 ➜ {output_path}") except Exception as e: print(f"写入图像时出错: {e}") if __name__ == "__main__": deploy = SimpleDeploy() # 自动处理input目录下所有匹配文件 input_dir = Path("input") for ir_file in input_dir.glob("ir_*.jpg"): fused_file = input_dir / f"fused_{ir_file.stem.split('_')[-1]}.jpg" if
### 完善批量图像处理的 Python 脚本
为了使 PyTorch 模型能够支持批量红外与融合图像处理,可以扩展原始代码以遍历指定目录中的所有图像文件并逐一进行推理。以下是经过改进后的代码示例:
#### 批量图像处理的核心逻辑
通过 `os` 和 `glob` 库获取目标目录下的所有图片路径,并将其传递给模型进行批量预测。
```python
import os
import glob
import torch
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 加载预训练模型
model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/detect/train/weights/best.pt')
# 配置输入数据路径和输出保存路径
input_dir = 'substation_ir_dataset/images/test/' # 输入图像所在目录
output_dir = 'results/' # 输出结果保存目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 获取目录下所有的图像文件 (假设为jpg格式)
image_paths = glob.glob(os.path.join(input_dir, '*.jpg'))
# 对每张图像执行推理操作
for idx, image_path in enumerate(image_paths):
try:
# 读取图像
image = cv2.imread(image_path)
if image is None:
raise ValueError(f"无法加载图像 {image_path}")
# 将BGR转换为RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 使用模型进行预测
results = model([image_rgb]) # 支持列表作为输入
# 可视化预测结果
results.render()
result_image = results.imgs[0] # 提取渲染后的图像
# 保存结果到本地
output_file = os.path.join(output_dir, f'result_{idx}.png')
cv2.imwrite(output_file, cv2.cvtColor(result_image, cv2.COLOR_RGB2BGR))
except Exception as e:
print(f"处理图像 {image_path} 时发生错误: {e}")
print("批量图像处理完成!")
```
上述代码实现了以下功能:
- **自动扫描目录**:利用 `glob` 函数动态匹配指定目录下的 `.jpg` 文件[^1]。
- **逐帧推理**:将每一幅图像送入 YOLOv5 模型进行检测。
- **结果存储**:将带有标注框的结果图像保存至指定输出目录。
#### 关键点解析
1. **路径管理**
确保输入目录 (`input_dir`) 存在且包含有效的图像文件;如果不存在,则创建输出目录 (`output_dir`) 来保存生成的可视化结果[^2]。
2. **异常捕获**
如果某些图像损坏或不可访问,程序会跳过这些文件而不会中断整个流程。
3. **多线程加速(可选)**
若需进一步提升效率,可通过引入 `concurrent.futures.ThreadPoolExecutor` 实现并发处理多个图像的任务。
---
###
阅读全文
相关推荐














