当我的脸移动得太快时,OpenCV 人脸检测会中断

Posted

技术标签:

【中文标题】当我的脸移动得太快时,OpenCV 人脸检测会中断【英文标题】:OpenCV Face Detection breaks when I move my face too quickly 【发布时间】:2020-11-29 00:59:56 【问题描述】:

我编写了一个程序来实时检测面部并显示它们。问题是有时代码会中断,我会看到以下错误:

  File "Removed_For_Privacy_Issues/main.py", line 24, in <module>
    cv2.imshow('frame',detectedface)
cv2.error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

经过进一步测试,代码只有在视频突然变化时才会中断(比如当我快速移动脸或遮住相机时),有人知道为什么吗?

代码:

import numpy as np
import cv2
import PIL.Image
import PIL.ImageDraw
import time

cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
time.sleep(3)

def FacialDetection(image):
    boxes = face_cascade.detectMultiScale(image, 1.1, 3)
    for (x, y, w, h) in boxes:
        cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
        return image

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        detectedface = FacialDetection(frame)
        cv2.imshow('frame',detectedface)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

【问题讨论】:

这可能发生在你的脸快要出窗外或者在窗边的时候?在绘制矩形之前给出一些 if 语句。不要让它的点在窗外 【参考方案1】:

这将解决只是尝试,除了会做的工作

import numpy as np
import cv2
import PIL.Image
import PIL.ImageDraw
import time

cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
time.sleep(3)

def FacialDetection(image):
    boxes = face_cascade.detectMultiScale(image, 1.1, 3)
    for (x, y, w, h) in boxes:
        cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
        return image

while(cap.isOpened()):
    try:
        ret, frame = cap.read()
        if ret==True:
            detectedface = FacialDetection(frame)
            cv2.imshow('frame',detectedface)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
    except:
        print("face not detected")
cap.release()
cv2.destroyAllWindows()

【讨论】:

以上是关于当我的脸移动得太快时,OpenCV 人脸检测会中断的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 改进 OpenCV 中的人脸检测

OpenCV入门初探---拿走就能用的 人脸检测小项目 源码分析

UIScrollView setContentOffset 不对

光标通过面部中心移动?

JavaScript人脸检测的实现方法

UITapGestureRecognizer 点击半径