Garz
03-06-2014, 17:09
Ciao forum,
sto trafficando un po' col python e le opencv e credo di avere un problema di rilascio del capture della webcam.
Il problema è che, al primo run del programma tutto fila liscio, se rieseguo mi restituisce sempre questo errore:
Traceback (most recent call last):
File "C:\Users\aaa\workspace\provaEclipse\ricercaHaarCascadeFacceVideo.py", line 63, in <module>
image = DetectFace(img, faceCascade)
File "C:\Users\aaa\workspace\provaEclipse\ricercaHaarCascadeFacceVideo.py", line 16, in DetectFace
grayscale = cv.CreateImage((image.width, image.height), 8, 1)
AttributeError: 'NoneType' object has no attribute 'width'
Penso che il problema sia appunto il rilascio del capture della cam che, non venendo fatto, non la rende disponibile per il run successivo.
Il codice è questo, se qualcuno ha qualche info lo ringrazio di già!
import numpy as np
import cv2.cv as cv
print "opencv versione " + cv2.__version__
import time
def DetectFace(image, faceCascade):
min_size = (20,20)
image_scale = 2
haar_scale = 1.1
min_neighbors = 3
haar_flags = 0
# Allocate the temporary images
grayscale = cv.CreateImage((image.width, image.height), 8, 1)
smallImage = cv.CreateImage(
(
cv.Round(image.width / image_scale),
cv.Round(image.height / image_scale)
), 8 ,1)
# Convert color input image to grayscale
cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)
# Scale input image for faster processing
cv.Resize(grayscale, smallImage, cv.CV_INTER_LINEAR)
# Equalize the histogram
cv.EqualizeHist(smallImage, smallImage)
# Detect the faces
faces = cv.HaarDetectObjects(
smallImage, faceCascade, cv.CreateMemStorage(0),
haar_scale, min_neighbors, haar_flags, min_size
)
# If faces are found
if faces:
for ((x, y, w, h), n) in faces:
# the input to cv.HaarDetectObjects was resized, so scale the
# bounding box of each face and convert it to two CvPoints
pt1 = (int(x * image_scale), int(y * image_scale))
pt2 = (int((x + w) * image_scale), int((y + h) * image_scale))
cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 5, 8, 0)
return image
capture = cv.CaptureFromCAM(0)
faceCascade = cv.Load("classificatori/haarcascade_frontalface_alt.xml")
while (cv.WaitKey(15)==-1):
img = cv.QueryFrame(capture)
image = DetectFace(img, faceCascade)
cv.ShowImage("face detection test", image)
# cv.ReleaseCapture(capture)
cv.VideoCapture.release()
# capture.release()
sto trafficando un po' col python e le opencv e credo di avere un problema di rilascio del capture della webcam.
Il problema è che, al primo run del programma tutto fila liscio, se rieseguo mi restituisce sempre questo errore:
Traceback (most recent call last):
File "C:\Users\aaa\workspace\provaEclipse\ricercaHaarCascadeFacceVideo.py", line 63, in <module>
image = DetectFace(img, faceCascade)
File "C:\Users\aaa\workspace\provaEclipse\ricercaHaarCascadeFacceVideo.py", line 16, in DetectFace
grayscale = cv.CreateImage((image.width, image.height), 8, 1)
AttributeError: 'NoneType' object has no attribute 'width'
Penso che il problema sia appunto il rilascio del capture della cam che, non venendo fatto, non la rende disponibile per il run successivo.
Il codice è questo, se qualcuno ha qualche info lo ringrazio di già!
import numpy as np
import cv2.cv as cv
print "opencv versione " + cv2.__version__
import time
def DetectFace(image, faceCascade):
min_size = (20,20)
image_scale = 2
haar_scale = 1.1
min_neighbors = 3
haar_flags = 0
# Allocate the temporary images
grayscale = cv.CreateImage((image.width, image.height), 8, 1)
smallImage = cv.CreateImage(
(
cv.Round(image.width / image_scale),
cv.Round(image.height / image_scale)
), 8 ,1)
# Convert color input image to grayscale
cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)
# Scale input image for faster processing
cv.Resize(grayscale, smallImage, cv.CV_INTER_LINEAR)
# Equalize the histogram
cv.EqualizeHist(smallImage, smallImage)
# Detect the faces
faces = cv.HaarDetectObjects(
smallImage, faceCascade, cv.CreateMemStorage(0),
haar_scale, min_neighbors, haar_flags, min_size
)
# If faces are found
if faces:
for ((x, y, w, h), n) in faces:
# the input to cv.HaarDetectObjects was resized, so scale the
# bounding box of each face and convert it to two CvPoints
pt1 = (int(x * image_scale), int(y * image_scale))
pt2 = (int((x + w) * image_scale), int((y + h) * image_scale))
cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 5, 8, 0)
return image
capture = cv.CaptureFromCAM(0)
faceCascade = cv.Load("classificatori/haarcascade_frontalface_alt.xml")
while (cv.WaitKey(15)==-1):
img = cv.QueryFrame(capture)
image = DetectFace(img, faceCascade)
cv.ShowImage("face detection test", image)
# cv.ReleaseCapture(capture)
cv.VideoCapture.release()
# capture.release()