我对OpenCV很陌生,但我需要找到一种使用网络摄像头检测人脸的方法。我找到了来自here的以下代码。这是原始代码。我使用Python 2.7
和opencv 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)
和
根据弹出的错误,WaitKey
到waitKey
。
但现在它说 AttributeError: 'module' object has no attribute 'QueryFrame'
我认为存在版本问题或其他问题。我已经包含了haarcascades
个文件。请帮我纠正错误并运行此代码。正如我所提到的,我对opencv更新鲜。
答案 0 :(得分:3)
在cv2
中,您使用:
result, img = capture.read() #capture is a cv2.VideoCapture instance
而不是QueryFrame
。
您还可以使用
对帧进行排队以进行捕获capture.grab()
接着是
result, img = capture.retrieve()
实际检索它。如果你想排队一个帧,然后在等待它时做其他的东西,请使用第二种方法。
编辑:
你显然只是试图使用OpenCV2运行一堆OpenCV1函数,如果你不读OpenCV2 documentation来了解哪些函数已经改变以及什么没有改变,那么会遇到很多问题。 #39;吨。 StackOverflow不是"转换这个旧代码"服务,所以我不打算通过你的程序中的每一个旧功能。
但是,要回答您的后续问题,在OpenCV2中,建议使用numpy.zeros()
函数创建图像(而不是旧的cv.CreateImage
函数)。
答案 1 :(得分:0)
cv2没有方法QueryFrame,它位于cv。
import cv
img = cv.QueryFrame(capture)