为什么Python OpenCV只从我的网络摄像头读取第一帧?



我试图从我的网络摄像头中检测人脸,但它只检测到第一帧中出现的第一张人脸,然后它会压碎,我已经使用 mtcnn 来检测操作,检测到第一张脸(如果存在(后,它将停止捕获并粉碎并保留在屏幕上,我使用 Jupyter 笔记本作为编辑器,笔记本将继续加载.. 但它可以在不使用检测器的情况下正常工作mtcnn! 但是当第一帧中没有人脸时,它会引发此错误 每当我在for box in boxes:之前使用if boxes:

索引

错误:列出索引超出范围

但如果有一张脸,它会引发这个错误:

ValueError:具有多个元素的数组的真值不明确。使用 a.any(( 或 a.all((

但是如果没有人脸可以检测,我不会使用if boxes:它将引发此错误:

类型错误:"NoneType"对象不可迭代

如果在第一帧中检测到人脸,那么在检测到人脸后它将保持加载状态!

capture = cv2.VideoCapture(0)  
while(True):      
ret, frame = capture.read()
frames_tracked = []
print('rTracking frame: {}'.format(i + 1), end='')
frame_pil = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
frame_pil = Image.fromarray(frame_pil)
boxes,_ = mtcnn.detect(frame_pil)
frame_draw = frame_pil.copy()
draw = ImageDraw.Draw(frame_draw)
for box in boxes:
draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)          
frames_tracked.append(frame_draw.resize((640, 360), Image.BILINEAR))      
d = display.display(frames_tracked[0], display_id=True)
i = 1     
try:
while True:
d.update(frames_tracked[i % len(frames_tracked)]) 
i += 1     
except KeyboardInterrupt:
pass
if cv2.waitKey('q') == 27:
break
capture.release() 
cv2.destroyAllWindows()

请我必须完成我最后一年的项目

我无法在我的 PC 中重现它,但也许会出现一个例外:

import cv2  
i = 0
capture = cv2.VideoCapture(0)  
while(True):      
ret, frame = capture.read()
frames_tracked = []
print('rTracking frame: {}'.format(i + 1), end='')
frame_pil = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
frame_pil = Image.fromarray(frame_pil)
boxes = []
boxes,_ = mtcnn.detect(frame_pil)
frame_draw = frame_pil.copy()
draw = ImageDraw.Draw(frame_draw)
try:
for box in boxes:
draw.rectangle(box.tolist(), outline=(255, 0, 0), width=6)          
frames_tracked.append(frame_draw.resize((640, 360), Image.BILINEAR)) 
except ValueError:
print("Oops! ...")     
d = display.display(frames_tracked[0], display_id=True)
i = 1     
try:
while True:
d.update(frames_tracked[i % len(frames_tracked)]) 
i += 1     
except KeyboardInterrupt:
pass
if cv2.waitKey('q') == 27:
break
capture.release() 
cv2.destroyAllWindows()

如果这不起作用。也许只是检查框是否为无?

if boxes is not None:
for box in boxes:    
print("seems to work")

最新更新