如何在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
相关产品推荐
相关产品推荐

