如何在 openCV tkinter 代码中解决这个问题
Posted
技术标签:
【中文标题】如何在 openCV tkinter 代码中解决这个问题【英文标题】:How to get rid of this problem in openCV tkinter code 【发布时间】:2021-09-21 08:14:31 【问题描述】:我正在开发基于面部识别的考勤系统。这是我的第一个项目,所以我不太熟悉如何处理错误。我被困在中间,不知道如何解决错误。我的终端显示以下错误:
PS E:\Project Work> & "C:/Users/Naik Faheem/AppData/Local/Programs/
Python/Python39/python.exe" "e:/Project Work/test.py"
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Naik Faheem\AppData\Local\Programs\Python\
Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "e:\Project Work\test.py", line 62, in face_recog
img=recognize(img,clf,facecascade)
File "e:\Project Work\test.py", line 52, in recognize
coord= draw_boundary(img,facecascade,1.1,10,255,"Face",clf)
File "e:\Project Work\test.py", line 39, in draw_boundary
n="+".join(n)
TypeError: can only join an iterable
[ WARN:1] global C:\Users\runneradmin\AppD
我已将我的实际代码放在下面。此代码旨在读取存储训练数据集的分类器.xml 文件。
from tkinter import *
from PIL import Image, ImageTk
from tkinter import ttk
from tkinter import messagebox
import mysql.connector
import cv2
class Face_recognition:
def __init__(self,root):
self.root=root
self.root.title('Face Detection')
self.root.geometry('1500x800+0+0')
self.root.config(bg='gray')
title_lbl=Label(self.root,text='FACE RECOGNITION',
font=('times new roman',35,'bold'),bg='gray',fg='darkblue')
title_lbl.place(x=0,y=0,width=1500,height=40)
btn=Button(self.root,command=self.face_recog,text='Detect Face',
font=('times new roman',12,'bold'),bg='red')
btn.place(x=650,y=60,width=200,height=40)
def face_recog(self):
def draw_boundary(img,classifier,scaleFactor,minNeighbors,color,text,clf):
gray_image=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
features = classifier.detectMultiScale(gray_image,scaleFactor,minNeighbors)
coord= []
for (x,y,w,h) in features:
cv2.rectangle(img,(x,y),(x+w,y+h),255,3)
id,predict= clf.predict(gray_image[y:y+h,x:x+w])
confidence= int(100*(1-predict/300))
con= mysql.connector.connect( user='root', host='localhost',
password='',database='stu_details')
cur=con.cursor()
cur.execute("select name from stu_info where name= "+str(id-1))
n=cur.fetchone()
n="+".join(n)
if confidence>70:
cv2.putText(img,f"Name: n",(x,y-60),cv2.FONT_HERSHEY_COMPLEX,1,255,2)
else:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),4)
cv2.putText(img,"Unknown face",(x,y10),
cv2.FONT_HERSHEY_COMPLEX_SMALL,0.8,(255,255,255),3)
coord=[x,y,w,h]
return coord
def recognize(img,clf,facecascade):
coord= draw_boundary(img,facecascade,1.1,10,255,"Face",clf)
return img
facecascade= cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
clf= cv2.face.LBPHFaceRecognizer_create()
clf.read("classifier.xml")
video_cap=cv2.VideoCapture(0)
while True:
ret,img=video_cap.read()
img=recognize(img,clf,facecascade)
cv2.imshow("Welcome to face recognition",img)
if cv2.waitKey(1)==13:
break
video_cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
root=Tk()
app=Face_recognition(root)
root.mainloop()
【问题讨论】:
这个函数返回什么?cur.fetchone()
。正如错误所说 n
不是可迭代的,一些可迭代是:列表、集合、字典等。判断某事物是否是可迭代的最简单方法是检查您是否可以使用 for loop
迭代对象(迭代=> 可迭代)
可能是SELECT SQL没有返回任何记录。
cur.fetchone() 返回与通过网络摄像头捕获的面部相关联的数据库中的名称。当我尝试使用面部但尝试包含第二个用户的面部时,sql 查询返回准确的名称程序挂起并在提示符中显示上述错误
你试过打印调试吗?好老的print(n, type(n))
会准确地告诉你你从数据库中得到了什么。
你的SQL语句可能有逻辑错误:比如id
为1,那么最终的SQL语句为"select name from stu_info where name= 0"
。但我认为name
是一个字符串,对吧?所以 SQL 可能什么也不返回。 name
实际上也应该在 WHERE 子句中使用吗?
【参考方案1】:
错误修复: 以升序的id(例如1,2,3....)注册记录,这个问题就解决了
【讨论】:
【参考方案2】:将数据库中的数据类型从 int
更改为 varchar
摆脱这个错误。
【讨论】:
以上是关于如何在 openCV tkinter 代码中解决这个问题的主要内容,如果未能解决你的问题,请参考以下文章
MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃