Terchila Marian
Terchila Marian

Reputation: 2520

picamera incorrect buffer length

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

Answers (1)

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

Related Questions