spidermqtt/spider-cam/spider-cam.py

124 lines
2.8 KiB
Python

import libcamera as libcam
import paho.mqtt.client as mqtt
import selectors
import sys
import time
import io
from PIL import Image
import mfb
image_count = 9999
def camera_name(camera):
return camera.id
def handle_camera_event(cm):
reqs = cm.get_ready_requests()
for req in reqs:
process_request(req)
def sendImage(plane):
image = Image.frombytes("RGBA", (800, 600), plane.tobytes())
pngBytes = io.BytesIO()
image.convert("RGB").save(pngBytes, "jpeg")
mqttc.publish("spider/telemetry/camfeed", pngBytes.getvalue())
#mqttc.publish("spider/telemetry/camfeed", plane.tobytes())
def process_request(request):
global camera, image_count
global mqttc
image_count += 1
if image_count > 0:
image_count = 0
print(f'Request completed: {request}')
requestMetadata = request.metadata
for id, value in requestMetadata.items():
print(f'\t{id.name} = {value}')
buffers = request.buffers
for _, buffer in buffers.items():
metadata = buffer.metadata
print(f' seq: {metadata.sequence:06} timestamp: {metadata.timestamp} bytesused: ' +
'/'.join([str(p.bytes_used) for p in metadata.planes]))
with mfb.MappedFrameBuffer(buffer) as mappedBuffer:
for plane in mappedBuffer.planes:
sendImage(plane)
request.reuse()
camera.queue_request(request)
def main():
global camera
global mqttc
mqttc = mqtt.Client()
mqttc.connect("mqtt.seeseepuff.be", 1883, 60)
mqttc.loop_start()
cm = libcam.CameraManager.singleton()
for camera in cm.cameras:
print(f' - {camera_name(camera)}')
if not cm.cameras:
print("No cameras were detected")
return -1
camera_id = cm.cameras[0].id
camera = cm.get(camera_id)
camera.acquire()
config = camera.generate_configuration([libcam.StreamRole.Viewfinder])
stream_config = config.at(0)
print(f'Default viewfinder configuration is: {stream_config}')
config.validate()
print(f'Validated viewfinder configuration is: {stream_config}')
camera.configure(config)
allocator = libcam.FrameBufferAllocator(camera)
for cfg in config:
allocated = allocator.allocate(cfg.stream)
print(f'Allocated {allocated} buffers for stream')
stream = stream_config.stream
buffers = allocator.buffers(stream)
requests = []
for i in range(len(buffers)):
request = camera.create_request()
buffer = buffers[i]
request.add_buffer(stream, buffer)
request.set_control(libcam.controls.Brightness, 0.5)
requests.append(request)
camera.start()
for request in requests:
camera.queue_request(request)
sel = selectors.DefaultSelector()
sel.register(cm.event_fd, selectors.EVENT_READ, lambda fd: handle_camera_event(cm))
start_time = time.time()
while True:
events = sel.select()
for key, mask in events:
key.data(key.fileobj)
camera.stop()
camera.release()
mqttc.disconnect()
mqttc.loop_stop()
sys.exit(main())