2013-01-03 45 views
4

我試圖在ubuntu上使用opencv python在網絡攝像頭中檢測臉部。我得到了這個在線代碼,並試圖運行這個程序,我得到了作爲NULL數組指針通過,我想它不能捕捉攝像頭的視頻,但具有相同的代碼(只有捕獲相機)我拿到了相機,它捕獲了視頻。這裏是我的代碼:return _cv.cvHaarDetectObjects(* args)

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 *) 

回答

5

你的代碼工作對我罰款(雖然我跑,而不是您的版本的OpenCV在v2.4.3,2.3.1 )。上週我開始使用相同的在線代碼(發佈日期爲here),最終我放棄了使用cv並切換到新的cv2庫。

所以。我已更新您的代碼,以便它使用新的cv2界面。

cv2用於運行Haar Cascade Classifiers的Python界面更易於使用。請參閱cv2.CascadeClassifier.detectMultiScale()here的文檔。新的cv2界面可顯着簡化您的代碼。以下是亮點:

  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; 
+0

非常感謝,它不適用於我的系統。錯誤如下:函數cvGetMat中無法識別或不支持的數組類型。在安裝opencv2.4.3之前,我想知道,它是否適用於Ubuntu 11.10系統和Python 2.7。因爲我在使用opencv2.3.1時遇到了很多問題,所以只想確認一下。謝謝。 – shreya

+0

嗨,我已經升級到Opencv-2.4.3。運行代碼後,它給我一個錯誤,如下所示:Traceback(最近一次調用最後一次): 文件「/home/vidula/OpenCV-2.3.1/draft_1.py」,第25行,在 flags = cv。 CV_HAAR_DO_CANNY_PRUNING) 錯誤:/home/vidula/OpenCV-2.4.3/modules/core/src/array.cpp:2482:error:(-206)函數cvGetMat中無法識別或不支持的數組類型這是什麼意思? – shreya

+0

這意味着你傳遞給imshow()的數組有問題。在閱讀我對您的其他問題的回答後再試一次。 –

2

我改變了布蘭登的代碼參照http://goo.gl/UziMVU後一點點。這是我的工作代碼。

import cv2 
import cv2.cv as cv 

HAAR_CASCADE_PATH = "/usr/local/Cellar/opencv/2.4.6.1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml" 

cv2.namedWindow("preview") 
vc = cv2.VideoCapture(0); 
cascade = cv2.CascadeClassifier(HAAR_CASCADE_PATH); 

retVal, frame = vc.read(); # note: ignore retVal 

while True: 
    if frame is not None: 
     faces = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, flags=cv.CV_HAAR_DO_CANNY_PRUNING, minSize=(100,100)); 

     for (x,y,w,h) in faces: 
      cv2.rectangle(frame, (x,y), (x+w,y+h), 255) 

     cv2.imshow("preview", frame) 
    rval, frame = vc.read() 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break