Raspberrypi Python отображать изображение из памяти - PullRequest
0 голосов
/ 27 декабря 2018

задача следующая: захватить кадр из Picamera по внешнему событию (GPIO) и отобразить его на экране.

используемые методы:

  1. PIL-изображение.show () - создать временный файл и использовать внешний просмотрщик, мне нужно из памяти.

  2. Opencv cv.imshow () - заморозить окно с изображением после нескольких последовательных событий.Я играл с задержками, которые все еще зависают.

  3. UPD: окно Gdk с изображением также останавливается после нескольких событий, но оно не останавливается при обновлении вызова события таймера GLib, но не в обработчике GPIO.

Не могли бы вы предложить какой-либо метод для выполнения этой задачи?

1 Ответ

0 голосов
/ 27 декабря 2018

Создайте небольшой RAM-диск, который приятен и быстр и позволяет избежать износа на вашей 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)

Если вы удалите --title "monitor" из команды feh, вы увидите, что она просто перебирает список из 2 изображений, которые оба оказываются одинаковымиобраз.Изображения меняются каждые 0,5 секунды, без мигания.Вы можете изменить это, если хотите.Если вы не хотите, чтобы он непрерывно чередовался по двум причинам, вы можете значительно увеличить задержку и отправить SIGUSR1 до feh (os.kill(pid, signal.SIGUSR1)), чтобы он переключался при каждом обновлении изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...