首页 > 解决方案 > 为什么 python opencv 只从我的网络摄像头读取第一帧?

问题描述

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

IndexError:列表索引超出范围

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

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

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

TypeError:“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()

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

标签: pythonopencvneural-networkface-detectionresnet

解决方案


我无法在我的 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")

推荐阅读