cannot write mode RGBA as JPEG. Как поправить код?
from PIL import Image, ImageTk
import tkinter as tk
import argparse
import datetime
import cv2
import os
class Application:
def __init__(self, output_path = "./"):
""" внутри онка tkinter появится окно opencv"""
self.vs = cv2.VideoCapture(0) # захват камеры. 0 камера по умолчанию.
self.output_path = output_path # Сохраняет путь
self.current_image = None # Текущее изображение с камеры
self.root = tk.Tk() # инициализация корневого окна
self.root.title("ADVARD'S PROGRAMM") # имя программы
# self.destructor = запускается, когда окно закрывается
self.root.protocol('WM_DELETE_WINDOW', self.destructor)
self.panel = tk.Label(self.root) # инициализация панели изображения
self.panel.pack(padx=10, pady=10)
#кнопка, которая при нажатии будет брать текущий кадр и сохранять его в файл
btn = tk.Button(self.root, text="Сделать снимок", command=self.take_snapshot)
btn.pack(expand=True, padx=15, pady=15)
#кнопка которая будет отправлять фаил.
btn = tk.Button(self.root, text="отправить снимок", command=self.take_snapshot)
btn.pack(expand=True, padx=15, pady=15)
# запускает self.video_loop, который постоянно объединяет видеосенсор
# Для коследнего читаемого кадра
self.video_loop()
def video_loop(self):
""" Получает кадр из видеопотока и показавает его в Tkinter """
ok, frame = self.vs.read() # прочитать кадр из видеопотока
if ok: # Если кадр снят без ошибок
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) # конвертировать цвета из BGR в RGBA
self.current_image = Image.fromarray(cv2image) # преобразование изображение для PIL
imgtk = ImageTk.PhotoImage(image=self.current_image) # конвертация изображение для tkinter
self.panel.imgtk = imgtk # закрепление imgtk, чтобы он не удалялся сборщиком мусора
self.panel.config(image=imgtk) # показать изображение
self.root.after(30, self.video_loop) # вызвать ту же функцию через 30 миллисекунд
def take_snapshot(self):
""" Делает снимок и сохраните его в файл """
ts = datetime.datetime.now() # Получает текущее время
filename = "{}.jpg".format(ts.strftime("%Y-%m-%d_%H-%M-%S")) # Делает имя файла
p = os.path.join(self.output_path, filename) # сторит путь
self.current_image.save(p, "JPEG") # сохраняет изображение в формате jpeg
print("[INFO] saved {}".format(filename))
def destructor(self):
""" Сломать корневой объект и освободить все ресурсы"""
print("[INFO] closing...")
self.root.destroy()
self.vs.release() # Запустить веб камеру
cv2.destroyAllWindows() # Сломает все окна при закрытии
# построить разбор аргумента и разобрать аргументы
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", default="./",
help="path to output directory to store snapshots (default: current folder")
args = vars(ap.parse_args())
# запустить приложение
print("[INFO] starting...")
pba = Application(args["output"])
pba.root.mainloop()
Источник: Stack Overflow на русском