Reputation: 2520
I am currently using a pi camera module to stream video using flask and at some point, it randomly crashes. I found a similar question over here and they say that clearing the stream helped them sort this out, but in my case, it doesn't seem to work.
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 1704, in capture_continuous
'Timed out waiting for capture to end')
picamera.exc.PiCameraRuntimeError: Timed out waiting for capture to end
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
File "/usr/lib/python3.7/threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "/home/pi/Desktop/secure-pi-tensorflow/securepi/pivideostream.py", line 39, in update
for f in self.stream:
File "/usr/lib/python3/dist-packages/picamera/camera.py", line 1710, in capture_continuous
encoder.close()
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 431, in close
self.stop()
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 419, in stop
self._close_output()
File "/usr/lib/python3/dist-packages/picamera/encoders.py", line 349, in _close_output
mo.close_stream(output, opened)
File "/usr/lib/python3/dist-packages/picamera/mmalobj.py", line 371, in close_stream
stream.flush()
File "/usr/lib/python3/dist-packages/picamera/array.py", line 238, in flush
self.array = bytes_to_rgb(self.getvalue(), self.size or self.camera.resolution)
File "/usr/lib/python3/dist-packages/picamera/array.py", line 127, in bytes_to_rgb
'Incorrect buffer length for resolution %dx%d' % (width, height))
picamera.exc.PiCameraValueError: Incorrect buffer length for resolution 1920x1080
this is the code that I am currently using and as said above I clear the stream but I still get the error.
# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
from threading import Thread
import cv2
class PiVideoStream:
def __init__(self, resolution=(320, 240), framerate=32, **kwargs):
# initialize the camera
self.camera = PiCamera()
# set camera parameters
self.camera.resolution = resolution
self.camera.framerate = framerate
# set optional camera parameters (refer to PiCamera docs)
for (arg, value) in kwargs.items():
setattr(self.camera, arg, value)
# initialize the stream
self.rawCapture = PiRGBArray(self.camera, size=resolution)
self.stream = self.camera.capture_continuous(self.rawCapture,
format="bgr", use_video_port=True)
# initialize the frame and the variable used to indicate
# if the thread should be stopped
self.frame = None
self.stopped = False
def start(self):
# start the thread to read frames from the video stream
t = Thread(target=self.update, args=())
t.daemon = True
t.start()
return self
def update(self):
# keep looping infinitely until the thread is stopped
for f in self.stream:
# grab the frame from the stream and clear the stream in
# preparation for the next frame
self.frame = f.array
self.rawCapture.truncate(0)
self.rawCapture.seek(0)
# if the thread indicator variable is set, stop the thread
# and resource camera resources
if self.stopped:
self.stream.close()
self.rawCapture.close()
self.camera.close()
return
def read(self):
# return the frame most recently read
return self.frame
def stop(self):
# indicate that the thread should be stopped
self.stopped = True
Upvotes: 0
Views: 2204
Reputation: 11
I've been experiencing the same problem for a while now. While testing different versions of scripts, I've observed that if the resolution was configured to exactly 640x480 the problem wouldn't happen. It made me think it could be related to the picamera version.
In a rapsberry pi 4B with raspbian Buster and v1 camera module (5Mp), and the code bellow:
import io
import picamera
from picamera import PiCamera
from picamera.array import PiRGBArray
import cv2 as cv
import time
import traceback
import sys
res = (1920, 1080) #(640, 480) #(1296, 976) # (640, 480)
print(res)
source = PiCamera()
source.resolution = res #
# source.start_preview()
source.framerate = 30
source.awb_mode = 'auto'
source.exposure_mode = 'auto' # ['night', 'nightpreview', 'backlight', 'spotlight', 'sports', 'snow',
# 'beach', 'verylong', 'fixedfps', 'antishake', 'fireworks']
source.image_denoise = True
source.image_effect = 'colorbalance'
source.image_effect_params = (1, 2, 1, 1)
time.sleep(2.1)
raw_capture = picamera.array.PiRGBArray(source)
# source.stop_preview()
raw_capture.truncate(0)
print(source)
print(raw_capture)
try:
for frame in source.capture_continuous(raw_capture, format="bgr", use_video_port=True):
local_frame = frame.array
cv.cvtColor(local_frame, cv.COLOR_BGR2RGB, dst=local_frame)
cv.imshow('frame', local_frame)
cv.waitKey(1)
raw_capture.truncate(0)
pass
except Exception as erro:
exctype, value = sys.exc_info()[:2]
print(exctype, value)
print(traceback.format_exc())
print(erro)
finally:
source.close()
cv.destroyAllWindows()
pass
I got the same problem if the resolution was different than 640x480. So I downgraded the picamera to the 1.10 version.
sudo pip3 uninstall picamera -y
sudo pip3 install "picamera[array]"==1.10
And then it started working again with all resolutions and the same code as above. Got this clue from the website:
https://www.pyimagesearch.com/2016/08/29/common-errors-using-the-raspberry-pi-camera-module/
Hope it helps.
Upvotes: 1