Я использую плату Raspberry Pi Picamera для сбора данных, используя следующий код:
with picamera.PiCamera(
sensor_mode=4,
resolution='1640x1232',
framerate=30
) as camera:
camera.rotation = 180
camera.start_recording(StreamingOutput(), format='mjpeg')
try:
server = StreamingServer(('', 8000), StreamingHandler)
server.serve_forever()
finally:
camera.stop_recording()
class StreamingOutput:
def __init__(self):
self.frame = None
self.condition = threading.Condition()
self._buffer = io.BytesIO()
def write(self, buf):
if buf.startswith(b'\xff\xd8'):
# New frame, copy the existing buffer's content and notify all
# clients it's available
self._buffer.truncate()
with self.condition:
self.frame = self._buffer.getvalue()
self.condition.notify_all()
self._buffer.seek(0)
class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
allow_reuse_address = True
daemon_threads = True
class StreamingHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/capture.jpg':
with self._output.condition:
self._output.condition.wait()
frame = self._output.frame
# This works.
with open("frame.jpg", 'wb') as f:
f.write(frame)
# This produces a truncated image.
self.send_response(200)
self.send_header('Content-Type', 'image/jpeg')
self.send_header('Content-Length', len(frame))
self.end_headers()
self.wfile.write(frame)
Это самая ужасная вещь: хотя изображение будет сохраняться на диск просто отлично (frame.jpg полностью хорошо), оно получит усеченное изображение, если будет проходить через HTTP-сервер. Вот скриншот:
Я пробовал несколько разных вещей, и я зашел в тупик. Есть идеи?