0

所以我的这段代码几乎可以工作,但是当我只希望它出现在相机预览窗口上时,覆盖层会接管整个 HDMI 输出(全屏)。

import picamera
import time

image_folder="../images/"

with picamera.PiCamera() as camera:
                camera.start_preview()
                camera.preview.window=(0,0, 750, 400)
                camera.preview.fullscreen=False

                # Overlay
                img = Image.open(image_folder+'cam_overlay.png')
                pad = Image.new('RGBA', (
                    ((img.size[0] + 31) // 32) * 32,
                    ((img.size[1] + 15) // 16) * 16,
                    ))
                pad.paste(img, (0, 0))
                o = camera.add_overlay(pad.tobytes(), size=img.size)
                o.alpha = 32
                o.layer = 3
          
                time.sleep(10)
                camera.stop_preview()

图片如下。覆盖是整个屏幕上的垂直线,但应该只在左上角的部分。 图片如下。 覆盖是整个屏幕上的垂直线,但应该只在左上角的部分。

4

1 回答 1

1

对于遇到此问题的任何人,实时预览和叠加使用不同的渲染器独立运行。您已通过指定预览窗口的位置

camera.preview.window=(0,0, 750, 400)

但没有为覆盖窗口指定相同的内容。这可以使用相同的语法但引用叠加层本身来完成

# add the overlay
o = camera.add_overlay(pad.tobytes(), size=img.size)
o.fullscreen = False

# specify the position of the overlay window to match the preview
o.window = (0, 0, 750, 400)
o.alpha = 32
o.layer = 3
于 2021-12-24T01:10:41.837 回答