Descriptor de HOG con videos para reconocer objetos.

Desafortunadamente, soy un principiante de python y openCV, así que quiero disculparme si la pregunta es estúpida.

Estoy tratando de usar un cv2.HOGDescriptor de cv2.HOGDescriptor para reconocer objetos en un video. Me preocupa un reconocimiento fotogtwig a fotogtwig (es decir, sin seguimiento o algo así).


Esto es lo que estoy haciendo:

  1. Leí el video (actualmente un .mpg ) usando

     capture = cv.CreateFileCapture(video_path) #some path in which I have my video #capturing frames frame = cv.QueryFrame(capture) #returns cv2.cv.iplimage 
  2. Para utilizar finalmente el detector en los marcos (lo que haría con el uso de

     found, w = hog.detectMultiScale(frame, winStride, padding, scale) 

    ) Me di cuenta de que necesitaba convertir el frame de cv2.cv.iplimage a numpy.ndarray lo que hice por

     tmp = cv.CreateImage(cv.GetSize(frame),8,3) cv.CvtColor(frame,tmp,cv.CV_BGR2RGB) ararr = np.asarray(cv.GetMat(tmp)). 

Ahora tengo el siguiente error:

  found, w = hog.detectMultiScale(ararr, winStride, padding, scale) TypeError: a float is required 

dónde

  winStride=(8,8) padding=(32,32) scale=1.05 

Realmente no puedo entender qué elemento es el verdadero problema aquí. Es decir, ¿qué número debe ser el flotador?

Cualquier ayuda apreciada

No es necesario realizar esa conversión adicional, el problema está relacionado con la mezcla de los nuevos y antiguos enlaces de OpenCV para Python. El otro problema relacionado con hog.detectMultiScale es simplemente debido al orden incorrecto de los parámetros.

El segundo problema se puede ver directamente al consultar la help(cv2.HOGDescriptor().detectMultiScale) :

 detectMultiScale(img[, hitThreshold[, winStride[, padding[, scale[, finalThreshold[, useMeanshiftGrouping]]]]]]) 

Como puede ver, cada parámetro es opcional, pero el primero (la imagen). El ordenamiento también es importante, ya que está utilizando efectivamente winStride como el primero, mientras que se espera que sea el segundo, y así sucesivamente. Puedes usar argumentos con nombre para pasarlo. (Todo esto se ha observado en la respuesta anterior.)

El otro problema es la combinación de códigos, aquí hay un código de ejemplo que debe considerar usar:

 import sys import cv2 hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05} video = cv2.VideoCapture(sys.argv[1]) while True: ret, frame = video.read() if not ret: break result = hog.detectMultiScale(frame, **hogParams) print result 

La documentación para la versión C ++ de HOGDescriptor :: detectMultiScale muestra un parámetro hit_threshold (de tipo double ) antes del argumento win_stride . Así que parece que le falta un argumento a la función. Para aceptar el argumento predeterminado para win_stride , debe pasar los argumentos de adición utilizados en su pregunta como palabras clave.