Opencv TypeError:+;的操作数类型不受支持:';非类型';和';非类型';用于眨眼检测

Opencv TypeError:+;的操作数类型不受支持:';非类型';和';非类型';用于眨眼检测,opencv,python-3.7,Opencv,Python 3.7,我在使用Python、OpenCV和dlib进行“眨眼检测”时遇到问题。我用的是Jupyter笔记本 以下代码使用shape\u predictor\u 68\u face\u landmarks.dat库绘制68面上的预定义点 导入cv2 #将numpy作为np导入 导入dlib 从数学导入 cap=cv2.视频捕获(0) 探测器=dlib.获取正面探测器() predictor=dlib.shape\u predictor(“C:\\Users\\Asirajdin\\dev\\shape\

我在使用Python、OpenCV和dlib进行“眨眼检测”时遇到问题。我用的是Jupyter笔记本

以下代码使用
shape\u predictor\u 68\u face\u landmarks.dat
库绘制
68
面上的预定义点

导入cv2
#将numpy作为np导入
导入dlib
从数学导入
cap=cv2.视频捕获(0)
探测器=dlib.获取正面探测器()
predictor=dlib.shape\u predictor(“C:\\Users\\Asirajdin\\dev\\shape\u predictor\u 68\u face\u地标
\\形状(预测器)(68)面(地标)(dat)
def中点(p1、p2):
返回int((p1.x+p2.x)/2),int((p1.y+p2.y)/2)
font=cv2.font\u HERSHEY\u SIMPLEX
def获取闪烁比率(眼点、面部地标):
左切点=(面部切点.part(eye切点[0]).x,面部切点.part(eye切点[0]).y)
右切点=(面部切点.part(eye切点[3]).x,面部切点.part(eye切点[3]).y)
中心点=中点(面部标志点部分(眼睛标志点[1]),面部标志点部分(眼睛标志点[2]))
中心点\底部=中点(面部地标部分(眼点[5]),
面部标志。部分(眼点[4])
水平线=cv2.line(帧,左点,右点,(0,255,0),2)
垂直线=cv2.2线(框架,中心线顶部,中心线底部,(0,255,0),2)
水平线长度=hypot((左点[0]-右点[0]),(左点[1]-右点[1]))
垂直线长度=hypot((中心线顶部[0]-中心线底部[0]),(中心线顶部[1]-中心线底部[1]))
比率=水平线长度/垂直线长度
虽然(正确):
_,frame=cap.read()
灰色=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY)
面=探测器(灰色)
对于面中的面:
#x、 y=face.left(),face.top()
#x1,y1=面。右(),面。下()
#cv2.矩形(框架,(x,y),(x1,y1),(0255,0),2)
地标=预测器(灰色,面部)
左眼比率=获得眨眼比率([36,37,38,39,40,41],地标)
右眼比率=获得眨眼比率([42,43,44,45,46,47],地标)
眨眼比率=((左眼比率+右眼比率)/2)
如果闪烁率>5.7:
cv2.putText(帧,“闪烁”(50150),字体,5,(255,0,0))
cv2.imshow(“帧”,帧)
key=cv2.waitKey(1)
如果键==27:
打破
#一切完成后,释放捕获
第1章释放()
cv2.destroyAllWindows()
错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-2-ca92d06b8ea8> in <module>
     45         left_eye_ratio = get_blinking_ratio([36, 37, 38, 39, 40, 41], landmarks)
     46         right_eye_ratio = get_blinking_ratio([42, 43, 44, 45, 46, 47], landmarks)
---> 47         blinking_ratio = ((left_eye_ratio + right_eye_ratio) / 2)
     48 
     49         if blinking_ratio > 5.7:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'
TypeError回溯(最近一次调用)
在里面
45左眼比率=获得眨眼比率([36,37,38,39,40,41],地标)
46右眼比率=获得眨眼比率([42,43,44,45,46,47],地标)
--->47眨眼比率=((左眼比率+右眼比率)/2)
48
49如果闪烁率>5.7:
TypeError:+:“非类型”和“非类型”的操作数类型不受支持

我找到了我的帖子的解决方案。我意识到hor_line_length和ver_line_length返回NoneType,然后我尝试将比率转换为整数。我将get_blinking_ratio下的比率返回为int,即

ratio = hor_line_length/ver_line_length
return int (ratio)

我是python的新手,虽然代码可以工作,但这可能不是最好的答案。谢谢。

您的函数
获取闪烁\u比率
不会返回任何内容。在python中,这意味着它隐式返回
None

这就是“无”值在该分区中显示的方式


在你的函数之后,有一些行似乎在处理比率。你打算让那些人进入功能内部吗?然后你需要缩进它们。它们仍然不包含函数返回任何内容所需的
return
语句。

我建议进行编辑。我试着尽我所能纠正压痕。如果你仍然发现一个错误,那么让我知道。嗯。。您正在使用的预定义预测值中似乎有
None