evil_turtle
evil_turtle

Reputation: 21

cv2.VideoCapture(file) makes ret=False and frame=None

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

Answers (1)

deets
deets

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

Related Questions