[英]returning opencv processed frame to tkinter GUI
我正在编写一个程序,该程序使用基于选择的多种技术来处理视频并具有GUI。 其中一种方法称为背景减法,可以逐帧处理视频。 并且我有show frame方法,该方法在从方法中获取帧之后将帧发送到GUI,该方法调用技术根据用户的选择开始。 问题是,如果我使用return返回已处理的帧,它将停止循环处理视频并停止功能。
def DayBackgroundSubtraction():
cap = cv2.VideoCapture ('dataset/video92.mp4')
while cap.isOpened():
# do Processing
return frame
def show_frame():
lmain = Label(bottomFrame)
lmain.grid(row=0, column=0)
(ret, frame) = vid_capture.read()
# receive frame from selected techniques
frame = whichOne()
if ret == True:
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
img = _image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
lmain.imgtk = imgtk
lmain.configure(image=imgtk)
lmain.after(10, show_frame)
else:
lmain.destroy()
您创建了一个递归函数,当您调用lmain.after(10, show_frame)
时,它将永远不会结束。 这很不好,您能看到show_frame
函数将永远不会退出吗? 我很确定这也会导致您遇到怪异的行为。 相反,您应该将函数调用与函数本身分开。
import cv2
from PIL import ImageTk, Image
# get camera
cap = cv2.VideoCapture('dataset/video92.mp4')
def updateGUI(img):
# convert to PIL
img_arr = Image.fromarray(img)
img_pi = ImageTk.PhotoImage(img_arr)
lmain.configure(image=img_pi)
# loop forever while camera is open
while cap.isOpened():
# Get a frame from the video source
ret, frame = cap.read()
if ret:
# process frame
processed_frame = image_processing_function(frame)
# get a new processed frame
updateGUI(processed_frame)
# wait 10 ms - change value to change playback speed
cv2.waitKey(10)
免责声明:未经测试的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.