Mat is not a numerical tuple openCV 2 - python

I am relatively new to python and to openCV, I am trying to create a program that grabs input from my Macs' webcam and displays it in a window, and ultimately can process and edit these frames. Here is my code:
import cv2
import numpy as nmp
capture=cv2.VideoCapture(0)
while True:
frame = capture.read()
cv2.imshow("Webcam", frame)
if (cv2.waitKey(0)):
break
cv2.release()
cv2.destroyAllWindows()
my light near my webcam turns on but then the program stops with the following error
Traceback (most recent call last):
File "/Users/spinder/Desktop/WebCam.py", line 7, in <module>
cv2.imshow("Webcam", frame)
TypeError: mat is not a numerical tuple
there are similar questions in here but they do not fix my problem, any advice, fix or workaround would be greatly appreciated.

According to the docs:
Python: cv2.VideoCapture.read([image]) → retval, image
This returns 2 values, the first indicates if the frame is obtained correctly and the second is the frame. So in your case the code should be as follows:
import cv2
import numpy as nmp
capture=cv2.VideoCapture(0)
while True:
res, frame = capture.read()
if res:
cv2.imshow("Webcam", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()

Related

OpenCV imshow error with webcam: (-215:Assertion failed) [duplicate]

I am trying to make a face tracker that combines Haar Cascade Classification with Lucas Kanade good feature detection. However, I keep getting an error that I cannot figure out what it means nor how to solve it.
Can anyone help me here?
Error:
line 110, in <module>
cv2.imshow('frame',img)
error: /build/buildd/opencv-2.4.8+dfsg1/modules/highgui/src/window.cpp:269:
error: (-215)size.width>0 && size.height>0 in function imshow
Code:
from matplotlib import pyplot as plt
import numpy as np
import cv2
face_classifier = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 200,
qualityLevel = 0.01,
minDistance = 10,
blockSize = 7 )
# Parameters for lucas kanade optical flow
lk_params = dict( winSize = (15,15),
maxLevel = 2,
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# Create some random colors
color = np.random.randint(0,255,(100,3))
# Take first frame and find corners in it
ret, old_frame = cap.read()
cv2.imshow('Old_Frame', old_frame)
cv2.waitKey(0)
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
restart = True
#while restart == True:
face = face_classifier.detectMultiScale(old_gray, 1.2, 4)
if len(face) == 0:
print "This is empty"
for (x,y,w,h) in face:
focused_face = old_frame[y: y+h, x: x+w]
cv2.imshow('Old_Frame', old_frame)
face_gray = cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(focused_face,cv2.COLOR_BGR2GRAY)
corners_t = cv2.goodFeaturesToTrack(gray, mask = None, **feature_params)
corners = np.int0(corners_t)
print corners
for i in corners:
ix,iy = i.ravel()
cv2.circle(focused_face,(ix,iy),3,255,-1)
cv2.circle(old_frame,(x+ix,y+iy),3,255,-1)
plt.imshow(old_frame),plt.show()
# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)
while(1):
ret,frame = cap.read()
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# calculate optical flow
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, corners_t, None, **lk_params)
# Select good points
good_new = p1[st==1]
good_old = corners_t[st==1]
# draw the tracks
print "COLORING TIME!"
for i,(new,old) in enumerate(zip(good_new,good_old)):
print i
print color[i]
a,b = new.ravel()
c,d = old.ravel()
mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
if i == 99:
break
img = cv2.add(frame,mask)
cv2.imshow('frame',img)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# Now update the previous frame and previous points
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1,1,2)
cv2.destroyAllWindows()
cap.release()
This error message
error: (-215)size.width>0 && size.height>0 in function imshow
simply means that imshow() is not getting video frame from input-device.
You can try using
cap = cv2.VideoCapture(1)
instead of
cap = cv2.VideoCapture(0)
& see if the problem still persists.
I have the same problem, fix the ret in capture video
import numpy as np
import cv2
# Capture video from file
cap = cv2.VideoCapture('video1.avi')
while True:
ret, frame = cap.read()
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
I had this problem.
Solution: Update the path of the image.
If the path contains (for example: \n or \t or \a) it adds to the corruption. Therefore, change every back-slash "\" with front-slash "/" and it will not make create error but fix the issue of reading path.
Also double check the file path/name. any typo in the name or path also gives the same error.
You have to delay
Example Code:
import cv2
import numpy as np
import time
cam = cv2.VideoCapture(0)
time.sleep(2)
while True:
ret,frame = cam.read()
cv2.imshow('webcam', frame)
if cv2.waitKey(1)&0xFF == ord('q'):
break
cam.release()
cv2.destroyAllWindows()
I have also met this issue. In my case, the image path is wrong, so the img read is NoneType. After I correct the image path, I can show it without any issue.
In these two lines:
mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
try instead:
cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
I had the same problem and the variables were being returned empty
I also met the error message in raspberry pi 3, but my solution is reload kernel of camera after search on google, hope it can help you.
sudo modprobe bcm2835-v4l2
BTW, for this error please check your camera and file path is workable or not
That error also shows when the video has played fine and the script will finish but that error always throws because the imshow() will get empty frames after all frames have been consumed.
That is especially the case if you are playing a short (few sec) video file and you don't notice that the video actually played on the background (behind your code editor) and after that the script ends with that error.
while(cap.isOpened()):
ret, img = cap.read()
print img
if img==None: #termino los frames?
break #si, entonces terminar programa
#gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img2',img)
cv2.circle and cv2.lines are not working. Mask and frame both are returning None. these functions (line and circle) are in opencv 3 but not in older versions.
I use ssh to connect to remote server and have python code execute cv2.VideoCapture(0) to capture remote webcam, then encounter this error message:
error: (-215)size.width>0 && size.height>0 in function imshow
Finally, I have to grant access to /dev/video0 (which is my webcam device) with my user account and the error message was gone. Use usermod to add user into group video
usermod -a -G video user
This is a problem with space consumption or choosing the wrong camera.
My suggestion in to restart kernel and clear output and run it again.
It works then.
Although this is an old thread, I got this error as well and the solution that worked for me is not mentioned here.
Simply put, in my case the webcam was still in use on the background, as I saw the LED light being on. I have not yet been able to reproduce the issue, so I'm not sure a simple cv2.VideoCapture(0).release() would have solved it. I'll edit this post if and when I have found it out.
For me a restart of my PC solved the issue, without changing anything to the code.
This Error can also occur if you slice a negative point and pass it to the array. So check if you did
I was facing the same problem while trying to open images containing spaces and special
characters like the following ´ in their names
So, after modifying the images names removing their spaces and special characters, everything worked perfectly.
Check if you have "opencv_ffmpeg330.dll" in python27 root directory or of the python version you are using. If not you will find it in "....\OpenCV\opencv\build\bin".
Choose the appropriate version and copy the dll into the root directory of your python installation and re-run the program
Simply use an image extension like .jpeg or .png.

OpenCV assertion error with sliced video frame

I am trying to slice a video capture frame for image data collection of hand gestures, so I thought an easy place to start would be to slice a video frame and write the frames from a specific part of the frame to a directory, but I am having this constant assertion error when I try to so much as show the sliced frame. I've searched for other solutions, but I can't figure it out
The code is
import numpy as np
t,r,b,l = 250, 500, 500,50
fgbg = cv2.BackgroundSubtractorMOG2()
cam = cv2.VideoCapture(0)
while cam.isOpened():
ret,frame = cam.read()
cv2.rectangle(frame,(l,t),(r,b),(255,0,0),2)
cv2.imshow('frame',frame)
(h,w) = frame.shape[:2]
roi = frame[t:b,r:l]
cv2.imshow('roi',roi) #giving error
if 0xFF & cv2.waitKey(1) == ord('q'):
break
cam.release()
cv2.destroyAllWindows()
I've also tried:
cv2.imshow('roi',roi.astype('uint8')
and
cv2.imshow('roi',np.asarray(roi,dtype='uint8'))
All are giving me the same error
I keep getting this error:
error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-kh7iq4w7\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
Edit: roi =frame[t:b,r:l]
keeps returning an empty list, how can i slice the ndarray frame so that I get a proper sliced array?
Any help would be really appreciated. Thank you
So it looks like the issue was entirely about the way it was being sliced:
my code was:
roi = frame[t:b, r:l] where the slice should be [rows, columns]
My mistake was slicing the columns right to left, instead of left to right.
roi = frame[t:b, l:r] gives the sliced frame as desired

black screen no output error in displaying video/webcam feed in OpenCV

I am new to OpenCV. I want to display video/webcam feed in OpenCV.I have written the following code
import cv2
cap = cv2.VideoCapture(0)
while True:
ret,img = cap.read()
cv2.imshow("Frame",img)
Instead of getting webcam feed or video, I get a black screen with no output as shown in the picture
You need to add cv.waitKey(1) or some other ms number as you wish. This will display a frame for 1 ms. Check the example here:
if cv2.waitKey(1) & 0xFF == ord('q'):
break

Realtime capture with 2 cameras in opencv

I'm trying to run a real-time Capture of 2 Usb-Cameras (same Reference)
USB-Camera_0 --> USB-port 0
USB-Camera_1 --> USB-port 1
I use This Code to make a real time capture for only one camera. To run the second camera (connected to the second usb-Port) at the same time I create another file with the same Code (changing the index 0-->1). I'm asking if it is possible to run this two real time capture in the same Code-file.
thanks
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Display the resulting frame
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

MOG background subtraction: history parameter not working

I'm trying to use MOG background subtraction but the "history" function doesn't seem to work.
OpenCV 2.4.13
Python (2.7.6)
Observation: The program appears to use the very first frame it captures for all future background subtractions.
Expectation: The background should slowly evolve based on the "history" parameter, so that if the camera angle changes, or if a person/object leaves the field-of-view, the "background" image will change accordingly.
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
mog = cv2.BackgroundSubtractorMOG(history=10, nmixtures=5, backgroundRatio=0.25)
while True:
ret, img1 = cap.read()
if ret is True:
cv2.imshow("original", img1)
img_mog = mog.apply(img1)
cv2.imshow("mog", img_mog)
if cv2.waitKey(10) & 0xFF == ord(q):
break
video_capture.release()
cv2.destroyAllWindows()
Thank you in advance for your help!

Categories