ビデオから顔を検出し、顔が検出されるたびに写真を撮ることを目的とした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 つ教えてください。ありがとう!(ここで私のインデントが少しおかしく見える場合も申し訳ありません....)