код
from io import StringIO
import subprocess
import os
import time
from datetime import datetime
from PIL import Image
import subprocess
def captureTestImage(settings, width, height):
command = "libcamera-still --width {} --height {} --autofocus-on-capture 1 -q 75 --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx708_wide.json -o DAY-AF1-q75--tuningfile-imx708_wide-06-21-2024-16-15-20.jpg".format(width, height)
subprocess.run(command[0],shell=True,executable = "/usr/bin/bash")
imageData = StringIO()
imageData.write(subprocess.check_output(command, shell=True))
imageData.seek(0)
im = Image.open(imageData)
buffer = im.load()
imageData.close()
return im, buffer
фактическая ошибка получения:
Still capture image received
im = Image.open(imageData)
File "/home/user/.local/lib/python3.9/site-packages/PIL/Image.py", line 3339, in open
raise UnidentifiedImageError(msg)
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x7f9df4db80>
Что здесь не так?
Это создает настоящий файл изображения, но сценарий возвращает эту ошибку. Почему? Как я могу исправить? Спасибо
когда я пытаюсь его распечатать, я получаю TypeError: '_io.BytesIO' object is not subscriptable
Вероятно, я смогу помочь вам лучше, если вы превратите свой вопрос в правильный минимально воспроизводимый пример. На данный момент есть только не вызываемая функция, никаких операторов import
и переменная command
, содержимое которой неизвестно.
@MarkSetchell - я включил выше свой полный код, ошибки и импорт. Спасибо
Какой смысл бежать subprocess.run('l',shell=True,executable = "/usr/bin/bash")
, пожалуйста?
@MarkSetchell - это на самом деле работает command
и генерирует файл изображения
command[0]
будет равно l
, верно?
И ещё... почему ты вообще пытаешься запустить libcamera-still
дважды? Что вы на самом деле пытаетесь сделать?
@MarkSetchell - Просто пытаюсь создать тестовое неподвижное изображение с помощью libcamera.
Вы звоните subprocess.run()
и subprocess.check_output()
. Это означает, что вы запускаете ДВА процесса. Почему?
Ваша команда создает файл изображения на диске. Почему вы пытаетесь прочитать несуществующий вывод из libcamera stdout
и поместить его в StringIO, когда вывод представляет собой файл на диске? Почему бы вам просто не открыть файл на диске?
Я не понимаю, почему вы все так усложняете. Я думаю, что приведенного ниже кода должно быть достаточно для того, что вы пытаетесь сделать. Если нет, скажите, какой функциональности ему не хватает, чтобы я мог лучше помочь:
#!/usr/bin/env python3
import subprocess as sp
# Define parameters for libcamera command
width, height = 640, 480
filename = 'image.jpg'
# Flesh out libcamera command
cmd = [
'/usr/bin/libcamera-still',
'--width', f'{width}',
'--height', f'{height}',
'--autofocus-on-capture', '1',
'-q', '75',
'--tuning-file', '/usr/share/libcamera/ipa/rpi/vc4/imx708_wide.json',
'-o', filename
]
# Run libcamera command to create image.jpg
sp.run(cmd)
# Open image.jpg with Pillow
im = Image.open(filename)
Ценю это, Марк, и очень ценю твое терпение, пока я возвращаюсь к Python.
Нет проблем. Я надеюсь, что это сработает для вас.
Что в
imageData[:20]
?