Python - AttributeError: 'module' object has no attribute 'QueryFrame'

Python - AttributeError: 'module' object has no attribute 'QueryFrame'

我是 OpenCV 的新手,但我需要找到一种使用网络摄像头检测人脸的方法。我从 here 中找到了以下代码。这是原始代码。我正在使用 Python 2.7opencv 3.0.0-beta 版本和 Windows 8.1.

import cv2 as cv
import time
import Image

def DetectFace(image, faceCascade):

    min_size = (20,20)
    image_scale = 2
    haar_scale = 1.1
    min_neighbors = 3
    haar_flags = 0

    grayscale = cv.CreateImage((image.width, image.height), 8, 1)
    smallImage = cv.CreateImage(
            (
                cv.Round(image.width / image_scale),
                cv.Round(image.height / image_scale)
            ), 8 ,1)

    cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)
    cv.Resize(grayscale, smallImage, cv.CV_INTER_LINEAR)
    cv.EqualizeHist(smallImage, smallImage)

    faces = cv.HaarDetectObjects(
            smallImage, faceCascade, cv.CreateMemStorage(0),
            haar_scale, min_neighbors, haar_flags, min_size)

    if faces:
        for ((x, y, w, h), n) in faces:
            pt1 = (int(x * image_scale), int(y * image_scale))
            pt2 = (int((x + w) * image_scale), int((y + h) * image_scale))
            cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 5, 8, 0)

    return image

capture = cv.CaptureFromCAM(0)
faceCascade = cv.Load("haarcascades/haarcascade_frontalface_alt.xml")

while (cv.WaitKey(15)==-1):
    img = cv.QueryFrame(capture)
    image = DetectFace(img, faceCascade)
    cv.ShowImage("face detection test", image)

cv.ReleaseCapture(capture)

当我 运行 运行这个程序时,我遇到错误提示,没有名为 Image 的模块。我对其进行了评论并再次 运行 并对代码进行了以下更改。

capture = cv.CaptureFromCAM(0)capture = cv.VideoCapture(0) 和 根据弹出的错误WaitKeywaitKey

但现在它说 AttributeError: 'module' object has no attribute 'QueryFrame'

我觉得是版本问题什么的。我也已经包含了 haarcascades 个文件。请帮助我更正该错误并运行 很好地编写此代码。正如我提到的,我是 opencv 的新手。

cv2 没有方法 QueryFrame,它位于 cv.

import cv
img = cv.QueryFrame(capture)

cv2中,您使用:

result, img = capture.read()  #capture is a cv2.VideoCapture instance

而不是 QueryFrame

您还可以使用

将要捕获的帧排队
capture.grab()

其次是

result, img = capture.retrieve()

实际检索它。如果你想排队一个帧,请使用第二种方法,然后在等待它的同时做其他事情。

编辑:

你显然只是在尝试 运行 使用 OpenCV2 的一堆 OpenCV1 函数,如果你不阅读 OpenCV2 documentation 以了解函数有哪些,将会遇到很多问题改变了,什么没有改变。 Whosebug 不是 "convert this old code" 服务,因此我不会逐一介绍您程序中的每一个旧功能。

但是,为了回答您的后续问题,在 OpenCV2 中,建议仅使用 numpy.zeros() 函数(而不是旧的 cv.CreateImage 函数)创建图像。