Reputation: 21
So this code is found everywhere:
import numpy as np
import cv2
cap = cv2.VideoCapture('C:\\t.mp4')
# take first frame of the video
ret,frame = cap.read()
# setup initial location of window
r,h,c,w = 200,20,300,20
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()
if ret == True:
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)
# Draw it on image
x,y,w,h = track_window
img2 = cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)
cv2.imshow('img2',img2)
k = cv2.waitKey(60) & 0xff
if k == 27:
break
else:
cv2.imwrite(chr(k)+".jpg",img2)
else:
break
cv2.destroyAllWindows()
cap.release()
The thing is, it throws back this error (I'm using Anaconda):
roi = frame[r:r+h, c:c+w]
TypeError: 'NoneType' object has no attribute '__getitem__'
IMPORTANT INFO:
-Yes, everything is up-to-date.
-Yes, the videos and .py files are in the same folder (in the example above I just put "C:\..." for obvious reasons).
-I have tried other types of extensions for the video (avi,flv,mp4); none work.
-This is the first time I work on this, I'm pretty new to everything.
-I have tested if the video was read, with cap.isOpened()
which returned False
So it's clear that it's not the code the problem.
What do I have to do, so that I can use any video with this code? Should I try using Python instead?
Thanks for any help.
Upvotes: 0
Views: 3593
Reputation: 43
I just recently encountered this same problem and it was very frustrating until I figured out what the issue was. Also as you mentioned, print(frame)
returns None
, and not a matrix of pixel intensities like you would expect. This means there is no frame to index in the line roi = frame[r:r+h, c:c+w]
.
You're right in that it's not really an issue with your code. More so, it's an issue with python not being able to retrieve the video. Make sure your path to your video is correct. Even if your script and video file are in the same folder, I would recommend writing out the full path.
The first warning in this OpenCV tutorial applies to both videos and images: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_image_display/py_image_display.html
A post on formatting path: Windows path in python
Hope this helps!
Upvotes: 1