Ask Your Question

Revision history [back]

meanshift working only with .avi not with webcam why????

Hello to everybody and thanks in advance for helping me.... I have been struggling with the basic example of meanshift included below. It works great with .avi files but not with the webcam. when the webcam is selected as input video source (cap = cv2.VideoCapture(0) ) , the blue rectangle do not move. If I use the same webcam to record a video and I save it as .avi and open it ( cap = cv2.VideoCapture('testvi.avi') ), the program works perfectly. I used successfully the Camshift example, but I am only interested in working with meanshift. I am interested on fixed size tracking windows, thus meanshift is much more interesting than Camshift for me.

Any help is very much apreciated !! Thank you

import numpy as np
import cv2


#cap = cv2.VideoCapture('slow.avi')
#cap = cv2.VideoCapture('testvi.avi')
cap = cv2.VideoCapture(0)
# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
# r,h,c,w - region of image
#           simply hardcoded the values
r,h,c,w = 200,50,300,50  
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
hsv_roi =  cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# Setup the termination criteria, either 10 iteration or move by at least 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
        ret,frame = cap.read()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # apply meanshift to get the new location
        (ret, track_window) = cv2.meanShift(dst, track_window, term_crit)
        a=type(track_window)
        print track_window
        # Draw it on image

        x,y,w,h =track_window
        cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)
        cv2.imshow('img2',frame)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break




cv2.destroyAllWindows()
cap.release()