在函数OpenCV中使用cv2. videoccapture()



我正在尝试用tkinter和opencv制作一个基于gui的人脸识别程序。我以前使用过函数cv2. videoccapture(),但通常不在函数内,它工作成功。

但是,这次我想在函数中使用,但是程序没有运行。我在终端上没有错误,窗口只是卡住了。

这是我的代码(我还没有添加人脸识别功能)

import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.configure(bg='#3d3d3d')
f1 = tk.LabelFrame(root, bg='#3d3d3d')
f1.place(relx=0.5, rely=0.53, anchor=tk.CENTER)
feed = tk.Label(f1)
feed.pack()
cap = cv2.VideoCapture(0)
def capture():    
while cap.isOpened():
img = cap.read()[1]  
img = cv2.flip(img, 1)
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # changing color to RGB
img = ImageTk.PhotoImage(Image.fromarray(img1)) 
feed['image'] = img  # putting the webcam feed in the 'feed' LabelFrame
capture()
root.mainloop()

我尝试为videoccapture()函数输入值0,1,-1,但问题仍然存在

注意,这不是我的全部代码,我只包含了重要的部分。我问这个问题,因为我想通过单击按钮打开的顶层()窗口实现此功能。顶层()窗口的代码位于函数内部。

提前感谢!

你的代码中主要有两个问题:

  • 使用while循环,将阻止root.mainloop()执行。使用after()代替。
  • 在函数内部创建的图像如果其引用未保存,将被垃圾收集

下面是修改后的代码来修复上述问题:

import tkinter as tk
from PIL import Image, ImageTk
import cv2
root = tk.Tk()
root.configure(bg='#3d3d3d')
root.geometry('800x600')
f1 = tk.LabelFrame(root, bg='#3d3d3d')
f1.place(relx=0.5, rely=0.53, anchor=tk.CENTER)
feed = tk.Label(f1)
feed.pack()
cap = cv2.VideoCapture(0)
# used after() instead of while loop
def capture():
if cap.isOpened():
ret, img = cap.read()
if ret:
img = cv2.flip(img, 1)
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # changing color to RGB
img = ImageTk.PhotoImage(Image.fromarray(img1))
feed['image'] = img  # putting the webcam feed in the 'feed' LabelFrame
feed.image = img # save reference of the image
root.after(10, capture)
capture()
root.mainloop()

相关内容

  • 没有找到相关文章

最新更新