问题描述
我想在树莓派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 (将#修改为@)