You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python脚本中实时获取Blender视口图像至OpenCV的frame变量

在Blender中实时获取视口图像到OpenCV的frame变量

直接跳过磁盘IO,用Blender的Python API读取渲染结果的内存像素数据,再转换为OpenCV兼容的格式即可,以下是实现方案:

核心思路

通过Blender的视口渲染API获取内存中的像素数据,转换为numpy数组后调整通道顺序和数据格式,直接传入OpenCV的frame变量,全程不涉及文件读写。

实现代码

import bpy
import numpy as np
import cv2

def get_viewport_frame():
    # 执行视口渲染,不写入磁盘文件
    bpy.ops.render.opengl(write_still=False)
    
    # 获取渲染结果的图像对象
    render_image = bpy.data.images['Render Result']
    
    # 将Blender的像素数据(一维RGBA float32数组)转为numpy数组
    pixel_data = np.array(render_image.pixels, dtype=np.float32)
    
    # 重塑为[高度, 宽度, 4]的二维数组
    img_height, img_width = render_image.size[1], render_image.size[0]
    frame = pixel_data.reshape((img_height, img_width, 4))
    
    # 转换为OpenCV兼容的格式:0-255 uint8,RGBA转BGR
    frame = (frame * 255).astype(np.uint8)
    frame = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR)
    
    return frame

# 调用示例
if __name__ == "__main__":
    # 获取当前视口帧
    current_frame = get_viewport_frame()
    
    # 用OpenCV显示测试
    cv2.imshow("Blender Viewport", current_frame)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

注意事项

  • 确保Blender的Python环境已安装numpy和opencv-python,可以通过Blender自带的pip执行安装:
    # 在Blender的安装目录中找到python.exe,执行
    ./python.exe -m pip install numpy opencv-python
    
  • 若要实时循环获取帧,建议使用bpy.app.timers.register注册定时回调,避免阻塞Blender的UI线程:
    def update_frame():
        frame = get_viewport_frame()
        # 在这里处理frame(比如传给OpenCV做分析)
        return 0.03  # 每30ms更新一次(约30fps)
    
    # 启动定时更新
    bpy.app.timers.register(update_frame)
    
  • 此方法的性能远高于文件读写方案,因为完全在内存中处理数据。

内容的提问来源于stack exchange,提问作者Mr. MinyUkho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:43:27