如何使用python从fb0访问PiCamera start_preview数据

问题描述

我想在树莓派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',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,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。我找到了另一个可以访问GPU内存的项目py-videocore6,但是我不知道在哪里可以抓取视频数据。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...