0

ビデオから顔を検出し、顔が検出されるたびに写真を撮ることを目的としたpythonプログラムにいくつか問題があります。

ONE「モジュールの実行」をクリックするたびに、プログラムが実行されます。しかし、この初回以降に実行しようとすると、エラー メッセージが表示され、実行されません。もう一度実行するには、python プログラムを閉じて、もう一度開く必要があります。エラーメッセージは次のとおりです。

Traceback (most recent call last):
  File "C:\Users\Morgan\Documents\Image recognition\Face Detection\test.py", line 56, in <module>
runCam()
  File "C:\Users\Morgan\Documents\Image recognition\Face Detection\test.py", line 26, in runCam
if len(detect_faces(image))>=0:
  File "C:\Users\Morgan\Documents\Image recognition\Face Detection\test.py", line 36, in     detect_faces
detected = cv.HaarDetectObjects(image, cascade, storage, 1.1, 3, cv.CV_HAAR_DO_CANNY_PRUNING, (100,100))
error: Non-positive cols or rows

私はこれをグーグルで検索してみましたが、うまくいきませんでした。これを修正する方法について誰かが情報、解決策、またはアイデアを持っていれば、私は素晴らしいと思います.

TWO元のビデオ プログラムでは、ストリームは完全に機能していました。ビデオ ウィンドウにビデオが表示され、必要に応じて顔が検出されました。私がしたことは、新しい顔が検出されるたびに写真を撮る機能をそのプログラムに追加することでした. しかし、これを追加すると、灰色のビデオ ウィンドウが表示されます (基本的にビデオ ストリームはありません)。これがなぜなのかわかりません。

これは、写真撮影機能のない私のオリジナルのビデオ顔検出プログラムです。

  import cv2
  import cv2.cv as cv

  HAAR_CASCADE_PATH = "C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.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(CAMERA_INDEX)
storage = cv.CreateMemStorage(0)
cascade = cv.Load(HAAR_CASCADE_PATH)
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)

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

    cv.ShowImage("Video", image)
    i += 1
    c=cv.WaitKey(10)

そして、これは新しい機能が追加されたものです:

import cv2
import cv2.cv as cv

camera_port = 0

ramp_frames = 1

def operateCamera():

camera = cv2.VideoCapture(camera_port)

def get_image():
     retval, im = camera.read()
     return im

for i in xrange(ramp_frames):
    temp = get_image()
    print("Taking image...")

    camera_capture = get_image()
    cv2.imwrite("c://Users/Morgan/Pictures/Logitech Webcam/color_image.jpeg", camera_capture)

def runCam():
while 1:
    if len(detect_faces(image))>=0:
        operateCamera()
    else:
        print("No faces detected!")

HAAR_CASCADE_PATH = "C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml"
CAMERA_INDEX = 0

def detect_faces(image):
faces = []
detected = cv.HaarDetectObjects(image, cascade, storage, 1.1, 3, 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_NORMAL)

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

i = 0
c=-1
while(c==-1)
    image = cv.QueryFrame(capture)
    runCam()
    # Only run the Detection algorithm every 5 frames to improve performance
    if i%5==0:
        faces = detect_faces(image)

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

        cv.ShowImage("Video", image)
        i += 1
        c=cv.WaitKey(10)

THREEプログラムを 1 回正常に実行できたので、顔が検出されると写真が撮られることがわかりました。悲しいことに、最初の顔を検出した後も写真を撮り続け、停止することはありません。一枚だけ撮ってほしい。誰もそれを解決する方法を知っていますか?

結論として、私はこれが多くの情報と非常に大きな質問であることを知っていますが、誰かがプログラムを修正する方法についてアイデアを持っている場合は、問題、灰色のビデオ フィード、および/またはテイクのみを再起動する必要があります。画像の問題を 1 つ教えてください。ありがとう!(ここで私のインデントが少しおかしく見える場合も申し訳ありません....)

4

1 に答える 1

0

あなたのコードは非常に文字化けしています。私はそれを解析するために最善を尽くしていますが、多くの問題があります。

ONE and TWO同じカメラを 2 回開こうとしているためにエラーが発生していると思います。整形でわかりにくい。灰色のフレームは、間違いなくカメラを 2 回開いたことが原因です。存在しないカメラを開こうとすると、同じ灰色のフレームが表示されます。

2 番目のコード例にはwhile(c==-1)、コロンがないなどのタイプミスがあります。あなたは非常に多くのインデントの問題を抱えています。cv バインディングの使用は避けます。可能であれば、cv2 を使用してください。

THREEループrunCam()中に毎回呼び出します。while(c==-1)ビデオのすべてのフレームを保存します。

遊んでいた小さな顔検出プログラムのコードを少し変更しました。cv2.CascadeClassifier()の代わりに使用しcv.HaarDetectObjects()ます。多分それはあなたを助けるでしょう。ある顔と別の顔を見分ける方法を理解する必要があります。

import cv2

cascade = "C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml"

scaling_factor = 4
picture_taken = False
frame_name = "Face Tracking"

capture = cv2.VideoCapture(0)
cv2.namedWindow(frame_name)

classifier = cv2.CascadeClassifier(cascade)

while cv2.waitKey(1) == -1:
    success, frame = capture.read()

    downsized_frame_template = (frame.shape[1] / scaling_factor, frame.shape[0] / scaling_factor)
    downsized_frame = cv2.resize(frame, downsized_frame_template)
    possible_faces = classifier.detectMultiScale(downsized_frame)

    if len(possible_faces):
        if not picture_taken:
            cv2.imwrite("c:\\Users\\Morgan\\Pictures\\Logitech Webcam\\color_image.jpeg", camera_capture)
            picture_taken = True
        for face in possible_faces:
            x, y, w, h = [v * scaling_factor for v in face]
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 255))

    cv2.imshow(frame_name, frame)
于 2013-07-12T19:06:29.260 に答える