Как я могу сделать так, чтобы моя opencv wwebcam показывала видео быстрее? - PullRequest
0 голосов
/ 03 октября 2019

Я создал программу, которая автоматически создает окно и показывает отснятый материал веб-камеры, как только камера подключается к компьютеру через USB-порт. Я сделал версию программы с функцией cv2.imshow(), однако для создания окна и показа в нем видео потребовалось бы до 5 секунд, а затем я предположил, создав собственное окно с использованием tkinter, что кадры будутбыстрее показывается, однако это не так, так как отснятый материал занимает около 5 секунд. Как я могу сделать это значительно быстрее?

Вот код:

from tkinter import *  # Import the tkinter module (For the Graphical User Interface)
import cv2  # Import the cv2 module for web camera footage
import PIL  # Import the pillow library for image configuration.
from PIL import Image, ImageTk  # Import the specifics for Image configuration.

print("[INFO] Imports done")

width, height = 800, 600  # Define The width and height widget for cap adjustment
RootGeometry = str(width) + "x" + str(height)  # Make a variable to adjust tkinter frame
print("[INFO] Geometries made")

ImageSource = 0
cap = cv2.VideoCapture(ImageSource)  # First VideoCapture
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
print("[INFO] Cap set")

root = Tk()
print("[INFO] Window made")

root.title("Main Window")
root.configure(background="white")
root.geometry(RootGeometry)
root.bind('<Escape>', lambda e: root.quit())
lmain = Label(root)
lmain.pack()
print("[INFO] Configuration of cap done.")


def ShowFrame():
    print("[INFO] Show frame Initialized.")
    ok, frame = cap.read()
    if ok:
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = PIL.Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        print("[INFO] After 10 initializing")
        lmain.after(10, ShowFrame)
        print("[INFO] Showed image")

    else:
        lmain.after(10, CheckSource)


def CheckSource():
    print("[INFO] CheckSource Triggered.")
    if cap.open(ImageSource):
        print("[INFO] [DEBUG] if Ok initialized")
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            cv2.waitKey(0)
            print("[WARNING] Exiting app after command")
        root.deiconify()
        ShowFrame()

    else:
        print("[WARNING] No source found. Looking for source.")
        root.withdraw()
        lmain.after(10, CheckSource)


CheckSource()
root.mainloop()
print("[INFO] [DEBUG] Root.mainloop triggered")

1 Ответ

0 голосов
/ 03 октября 2019

Tkinter создает дополнительные издержки, поэтому он не сделает вещи быстрее. Скорее медленнее. Я видел, как вы задали пару вопросов по этому поводу, и мне стало немного любопытно, поэтому я сам написал небольшой пример. В моей системе он реагирует мгновенно. Посмотрите, работает ли это для вас. Если это так, проблема в другом месте вашего кода. Если нет, это может быть вызвано вашим оборудованием. Камера должна быть зарегистрирована ОС, прежде чем вы сможете получить к ней доступ. Поэтому, если компьютер, камера или ОС работают медленно, это может привести к замедлению работы приложения.

    import cv2
    import numpy as np
    # create initial variable
    cap = cv2.VideoCapture(0)

    while True:
            # if camera is active, then read and display frame
            # else retry to connect camera
            if cap.isOpened():
                    print('Camera connected. Reading frame.')
                    ret, frame = cap.read()
                    if ret:
                            cv2.imshow("Frame", frame)
                    else:
                            print('Frame read failed.')
            else:
                print('Camera not connected. Retrying.')
                cap = cv2.VideoCapture(0)    

            # time to display frame and get input. 20 means max 50x/second
            x = cv2.waitKey(20)
            if x == ord('q'):
                    break

    # clean up resources
    cap.release()        
    cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...