python opencv 视频分帧,图片合成保存

本文介绍了使用Python的PIL和OpenCV库进行图像处理的方法,包括图像裁剪、缩放及不同库间的图像格式转换等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://github.com/Yijing-Tian/SmallCodeLibrary

图像裁剪、PIL/opencv/io/torch互转

# opencv
img.shape # 高度,宽度,色彩通道数
cutimg = img[y1:y2,x1:x2] # 裁剪
img_size = cv2.resize(img, (int(x / 2), int(y / 2))) # 指定尺寸缩放
img_size = cv2.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv.INTER_NEAREST) # 按比例缩放
# PIL
image.size # 宽度 , 高度 
im.crop((x1, y1, x2, y2)) # 裁剪
image_size = image.resize((width, height),Image.ANTIALIAS) # 指定尺寸缩放

# io转opencv      opencv转io
cv_img = cv2.cvtColor(image_io_img , cv2.COLOR_RGB2BGR)
image_io_img = cv2.cvtColor(cv_img , cv2.COLOR_BGR2RGB)

# PIL转opencv     opencv转PIL
pil_img = Image.fromarray(cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB))
cv_img = cv2.cvtColor(np.asarray(pil_img), cv2.COLOR_RGB2BGR)

# 使用opencv代替torchvision.utils.save_image
grid = torchvision.utils.make_grid(tensor, normalize=True, range=(-1, 1))
np_img = grid.detach().cpu().mul(255.0).numpy().transpose((1,2,0))
cv_img = cv2.cvtColor(np_img, cv2.COLOR_RGB2BGR)

# torch转opencv
np_img = tensor.detach().cpu().mul(255.0).numpy().squeeze(0).transpose((1,2,0))
cv_img = cv2.cvtColor(np_img, cv2.COLOR_RGB2BGR)

# opencv 转 base64
cv_img = cv2.imencode('.jpg',image_np)[1]
base_img = "data:image/png;base64," + str(base64.b64encode(cv_img), "utf-8")
# base64 转 opencv
base_img = base64.b64decode(base64_code)
cv_img = cv2.imdecode(np.fromstring(base_img, np.uint8), cv2.COLOR_RGB2BGR)
# base64 转 PIL
base_img = base64.b64decode(base64_str)
base_img = BytesIO(base_img)
pil_img = Image.open(base_img)
# PIL 转 base64
img_buffer = BytesIO()
pil_img.save(img_buffer, format='JPEG')
base_img = base64.b64encode(img_buffer.getvalue()).decode()

读取路径下所有文件,并按win排序方法进行排序

    from natsort import ns, natsorted
    import os
    pathB = 'work/'
    imgB_list = os.listdir(pathB)
    imgB_list = natsorted(imgB_list,alg=ns.PATH) #对读取的路径进行排序
    for imgB in imgB_list:
        print(pathB+imgB)

PIL、opencv读取网络图片

from urllib.request import urlopen
import io
from PIL import Image
touxiang = 'https://y.jpg'
image_bytes = urlopen(touxiang).read()
data_stream = io.BytesIO(image_bytes)
touxiang = Image.open(data_stream).convert("RGB")

import requests
file = requests.get("https://www.baidu.com/1.png")
img = cv2.imdecode(np.fromstring(file.content, np.uint8), 1)

opencv PIL 贴图

pil_bg = Image.new(mode="RGBA", size=(width,height),color=(255,255,255)) #创建背景
small = Image.open(path).convert("RGBA") # 小图像
pil_bg.paste(small,(startLeft,startTop,startLeft+small.size[0],startTop+small.size[1]),mask=small.split()[3])
### 使用 PythonOpenCV图片序列生成视频 以下是实现将图片序列合成视频的完整方法,基于所提供的引用内容以及相关技术细节。 #### 实现代码 ```python import cv2 import os # 设置参数 img_root = './images/' # 图片所在路径,请确保该路径下有连续命名的图片文件 output_video_path = 'output_video.avi' # 输出视频路径 fps = 30 # 率(Frames Per Second) frame_size = (1920, 1080) # 每一的大小 (宽, 高) # 获取图片列表并按顺序排列 image_files = sorted([f for f in os.listdir(img_root) if f.endswith('.jpg')]) if not image_files: raise ValueError("未找到任何图片文件,请确认路径和文件名格式") # 初始化 VideoWriter 对象 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码器设置 video_writer = cv2.VideoWriter(output_video_path, fourcc, fps, frame_size) # 循环读取图片并将每一写入视频 for image_file in image_files: img_path = os.path.join(img_root, image_file) frame = cv2.imread(img_path) if frame is None: print(f"无法加载图片 {img_path}") continue # 调整图片尺寸以匹配设定的大小 frame_resized = cv2.resize(frame, frame_size) video_writer.write(frame_resized) # 关闭资源 video_writer.release() print(f"视频已成功保存至 {output_video_path}!") ``` --- #### 参数说明 - **`img_root`**: 存放图片的根目录。需确保此目录下的图片按照一定规律命名(如 `1.jpg`, `2.jpg`...),以便程序能正确排序。 - **`output_video_path`**: 合成后的视频存储位置及其名称。 - **`fps`**: 设定输出视频数频率,默认为 30 FPS[^1]。 - **`frame_size`**: 单张图片被调整到的目标辨率[(宽度,高度)]。如果原始图片不一致,则需要统一处理。 - **`fourcc`**: 视频编码方式,这里选择了 `'XVID'` 编码器[^2]。 --- #### 注意事项 当运行上述脚本时需要注意以下几点: - 如果输入图片尺寸不同步,在调用 `cv2.VideoWriter()` 方法前应通过 `cv2.resize()` 函数标准化所有图像尺寸。 - 确认安装了支持所需编解码器的相关依赖项;某些情况下可能还需要额外配置 FFMPEG 工具链来扩展可用选项范围。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值