gpt4 book ai didi

python - Raspberry Pi python显示内存中的图像

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:34 24 4
gpt4 key购买 nike

任务如下:在外部事件(GPIO)上从 Picamera 捕获帧并将其显示在屏幕上。

使用的方法:

  1. PIL image.show() - 制作临时文件并使用外部查看器,我需要从内存中获取。

  2. Opencv cv.imshow() - 在几个顺序事件之后用图像卡住窗口。我玩了延迟它仍然卡住。

  3. UPD:带有图像的 Gdk 窗口在几个事件后也会卡住,但如果 GLib 定时器事件调用更新则不会卡住,但 GPIO 的处理程序不会卡住。

您能建议任何方法来完成这项任务吗?

最佳答案

创建一个小型 RAMdisk,它既美观又快速,并且可以避免 SD 卡磨损。将图像写入其中并使用 feh 或类似内容显示它:

sudo mkdir -p /media/ramdisk
sudo mount -t tmpfs -o size=4M tmpfs /media/ramdisk

df /media/ramdisk
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 4096 0 4096 0% /media/ramdisk

然后启动 Python 脚本更新您的图像。

<小时/>

初始脚本可能如下所示:

#!/bin/bash

# Create a couple of useful variables
MNTPNT="/media/ramdisk"
IMGNAM="$MNTPNT/image.ppm"

# Make ramdisk and mount
sudo mkdir -p /media/ramdisk 2> /dev/null
sudo mount -t tmpfs -o size=4M tmpfs /media/ramdisk 2> /dev/null

# Create initial empty image to display with ImageMagick or any other means
convert -size 800x600 xc:black -depth 8 "$IMGNAM"

# Get 'feh' started in "Slideshow mode" in the background
feh --title "Monitor" -D 0.5 "$IMGNAM" "$IMGNAM" &

# Now start Python script with image name
./monitor.py "$IMGNAM"

然后 Python 脚本 monitor.py 可能如下所示:

#!/usr/bin/python3

import os, sys, time
from PIL import Image, ImageDraw
from random import randint

# Pick up parameters
filename = sys.argv[1]

# Create initial image and drawing handle
w, h = 800, 600
im = Image.new("RGB",(w,h),color=(0,0,0))
draw = ImageDraw.Draw(im)

# Create name of temp image in same directory
tmpnam = os.path.join(os.path.dirname(filename), "tmp.ppm")

# Now loop, updating the image 100 times
for i in range(100):
# Select random top-left and bottom-right corners for image
x0 = randint(0,w)
y0 = randint(0,h)
x1 = x0 + randint(10,250)
y1 = y0 + randint(10,250)
# Select a random colour and draw a rectangle
fill = (randint(0,255), randint(0,255), randint(0,255))
draw.rectangle([(x0,y0),(x1,y1)], fill=fill)
# Save image to a temporary file, then rename in one immutable operation...
# ... so that 'feh' cannot read a half-saved image
im.save(tmpnam)
os.rename(tmpnam,filename)
time.sleep(0.3)

enter image description here

本质上,您的应用程序所要做的就是:

 while true:
... generate new image ...
im.save(tmpnam)
os.rename(tmpnam,filename)

如果您从 feh 命令中删除 --title "monitor",您将看到它只是迭代 2 个图像的列表,而这两个图像恰好都在是同一个图像。图像每 0.5 秒交换一次,不闪烁。如果您愿意,您可以更改它。如果您出于某种原因不希望它在两者之间连续交替,您可以使延迟更大,并向 feh 发送 SIGUSR1 (os.kill (pid, signal.SIGUSR1)) 使其在更新图像时切换。

关于python - Raspberry Pi python显示内存中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53946783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com