2017-11-19 9 views
0

OpenCVを初めて使用しています。私はopencvを使用して目を検出し、さらに分類するためにフォルダに保存する必要があります。私は同じために次のスクリプトを書いています:Python OpenCV - 目を検出して保存する

import numpy as np 
import cv2 

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 

eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') 

cap = cv2.VideoCapture(0) 
while True: 
    ret, img = cap.read() 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    faces = face_cascade.detectMultiScale(gray, 1.3, 5) 
    count=1 
    for (x,y,w,h) in faces: 
     cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 
     roi_gray = gray[y:y+h, x:x+w] 
     roi_color = img[y:y+h, x:x+w] 

     eyes = eye_cascade.detectMultiScale(roi_gray) 
     for (ex,ey,ew,eh) in eyes: 
      crop_img = roi_color[ey: ey + eh, ex: ex + ew] 
      cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 
      s="{0}.jpg" 
      s1='/home/kushal/Pictures/Webcam/'+s.format(count) 
      count=count+1 
      cv2.imwrite(s1,crop_img) 
cv2.imshow('img',img) 
k = cv2.waitKey(30) & 0xff 
if k == 27: 
    break 

cap.release() 
cv2.destroyAllWindows() 

できるだけ多くの目の画像を保存します。しかし、私は3-4の目の画像しか保存されていません。 1秒間に1つのフレームまたは1つの画像を取得することは可能ですか?このコードで何が修正されるべきですか?

答えて

1

の外にcount=1を移動します。

count = 1 
while True: 
    pass 
    #your code 

cv2.imshowのインデントが正しくありません。

import numpy as np 
import cv2 

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') 

cap = cv2.VideoCapture(0) 
count=1 

while True: 
    ret, img = cap.read() 
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    faces = face_cascade.detectMultiScale(gray, 1.2, 5) 
    for (x,y,w,h) in faces: 
     cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) 
     roi_gray = gray[y:y+h, x:x+w] 
     roi_color = img[y:y+h, x:x+w] 

     eyes = eye_cascade.detectMultiScale(roi_gray) 
     for (ex,ey,ew,eh) in eyes: 
      print(count) 
      crop_img = roi_color[ey: ey + eh, ex: ex + ew] 
      cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) 
      s1='tmp/{}.jpg'.format(count) 
      count=count+1 
      cv2.imwrite(s1,crop_img) 

    cv2.imshow('img',img) 
    k = cv2.waitKey(30) & 0xff 
    if k == 27: 
     break 

cap.release() 
cv2.destroyAllWindows() 
+0

これは完了です。ありがとう:) – slimshadyrocks

0

前の回答を参照して、ハザードカスケードスライディングウィンドウのスケーリング係数を変更することもできます。

これまでに、ギャラリーに偽陽性があると考えられました。つまり、ハールカスケードで目として検出された目以外の画像です。ですから、より正確な結果を得るためにD-libを試してみることをおすすめします。 d-libライブラリが提供する68面のランドマークポイントから関心領域を切り抜くことができます。あなたのreferenceの場合

+0

いいえ。私もそれを試みます。提案ありがとう:) – slimshadyrocks

関連する問題