如何使用python从fb0访问PiCamera start_预览数据

2024-04-19 23:15:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用树莓皮4在fb1上显示picamera的预览

我的环境是64位aarch64自编译系统。 使用vc4-fkms-v3d dtoverlay

看起来预览图像是GPU直接在fb0上绘制的,有人建议使用rpi fbcp,但由于缺少dispmanx api,无法在rpi4上编译

所以我使用python实现了一个类似的程序,numpy.memmap打开fb0,获取数据,然后写入fb1。 它的工作和非常快!我可以看到鼠标点的轨迹被实时镜像,甚至glxgear的旋转齿轮,但picamera的预览屏幕上没有

picamera的预览版在fb0中直播,覆盖所有内容,我可以镜像它下面的所有内容

如何访问picamera的预览数据?它显示在屏幕上,但没有在fb0中留下任何足迹

python代码:

import numpy as np
fb0 = np.memmap('/dev/fb0', dtype='uint8',mode='r+', shape=(480,800,4))
fb1 = np.memmap('/dev/fb1', dtype='uint8',mode='r+', shape=(240,240,2))
img0 = fb0[0:240, 0:240]
img1 = BGRAtoBGR565(img0)
fb1[0:240,0:240] = img1

生成预览图像的步骤

from picamera import PiCamera
camera = PiCamera()
camera.start_preview(fullscreen=False,window=(0,0,240, 240))

我试过python mss,也只抓取预览屏幕下方的图像

我已经测试了mmalobj,按照教程在预览中绘制十字线,它非常滞后,并且抛出了许多异常

picamera.exc.PiCameraMMALError: no buffers available: Resource temporarily unavailable; try again later
Traceback (most recent call last):
  File "_ctypes/callbacks.c", line 232, in 'calling callback function'
  File "/home/pi/.local/lib/python3.7/site-packages/picamera/mmalobj.py", line 1227, in wrapper
    self._pool.send_buffer(block=False)
  File "/home/pi/.local/lib/python3.7/site-packages/picamera/mmalobj.py", line 1931, in send_buffer
    super(MMALPortPool, self).send_buffer(port, block, timeout)
  File "/home/pi/.local/lib/python3.7/site-packages/picamera/mmalobj.py", line 1881, in send_buffer
    raise PiCameraMMALError(mmal.MMAL_EAGAIN, 'no buffers available')

看起来picamera的预览直接绘制在屏幕上,而不是通过/dev/fb0。我发现了另一个项目py-videocore6,它可以访问GPU内存,但我不知道在哪里绘制视频数据


Tags: inpy图像send屏幕buffernpline