python - 返回 _cv.cvHaarDetectObjects(*args)

标签 python opencv

我正在尝试在 ubuntu 上使用 opencv python 从网络摄像头检测人脸。我得到了这个在线代码并尝试运行这个程序并且我得到了 NULL 数组指针被传递,我猜它无法从网络摄像头捕获视频但是使用相同的代码(仅捕获相机)我打开了相机并且它捕获了视频。这是我的代码:

import cv
from opencv import highgui
HAAR_CASCADE_PATH = "/home/OpenCV-2.3.1/data/haarcascades/haarcascade_frontalface_default.xml"

CAMERA_INDEX = 0 
def detect_faces(image):
 faces = []
 detected = cv.HaarDetectObjects(image, cascade, storage, 1.2, 2, cv.CV_HAAR_DO_CANNY_PRUNING, (100,100))
if detected:
    for (x,y,w,h),n in detected:
        faces.append((x,y,w,h))
return faces

if __name__ == "__main__":
cv.NamedWindow("Video", cv.CV_WINDOW_AUTOSIZE)

capture = cv.CaptureFromCAM(0)
storage = cv.CreateMemStorage()
cascade = cv.Load(HAAR_CASCADE_PATH)
print cascade
faces = []

i = 0
c = -1
while (c == -1):
    image = cv.QueryFrame(capture)


    # Only run the Detection algorithm every 5 frames to improve performance
    #if i%5==0:
    faces = detect_faces(image)
    #print image

    for (x,y,w,h) in faces:
        cv.Rectangle(image, (x,y), (x+w,y+h), 255)


    cv.ShowImage("w1", image)
    i += 1

我得到的错误是:

Traceback (most recent call last):
File "/home/OpenCV-2.3.1/webcam_try.py", line 38, in <module>
faces = detect_faces(frame)
File "/home/OpenCV-2.3.1/webcam_try.py", line 13, in detect_faces
detected = cv.cvHaarDetectObjects(frame, cascade, storage, 1.2, 2,    cv.CV_HAAR_DO_CANNY_PRUNING,(100,100))
 File "/usr/lib/pymodules/python2.7/opencv/cv.py", line 1626, in cvHaarDetectObjects
 return _cv.cvHaarDetectObjects(*args)
 NotImplementedError: Wrong number of arguments for overloaded function     'cvHaarDetectObjects'.
 Possible C/C++ prototypes are:
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double,int,int,CvSize)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double,int,int)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double,int)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *,double)
  cvHaarDetectObjects_Shadow(CvArr const *,CvHaarClassifierCascade *,CvMemStorage *)

最佳答案

您的代码对我来说工作正常(尽管我运行的是 OpenCV v2.4.3 而不是您的版本 2.3.1)。上周我开始使用相同的在线代码(发布 here),最终我放弃了使用 cv 并切换到新的 cv2 库。

所以。我已经更新了您的代码,以便它使用新的 cv2 接口(interface)。

用于运行 Haar 级联分类器的 cv2 Python 接口(interface)更易于使用。查看 cv2.CascadeClassifier.detectMultiScale() 的文档 here .新的 cv2 接口(interface)显着简化了您的代码。以下是亮点:

  1. 您不必再担心创建内存缓冲区的问题。
  2. detectMultiScale 返回的结果以非常有用的形式返回,不再需要旧代码的 detect_faces() 函数!
  3. 您只需提供一个参数:图片本身。所有其他参数都是可选的。我已将您在下面修改后的代码中使用的参数包括在内,但您可以随意删除它们。

一条建议:如果您的代码运行缓慢,您可以做的最好的事情之一就是增加 minSize。对于我的网络摄像头,使用 (100,100) 会导致大约 0.2fps 的超慢帧速率。将其更改为 (300,300) 可将其提升到可观的 20fps。

代码应该适用于您现有的安装,因为您运行的是 2.3.1,但如果没有,请尝试升级到最新版本。

import cv2
import cv2.cv as cv

HAAR_CASCADE_PATH = "/home/OpenCV-2.3.1/data/haarcascades/haarcascade_frontalface_default.xml";

CAMERA_INDEX = 0;

if __name__ == "__main__":

    # Open window, load webcam and load Haar cascade classifier
    cv2.namedWindow("Video", cv.CV_WINDOW_AUTOSIZE)
    capture = cv2.VideoCapture(CAMERA_INDEX);
    cascade = cv2.CascadeClassifier(HAAR_CASCADE_PATH);

    i = 0;

    while True:
        # Grab frame from webcam
        retVal, image = capture.read(); # note: ignore retVal

        # Only run the Detection algorithm every 5 frames to improve performance
        #if i%5==0:
        faces = cascade.detectMultiScale(image, scaleFactor=1.2, 
                                        minNeighbors=2, minSize=(100,100), 
                                        flags=cv.CV_HAAR_DO_CANNY_PRUNING);

        # Draw rectangles on image, and then show it
        for (x,y,w,h) in faces:
            cv2.rectangle(image, (x,y), (x+w,y+h), 255)
        cv2.imshow("Video", image)

        i += 1;

关于python - 返回 _cv.cvHaarDetectObjects(*args),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137507/

相关文章:

python - 实现 LangChain 的 OpenAI LLM wrapper 时遇到这个属性错误的原因是什么?

c++ - Access Violation阅读位置-opencv/VC++

opencv - 让撕破的纸恢复原样

c++ - 轮廓不等于轮廓[i]?

opencv - 如何编译与 libstdc++ 静态链接的 OpenCV

python - 获取 Pandas read_csv() 读入的 dtypes 字典

python - python 电影院座位图

opencv - 直方图匹配

python - 匈牙利算法 : multiple jobs per worker

Python 无法使用 urllib 或 Mechanize 检索表单