GUI интерфейс для предварительного просмотра изменений OpenCV - PullRequest
0 голосов
/ 28 апреля 2020

Я новичок в python и пытаюсь изучить openCV, поэтому для просмотра и анализа кадров на видео я хотел создать простой GUI интерфейс, использующий tkinter, чтобы иметь базовые c элементы управления видео, такого как воспроизведение, шаг паузы и l oop, моя проблема в коде ниже, когда я нажимаю кнопку воспроизведения, все блокируется процессом, и я больше не могу нажимать кнопку паузы или любую из кнопок, пожалуйста, предложение о том, как я могу добиться этого, чтобы запустить его асинхронно.

from tkinter import *
import cv2

def play():
  cap = cv2.VideoCapture('480.m4v')

  while cap.isOpened():
    ret, frame1 = cap.read()
    cv2.imshow("feed", frame1)

    if cv2.waitKey(33) == 27:
        break

  cv2.destroyAllWindows()
  cap.release()


def pause():
  print(var1.get())


def step():
  print(var1.get())

root = Tk()
root.title('GUI Control')
root.geometry('700x400')

# Play Button
play_btn = Button(root, text="Play", width=12, command=play)
play_btn.grid(row=0, column=0, padx=20, pady=20)
# Pause Button
pause_btn = Button(root, text="Pause", width=12, command=pause)
pause_btn.grid(row=0, column=1, pady=20, padx=20)
# Step Button
pause_btn = Button(root, text="Step", width=12, command=step)
pause_btn.grid(row=0, column=2, padx=20, pady=20)

var1 = IntVar()
Checkbutton(root, text="Loop Playing", variable=var1).grid(
    row=1, column=0, sticky=W, padx=20)


root.mainloop()

1 Ответ

0 голосов
/ 29 апреля 2020

Нет, если это лучший подход, но я использовал многопоточность, и он работает, как и ожидалось, вот код:

from tkinter import *
import cv2
import threading

def vid():
    loop = 1
    while loop == 1:
        cap = cv2.VideoCapture('480.m4v')

        while cap.isOpened():
            ret, frame1 = cap.read()
            if ret == False:
                break
            cv2.imshow("feed", frame1)

            if cv2.waitKey(33) == 27:
                break

        loop = var1.get()

    cv2.destroyAllWindows()
    cap.release()

def playFunc():
    t1 = threading.Thread(target=vid)
    t1.start()

def pauseFunc():
    print(var1.get())

def stepFunc():
    print(var1.get())

root = Tk()
root.title('GUI Control')
root.geometry('700x400')

# Play Button
play_btn = Button(root, text="Play", width=12, command=playFunc)
play_btn.grid(row=0, column=0, padx=20, pady=20)
# Pause Button
pause_btn = Button(root, text="Pause", width=12, command=pauseFunc)
pause_btn.grid(row=0, column=1, pady=20, padx=20)
# Step Button
pause_btn = Button(root, text="Step", width=12, command=stepFunc)
pause_btn.grid(row=0, column=2, padx=20, pady=20)

var1 = IntVar()
Checkbutton(root, text="Loop Playing", variable=var1).grid(
    row=1, column=0, sticky=W, padx=20)

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