当前位置: 首页 > 知识库问答 >
问题:

这个网络摄像头人脸检测有什么问题?

鲜于德泽
2023-03-14

Dlib有一个非常方便、快速和高效的目标检测程序,我想做一个类似于这个例子的酷脸跟踪例子。

OpenCV,这是广泛支持,有视频捕捉模块,这是相当快的(五分之一秒的快照相比,1秒或更多的调用一些程序,唤醒网络摄像头和获取图片)。我将此添加到Dlib中的人脸检测器Python示例中。

如果您直接显示和处理OpenCV VideoCapture输出,它看起来很奇怪,因为OpenCV显然存储BGR而不是RGB订单。调整后,它的工作原理,但缓慢:

from __future__ import division
import sys

import dlib
from skimage import io


detector = dlib.get_frontal_face_detector()
win = dlib.image_window()

if len( sys.argv[1:] ) == 0:
    from cv2 import VideoCapture
    from time import time

    cam = VideoCapture(0)  #set the port of the camera as before

    while True:
        start = time()
        retval, image = cam.read() #return a True bolean and and the image if all go right

        for row in image:
            for px in row:
                #rgb expected... but the array is bgr?
                r = px[2]
                px[2] = px[0]
                px[0] = r
        #import matplotlib.pyplot as plt
        #plt.imshow(image)
        #plt.show()

        print( "readimage: " + str( time() - start ) )

        start = time()
        dets = detector(image, 1)
        print "your faces: %f" % len(dets)
        for i, d in enumerate( dets ):
            print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
                i, d.left(), d.top(), d.right(), d.bottom()))
            print("from left: {}".format( ( (d.left() + d.right()) / 2 ) / len(image[0]) ))
            print("from top: {}".format( ( (d.top() + d.bottom()) / 2 ) /len(image)) )
        print( "process: " + str( time() - start ) )

        start = time()
        win.clear_overlay()
        win.set_image(image)
        win.add_overlay(dets)

        print( "show: " + str( time() - start ) )
        #dlib.hit_enter_to_continue()



for f in sys.argv[1:]:
    print("Processing file: {}".format(f))
    img = io.imread(f)
    # The 1 in the second argument indicates that we should upsample the image
    # 1 time.  This will make everything bigger and allow us to detect more
    # faces.
    dets = detector(img, 1)
    print("Number of faces detected: {}".format(len(dets)))
    for i, d in enumerate(dets):
        print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
            i, d.left(), d.top(), d.right(), d.bottom()))

    win.clear_overlay()
    win.set_image(img)
    win.add_overlay(dets)
    dlib.hit_enter_to_continue()


# Finally, if you really want to you can ask the detector to tell you the score
# for each detection.  The score is bigger for more confident detections.
# Also, the idx tells you which of the face sub-detectors matched.  This can be
# used to broadly identify faces in different orientations.
if (len(sys.argv[1:]) > 0):
    img = io.imread(sys.argv[1])
    dets, scores, idx = detector.run(img, 1)
    for i, d in enumerate(dets):
        print("Detection {}, score: {}, face_type:{}".format(
            d, scores[i], idx[i]))

从这个程序的计时输出来看,处理和抓取图片似乎都需要五分之一秒的时间,所以你会认为它应该每秒显示一到两次更新-但是,如果你举手,它会在大约5秒后显示在网络摄像头视图中!

是否有某种内部缓存阻止它获取最新的网络摄像头图像?我是否可以调整或多线程网络摄像头输入过程以修复延迟?这是在具有16gb RAM的Intel i5上。

最新消息

根据这里,它建议读取逐帧抓取视频。这就解释了为什么它会抓取下一帧和下一帧,直到它最终赶上了处理过程中抓取的所有帧。我想知道是否有一个选项来设置帧率或设置为丢弃帧,只需点击网络摄像头中的面部图片现在阅读?http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html#capture-video-from-camera

共有3个答案

惠泳
2023-03-14

如果你想显示一个在OpenCV中读取的帧,你可以在cv2.imshow()函数的帮助下完成,而不需要改变颜色顺序。另一方面,如果你仍然想在matplotlib中显示图片,那么你不能避免使用这样的方法

b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))

这是我现在唯一能帮你的=)

邵昆琦
2023-03-14

可能问题是设置了一个阈值。如本文所述

dots = detector(frame, 1)

应该改为

dots = detector(frame)

以避免阈值。这对我来说是可行的,但同时也存在一个问题,即帧处理速度太快。

麹高远
2023-03-14

我感觉到你的痛苦。实际上,我最近使用了那个网络摄像头脚本(多次迭代;大量编辑)。我想我的工作做得很好。为了让您了解我所做的工作,我创建了一个GitHub Gist,其中包含详细信息(代码;HTML自述文件;示例输出):

https://gist.github.com/victoriastuart/8092a3dd7e97ab57ede7614251bf5cbd

 类似资料:
  • 以下程序演示如何使用系统相机检测脸部并使用JavaFX窗口显示脸部。 参考以下示例代码 - 执行上面示例代码,得到以下结果 - 系统提示:头像太丑,无法显示…

  • 本文向大家介绍python版opencv摄像头人脸实时检测方法,包括了python版opencv摄像头人脸实时检测方法的使用技巧和注意事项,需要的朋友参考一下 OpenCV版本3.3.0,注意模型文件的路径要改成自己所安装的opencv的模型文件的路径,路径不对就会报错,一般在opencv-3.3.0/data/haarcascades 路径下 以上这篇python版opencv摄像头人脸实时检测

  • 我正在尝试将OpenCV Cascade分类器教程从C翻译成Java。在C中运行良好。这个java教程也运行良好。 但翻译根本就没有检测到人脸。我没有明显的错误。我可以看到网络摄像头对视频输入的处理(灰色/直方图…)和视频显示器。级联加载不会给出错误。但是CascadeClassifier调用不会返回任何面孔。。。因此,您可能可以跳过所有代码,直接转到我的级联分类器调用,直至公共Mat检测(Mat

  • 我有一个应用程序,它使用Camera2 API来预览相机。我想在手机的镜头之间进行选择。在我的代码中,我使用了以下代码: 当我使用我的galaxy s10时,它有2个前置摄像头(普通和宽)和3个后置摄像头,我只从经理那里得到4个ID: 为什么我没有3后置微距相机。 这些问题出现在我所有的手机上,手机背面有一个以上的摄像头 我怎样才能得到所有的后摄像头? TNX领先

  • 我正在做一个项目,试图探测特定表面(竞技场)上的绿色和红色圆圈。当我尝试使用数字版本的竞技场(PNG图像)时,我可以成功地检测到两个彩色圆圈。 现在,我将这个竞技场打印在一个flex上(没有这两个彩色圆圈),并手动在上面放置彩色圆形硬币。但在通过1.3 MP的网络摄像头捕捉到它的图像后,颜色检测无法工作,并给出了错误的结果。 以下是通过网络摄像头拍摄的打印竞技场: 为什么没有检测到颜色?我需要对网

  • 1.接口描述 对照片中的人脸进行检测,返回人脸数目和每张人脸的位置信息 图片要求 格式为 JPG(JPEG),BMP,PNG,GIF,TIFF 宽和高大于 8px,小于等于4000px 小于等于 5 MB 请求方式: POST 请求URL: https://cloudapi.linkface.cn/face/face_detect 2.请求参数 字段 类型 必需 描述 api_id string