I can run the same program in Windows. I can see my camera using lsusb in Ubuntu 16.04, 64 bits. The camera is an OSVR infrared camera.
My program is
import numpy as np
import cv2
camera = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = camera.read()
cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('camera', frame)
# k = cv2.waitKey(30)
# When everything done, release the capture
camera.release()
cv2.destroyAllWindows()
The results are:
cwu#ubuntu:~/project/osvrCamera$ python test.py
select timeout
select timeout
OpenCV Error: Assertion failed (!buf.empty() && buf.isContinuous()) in imdecode_, file /tmp/binarydeb/ros-kinetic-opencv3-3.1.0/modules/imgcodecs/src/loadsave.cpp, line 490
Traceback (most recent call last):
File "test.py", line 8, in <module>
ret, frame = camera.read()
cv2.error: /tmp/binarydeb/ros-kinetic-opencv3-3.1.0/modules/imgcodecs/src/loadsave.cpp:490: error: (-215) !buf.empty() && buf.isContinuous() in function imdecode_
Check if the frame isn't empty() first (maybe cam/frame isn't fully initialised when you try to convert/display it:
import numpy as np
import cv2
camera = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = camera.read()
if not frame.empty():
cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('camera', frame)
# k = cv2.waitKey(30)
# When everything done, release the capture
camera.release()
cv2.destroyAllWindows()
Related
I am trying to capture rtsp stream with opencv but it complains about the cv2.COLOR_BGR2RGB.
I have done several tries with streaming a different web-camera which working fine but not with the rtsp. The rtsp stream it self is working and tested fine with vlc. The rtsp stream it self is h264 format.
But, if I remark in the lines with the if statement it false, because the frame is empty!
import os
import cv2
import time
import argparse
import multiprocessing
import numpy as np
import tensorflow as tf
from utils.app_utils import FPS, WebcamVideoStream, HLSVideoStream
from multiprocessing import Queue, Pool
CWD_PATH = os.getcwd()
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-str', '--stream', dest="stream", action='store', type=str, default=None)
parser.add_argument('-src', '--source', dest='video_source', type=int,
default=0, help='Device index of the camera.')
parser.add_argument('-wd', '--width', dest='width', type=int,
default=640, help='Width of the frames in the video stream.')
parser.add_argument('-ht', '--height', dest='height', type=int,
default=480, help='Height of the frames in the video stream.')
parser.add_argument('-num-w', '--num-workers', dest='num_workers', type=int,
default=2, help='Number of workers.')
parser.add_argument('-q-size', '--queue-size', dest='queue_size', type=int,
default=5, help='Size of the queue.')
args = parser.parse_args()
logger = multiprocessing.log_to_stderr()
logger.setLevel(multiprocessing.SUBDEBUG)
input_q = Queue(maxsize=args.queue_size)
output_q = Queue(maxsize=args.queue_size)
print('Reading from webcam.')
#video_capture = WebcamVideoStream(src="rtsp://ip:port/stream",
# width=args.width,
# height=args.height).start()
frame_width = args.width
frame_height = args.height
print('Width:', frame_width, 'Height:', frame_height)
out = cv2.VideoWriter('output_test.avi', cv2.VideoWriter_fourcc('m','p','4','v'), 10, (frame_width,frame_height))
vcap = cv2.VideoCapture("rtsp://ip:port/stream", cv2.CAP_FFMPEG)
while True:
ret, frame = vcap.read()
#if ret == False:
# break
# Our operations on the frame come here
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
output_q.put(frame_rgb)
# Convert and store to out file
#output_rgb = cv2.cvtColor(output_q.get(), cv2.COLOR_RGB2BGR)
#out.write(output_rgb)
#cv2.imshow('VIDEO', output_rgb)
# Display the resulting frame
cv2.imshow('frame', frame_rgb)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#video_capture.stop()
out.release()
cv2.destroyAllWindows()
Which gives me an issue (without if statement):
[DEBUG/MainProcess] Queue._after_fork()
Reading from webcam.
Width: 640 Height: 480
Traceback (most recent call last):
File "testRTSP_try.py", line 52, in <module>
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
[INFO/MainProcess] process shutting down
Some more information:
Camera footage is from raspberry pi
RTSP stream created via:
raspivid -o - -t 0 -rot 180 -w 640 -h 480 -fps 25 -b 2000000 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:<port>/stream}' :demux=h264
RTSP stream monitored via windows vlc
I took a different approach by using motion instead see How to Make Raspberry Pi Webcam Server and Stream Live Video || Motion + Webcam + Raspberry Pi
This will setup a http stream instead of a rtsp!
I am running the below code to convert video into frames. Problem is it is creating Image files with 0 KB size and when I open it is not showing anything.. I don't understand what is creating the problem. Do I need to install any Image codecs?
'''
Using OpenCV takes a mp4 video and produces a number of images. I am using OpenCV 3.3.0 version and Python 2.7
Which will produce a folder called data with the images, There will be 2000+ images for example.mp4.
'''
import cv2
import numpy as np
import os
# Playing video from file:
try:
cap = cv2.VideoCapture('aa.mkv')
except:
print "Could not open video file"
raise
print cap.grab()
try:
if not os.path.exists('data'):
os.makedirs('data')
except OSError:
print ('Error: Creating directory of data')
currentFrame = 0
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
if not frame is None:
# Saves image of the current frame in jpg file
name = './data/frame' + str(currentFrame) + '.jpg'
print ('Creating...' + name)
cv2.imwrite(name, frame)
#cv2.imshow(name, frame)
else:
break
# To stop duplicate images
currentFrame += 1
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
You are not using imwrite function to write frames. Also your imshow function name is misspelled. I have made changes in your code. Try this:
import cv2
import numpy as np
import os
# Playing video from file:
cap = cv2.VideoCapture('aa.mkv')
try:
if not os.path.exists('data'):
os.makedirs('data')
except OSError:
print ('Error: Creating directory of data')
currentFrame = 0
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
if not frame is None:
# Saves image of the current frame in jpg file
name = './data/frame' + str(currentFrame) + '.jpg'
print ('Creating...' + name)
cv2.imwrite(name, frame)
cv2.imshow(name, frame)
else:
break
# To stop duplicate images
currentFrame += 1
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
I am trying to save video using videocapture object in openCv using python. But after pressing 'q' the video is saved as 'output.avi' but its size is showing as 0 KB. Need your help, not able to find out the error.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
#1.2. Gui Features in OpenCV 25
#OpenCV-Python Tutorials Documentation, Release 1
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
Here you need to play with fourCC code
FourCC code is passed as cv2.VideoWriter_fourcc('M','J','P','G') or cv2.VideoWriter_fourcc(*'MJPG) for MJPG.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
#fourcc = cv2.cv.CV_FOURCC(*'DIVX')
#out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
out = cv2.VideoWriter('output.avi', -1, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
For more read, OpenCV saving doc and FourCC doc
It maybe that the codecs for XVID is not properly installed.
(If you are using Jupyter Notebook, there would be jupyter logs begin with OpenCV: FFMPEG: ...)
If you are on linux, you could try to use the cv2.VideoWriter_fourcc(*'mp4v') as below:
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', -1, 20.0, (640,480))
Notice, the extension mp4 matters! Should choose the right extension matching the codec.
I install cv2 using pip command but it give error No matching
distribution found for cv2.
Below my is code
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Install opencv or cv2 using pip
I am trying to use background Substractor module in opencv. I am referring this blog. I am not able to use it because I again and again get the error message 'module' object has no attribute 'createBackgroundSubtractorMOG' , I have go-ogled through all the answers to this problem and I have tried using all the substrings possible like - createBackgroundSubtractor , BackgroundSubtractor , createBackgroundSubtractorMOG2 etc. but I again get the same error message. I am using -
opencv 3.0.0
python 2.7.10
ubuntu 15.10
here's my code--
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
fgbg = cv2.createBackgroundSubtractorMOG(detectShadows=True)
while(1):
ret, frame = cap.read()
fgmask = fgbg.apply(frame)
cv2.imshow('frame', fgmask)
k = cv2.waitKey(0)
if(k == 27):
break
cap.release()
cv2.destroyAllWindows()
Got my question solved. What i did , I opened python command line and wrote dir(cv2) and it listed me all the functions I can call and there I found BackgroundSubtractorMOG and it worked!