1

我想在树莓派 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 中留下任何足迹。

蟒蛇代码:

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

4

0 回答 0