4

私はubuntuでopencvpythonを使用してウェブカメラから顔を検出しようとしています。このオンラインコードを取得してこのプログラムを実行しようとすると、NULL配列ポインターが渡されます。Webカメラからビデオをキャプチャすることはできないと思いますが、同じコード(カメラをキャプチャするだけ)でカメラをオンにしてビデオをキャプチャしました。これが私のコードです:

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

2 に答える 2

5

あなたのコードは私にとってはうまくいきました(私はあなたのバージョン2.3.1の代わりにOpenCV v2.4.3を実行していますが)。私は先週同じオンラインコード(ここに投稿)から作業を開始し、最終的には使用をあきらめて新しいライブラリcvに切り替えました。cv2

それで。cv2新しいインターフェースを使用するようにコードを更新しました。

cv2HaarCascadeClassifiersを実行するためのPythonインターフェースははるかに使いやすいです。cv2.CascadeClassifier.detectMultiScale() こちらのドキュメントを確認してください。新しいcv2インターフェースにより、コードが大幅に簡素化されます。ハイライトは次のとおりです。

  1. メモリバッファの作成について心配する必要はもうありません。
  2. から返される結果は非常に便利な形式で返され、古いコードの関数detectMultiScaleが不要になります。detect_faces()
  3. 1つのパラメーター、つまり画像自体を指定するだけで済みます。他のすべてのパラメーターはオプションです。以下の改訂されたコードに使用していたパラメーターを含めましたが、自由に削除してください。

アドバイスの1つ:コードの実行速度が遅い場合、実行できる最善の方法の1つは、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;
于 2013-01-03T23:20:18.223 に答える
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
于 2013-11-02T09:46:46.883 に答える