picamera错误的缓冲区长度

问题描述 投票:0回答:1

我目前正在使用pi摄像头模块通过烧瓶来传输视频,并在某些时候随机崩溃。我在这里找到一个similar question ,他们说清除流有助于他们解决此问题,但就我而言,它似乎不起作用。

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

这是我当前正在使用的代码,如上所述,我清除了流,但仍然收到错误。

# 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
python flask raspberry-pi3
1个回答
1
投票

我已经遇到相同的问题一段时间了。在测试不同版本的脚本时,我观察到,如果将分辨率配置为恰好为640x480,则不会发生此问题。它使我认为它可能与picamera版本有关。

在带有树莓派克星和v1摄像头模块(5Mp)且代码如下的rapsberry pi 4B中:

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

如果分辨率不同于640x480,则会遇到相同的问题。因此,我将picamera降级为1.10版本。

sudo pip3 uninstall picamera -y
sudo pip3 install "picamera[array]"==1.10

然后,它以所有分辨率和上述相同的代码重新开始工作。从网站获得了以下线索:

https://www.pyimagesearch.com/2016/08/29/common-errors-using-the-raspberry-pi-camera-module/

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.