Запишите кадр веб-камеры в приложение Flet: изображение flet сообщило об ошибке и исключении.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Запишите кадр веб-камеры в приложение Flet: изображение flet сообщило об ошибке и исключении.

Сообщение Anonymous »

Я имею дело с приложением, которое позволяет использовать веб-камеру. Для взаимодействия с камерой я использовал пакет python open-cv. Я разработал простое приложение Flet с кнопкой для запуска/остановки захвата кадров с веб-камеры, отображаемых в контейнере.

Код: Выделить всё

import flet as ft
import cv2
import base64

class WebcamManager():
def __init__(self):
super().__init__()
self.webcam = None

def initialize(self):
try:
self.webcam = cv2.VideoCapture(index=0, apiPreference=cv2.CAP_DSHOW)
if not self.webcam.isOpened():
print("Cannot open camera")
exit()
else:
# Set new capture properties
ret = self.webcam.set(cv2.CAP_PROP_FRAME_WIDTH, value=1280.0)
ret = self.webcam.set(cv2.CAP_PROP_FRAME_HEIGHT, value=720.0)

print("webcam.isOpened(): ", self.webcam.isOpened())
except Exception as e:
print(e)

# THIS VERSION OF CAPTURING UPDATING THE CONTAINER CAUSES INTERMITTENT VIDEO
# def capture_from_webcam(self, container: ft.Container):
#     while True:
#         ret, frame = self.webcam.read()
#         if ret:
#             frame = cv2.resize(frame,(854,480))
#             _, img_arr = cv2.imencode('.png', frame)
#             img_b64 = base64.b64encode(img_arr)
#             container.content = ft.Image(src_base64 = img_b64.decode("utf-8"))
#             container.update()

def capture_from_webcam(self, ftImg: ft.Image):
while True:
ret, frame = self.webcam.read()
if ret:
frame = cv2.resize(frame,(854,480))
_, img_arr = cv2.imencode('.png', frame)
img_b64 = base64.b64encode(img_arr)
ftImg.src_base64 = img_b64.decode("utf-8")
ftImg.update()

def dispose(self):
try:
self.webcam.release()
print("webcam.isOpened(): ", self.webcam.isOpened())
except Exception as e:
print(e)

def main(page: ft.Page):
def button_play_clicked(e):
if e.control.data: # case: running -> not running
button_play.data = False
button_play.icon = ft.icons.CAMERA
button_play.tooltip="Turn on webcam"

camManager.dispose()
cont.content = None
else:# case: not running -> running
button_play.data = True
button_play.icon = ft.icons.CAMERA_OUTLINED
button_play.tooltip="Turn off webcam"

camManager.initialize()

# THIS VERSION OF CAPTURING UPDATING THE CONTAINER CAUSES INTERMITTENT VIDEO
# camManager.capture_from_webcam(container=cont)

camManager.capture_from_webcam(ftImg = img)

page.update()

camManager = WebcamManager()

img = ft.Image(src_base64=None)
cont = ft.Container(border=ft.border.all(3, ft.colors.RED), width=854, height=480,
content = img,
) #width = 854, height = 480
button_play = ft.IconButton(icon=ft.icons.CAMERA, icon_size=46, on_click=button_play_clicked,
data = False, tooltip="Turn on webcam")

page.add(ft.Column(
controls=[cont, button_play],
horizontal_alignment = "center",
alignment = "center", )
)
page.window_maximized = True
page.scroll = ft.ScrollMode.AUTO
page.horizontal_alignment = "center"
page.vertical_alignment = "center"
page.update()

ft.app(target=main, assets_dir="assets")
ПРОБЛЕМА 1
В предыдущей версии метод захвата принимал входные данные контейнера и обновлял его (метод с комментариями). К моему удивлению, видео было прерывистым. Итак, я решил изменить этот метод, введя изображение в качестве входных данных,

Код: Выделить всё

img = ft.Image(src_base64=None)
и передать это изображение в контейнер. Однако определенное таким образом изображение (строка 86) выдало мне эту ошибку, отображаемую в контейнере:

Код: Выделить всё

Image must have either "src" or "src_base64" specified
ПРОБЛЕМА 2
Более того, после нажатия кнопки захват происходит плавно, но после остановки и последующего перезапуска Я получил это исключение:

Код: Выделить всё

Future exception was never retrieved
future: 
Traceback (most recent call last):
File "c:\Users\idoec\miniconda3\Lib\concurrent\futures\thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\idoec\Desktop\FLET\WebcamApp\main.py", line 79, in button_play_clicked
camManager.capture_from_webcam(ftImg = img)
File "C:\Users\idoec\Desktop\FLET\WebcamApp\main.py", line 44, in capture_from_webcam
ftImg.update()
File "c:\Users\idoec\miniconda3\Lib\site-packages\flet_core\control.py", line 286, in update
assert self.__page, "Control must be added to the page first."
AssertionError: Control must be added to the page first.
AssertionError: Control must be added to the page first.
Future exception was never retrieved
future: 
Traceback (most recent call last):
File "c:\Users\idoec\miniconda3\Lib\concurrent\futures\thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\idoec\Desktop\FLET\WebcamApp\main.py", line 79, in button_play_clicked
camManager.capture_from_webcam(ftImg = img)
File "C:\Users\idoec\Desktop\FLET\WebcamApp\main.py", line 44, in capture_from_webcam
ftImg.update()
File "c:\Users\idoec\miniconda3\Lib\site-packages\flet_core\control.py", line 286, in update
assert self.__page, "Control must be added to the page first."
AssertionError: Control must be added to the page first.
Другими словами:
НАЖМИТЕ №1: ОК
НАЖМИТЕ №2: ОК
НАЖМИТЕ №3: Исключение
Есть ли у кого-нибудь подсказки, как предотвратить ошибку и избежать исключения? Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -and-an-ex
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»