Added MLX90640 infrared camera plugin
This commit is contained in:
parent
d96a218c56
commit
d1d842ae95
4 changed files with 90 additions and 0 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -7,3 +7,6 @@
|
|||
[submodule "platypush/backend/http/static/flag-icons"]
|
||||
path = platypush/backend/http/static/flag-icons
|
||||
url = https://github.com/BlackLight/flag-icon-css.git
|
||||
[submodule "platypush/plugins/gpio/sensor/ir/mlx90640/lib"]
|
||||
path = platypush/plugins/camera/ir/mlx90640/lib
|
||||
url = https://github.com/pimoroni/mlx90640-library
|
||||
|
|
0
platypush/plugins/camera/ir/__init__.py
Normal file
0
platypush/plugins/camera/ir/__init__.py
Normal file
86
platypush/plugins/camera/ir/mlx90640/__init__.py
Normal file
86
platypush/plugins/camera/ir/mlx90640/__init__.py
Normal file
|
@ -0,0 +1,86 @@
|
|||
import os
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
from platypush.plugins import Plugin, action
|
||||
|
||||
|
||||
class CameraIrMlx90640Plugin(Plugin):
|
||||
"""
|
||||
Plugin to interact with a `ML90640 <https://shop.pimoroni.com/products/mlx90640-thermal-camera-breakout>`_
|
||||
infrared thermal camera.
|
||||
|
||||
In order to use this plugin you'll need to download and compile the
|
||||
`mlx90640 <https://github.com/pimoroni/mlx90640-library>`_ C++ bindings and examples for the device.
|
||||
Instructions on Raspbian::
|
||||
|
||||
# Install the dependencies
|
||||
$ [sudo] apt-get install libi2c-dev
|
||||
$ cd $PLATYPUSH_SRC_DIR
|
||||
$ git submodule init
|
||||
$ git submodule update
|
||||
$ cd platypush/plugins/camera/ir/mlx90640/lib
|
||||
$ make clean
|
||||
$ make bcm2835
|
||||
$ make examples/rawrgb I2C_MODE=LINUX
|
||||
|
||||
"""
|
||||
|
||||
_img_size = (24, 32)
|
||||
|
||||
def __init__(self, fps=16, skip_frames=2, scale_factor=10, rawrgb_path=None, **kwargs):
|
||||
"""
|
||||
:param fps: Frames per seconds (default: 16)
|
||||
:param skip_frames: Number of frames to be skipped on sensor initialization/warmup (default: 2)
|
||||
:param scale_factor: The camera outputs 24x32 pixels artifacts. Use scale_factor to scale them up to a larger image (default: 10)
|
||||
:param rawrgb_path: Specify it if the rawrgb executable compiled from
|
||||
https://github.com/pimoroni/mlx90640-library is in another folder than
|
||||
`<directory of this file>/lib/examples`.
|
||||
"""
|
||||
super().__init__(**kwargs)
|
||||
|
||||
if not rawrgb_path:
|
||||
rawrgb_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'lib', 'examples', 'rawrgb')
|
||||
|
||||
assert fps > 0
|
||||
assert skip_frames >= 0
|
||||
assert os.path.isfile(rawrgb_path)
|
||||
|
||||
self.fps = fps
|
||||
self.skip_frames = skip_frames
|
||||
self.scale_factor = scale_factor
|
||||
self.rawrgb_path = rawrgb_path
|
||||
|
||||
@action
|
||||
def capture(self, frames=1, skip_frames=None):
|
||||
"""
|
||||
Capture one or multiple frames and return them as raw RGB
|
||||
|
||||
:param frames: Number of frames to be captured (default: 1)
|
||||
:param skip_frames: If set it overrides the skip_frames parameter specified on the object (default: None)
|
||||
"""
|
||||
|
||||
if skip_frames is None:
|
||||
skip_frames = self.skip_frames
|
||||
|
||||
input_size = self._img_size[0] * self._img_size[1] * 3
|
||||
sleep_time = 1.0 / self.fps
|
||||
captured_frames = []
|
||||
|
||||
with subprocess.Popen([self.rawrgb_path, '{}'.format(self.fps)], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE) as camera:
|
||||
while len(captured_frames) < frames:
|
||||
frame = camera.stdout.read(input_size)
|
||||
size = len(frame)
|
||||
|
||||
if skip_frames > 0:
|
||||
time.sleep(sleep_time)
|
||||
skip_frames -= 1
|
||||
continue
|
||||
|
||||
captured_frames.append(frame)
|
||||
|
||||
return frames
|
||||
|
||||
|
||||
# vim:sw=4:ts=4:et:
|
1
platypush/plugins/camera/ir/mlx90640/lib
Submodule
1
platypush/plugins/camera/ir/mlx90640/lib
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit f4549dc6cc416f8db05a8bfd1d4850aee5e7af75
|
Loading…
Reference in a new issue