Ask Your Question
0

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

asked 2015-05-03 19:23:40 -0600

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()
edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
0

answered 2015-06-08 03:43:06 -0600

hoju gravatar image

I tried your code and it worked for me - the box moved with a camera feed. Perhaps your lighting is poor so that the detection failed.

edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2015-05-03 19:01:52 -0600

Seen: 240 times

Last updated: Jun 08 '15