【问题标题】:why python opencv only read the first frame from my webcam? [closed]为什么 python opencv 只从我的网络摄像头读取第一帧? [关闭]
【发布时间】:2020-05-15 01:54:30
【问题描述】:

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

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

【问题讨论】:

  • “这是我第二次发布这个问题”...我想说这不是一个好的起点。
  • 谢谢你,我更新了,但如果你知道解决方法,请告诉我@Berriel
  • 如果有人想知道如何做到这一点,它的回答是:forums.fast.ai/t/…

标签: python opencv neural-network face-detection resnet


【解决方案1】:

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

【讨论】:

  • 在检测到帧中的第一张人脸后仍然会继续加载,并且只要没有人脸('NoneType' 对象不可迭代)
  • 你可以同时尝试if box is None。我将尝试获取 mtcnn,以便我可以在我的 PC 上对其进行全面测试
  • 我也试过了,和之前一样,在检测到第一张脸后它会继续加载,你可以从 (pip install facenet_pytorch) > from facenet_pytorch import MTCNN 获取 mtcnn)我会很感激你
  • @Ivan 如果您也对解决方案感兴趣:forums.fast.ai/t/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2013-06-21
  • 1970-01-01
  • 2017-02-11
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多