124 lines
2.8 KiB
Python
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())
|