Added beter controls and an example. Improved documentation.

This commit is contained in:
simleek
2019-11-17 14:26:43 -07:00
parent 6b02f57780
commit decf7d7849
67 changed files with 1829 additions and 516 deletions
+2 -1
View File
@@ -4,8 +4,9 @@ Display any array, webcam, or video file.
display is a function that displays these in their own windows.
"""
__version__ = "0.7.1"
__version__ = "0.7.2"
from .window.subscriber_windows import display, breakpoint_display
from .frame.frame_updater import read_updates
from .frame.frame_publishing import publish_updates_zero_mq, publish_updates_ros
from . import effects
+9 -7
View File
@@ -24,13 +24,15 @@ class function_display_callback(object): # NOSONAR
"""
Used for running arbitrary functions on pixels.
>>> import random
>>> from displayarray.frame import FrameUpdater
>>> img = np.zeros((300, 300, 3))
>>> def fun(array, coords, finished):
... r,g,b = random.random()/20.0, random.random()/20.0, random.random()/20.0
... array[coords[0:2]] = (array[coords[0:2]] + [r,g,b])%1.0
>>> FrameUpdater(video_source=img, callbacks=function_display_callback(fun)).display()
.. code-block:: python
>>> import random
>>> from displayarray.frame import FrameUpdater
>>> img = np.zeros((300, 300, 3))
>>> def fun(array, coords, finished):
... r,g,b = random.random()/20.0, random.random()/20.0, random.random()/20.0
... array[coords[0:2]] = (array[coords[0:2]] + [r,g,b])%1.0
>>> FrameUpdater(video_source=img, callbacks=function_display_callback(fun)).display()
:param display_function: a function to run on the input image.
:param finish_function: a function to run on the input image when the other function finishes.
+2
View File
@@ -1 +1,3 @@
"""Effects to run on numpy arrays to make data clearer."""
from . import crop, lens, select_channels
+16 -23
View File
@@ -1,28 +1,21 @@
"""Crop any n-dimensional array."""
import numpy as np
from displayarray.input import mouse_loop
from ..input import mouse_loop
class Crop(object):
"""
A callback class that will return the input array cropped to the output size. N-dimensional.
>>> crop_it = Crop((2,2,2))
>>> arr = np.ones((4,4,4))
>>> crop_it(arr)
array([[[1., 1.],
[1., 1.]],
<BLANKLINE>
[[1., 1.],
[1., 1.]]])
"""
"""A callback class that will return the input array cropped to the output size. N-dimensional."""
def __init__(self, output_size=(64, 64, 3), center=None):
"""Create the cropper."""
"""
Create the cropping callback class.
:param output_size: Specified the size the input should be cropped to. Can be redefined later.
:param center: Specifies the center on the input array to take the crop out of.
"""
self._output_size = None
self._center = None
self._center = np.asarray([o // 2 for o in output_size])
self.odd_center = None
self.mouse_control = None
self.input_size = None
@@ -32,27 +25,27 @@ class Crop(object):
@property
def output_size(self):
"""Get the output size after cropping."""
"""Get the output size."""
return self._output_size
@output_size.setter
def output_size(self, set):
"""Set what the output size will be after cropping."""
"""Set the output size."""
self._output_size = set
if self._output_size is not None:
self._output_size = np.asarray(set)
@property
def center(self):
"""Get center crop position on the input."""
"""Get the center."""
return self._center
@center.setter
def center(self, set):
"""Set center crop position on the input."""
self._center = set
if self._center is not None:
self._center = np.asarray(set)
"""Set the center. Guarded so that colors need not be set."""
if set is not None:
for x in range(len(set)):
self._center[x] = set[x]
def __call__(self, arr):
"""Crop the input array to the specified output size. output is centered on self.center point on input."""
File diff suppressed because it is too large Load Diff
+8 -5
View File
@@ -48,7 +48,7 @@ class FrameUpdater(threading.Thread):
continue
def __apply_callbacks_to_frame(self, frame):
if frame is not None:
if frame is not None and not isinstance(frame, NoData):
try:
for c in self.callbacks:
frame_c = c(frame)
@@ -133,10 +133,13 @@ async def read_updates(
Read back all updates from the requested videos.
Example usage:
>>> from examples.videos import test_video
>>> f = 0
>>> for f, r in enumerate(read_updates(test_video, end_callback=lambda :f==2)):
... print(f"Frame:{f}. Array:{r}")
.. code-block:: python
>>> from examples.videos import test_video
>>> f = 0
>>> for f, r in enumerate(read_updates(test_video, end_callback=lambda :f==2)):
... print(f"Frame:{f}. Array:{r}")
"""
from displayarray.window import SubscriberWindows
+8 -3
View File
@@ -12,9 +12,14 @@ class NpCam(object):
assert isinstance(img, np.ndarray)
self.__img = img
self.__is_opened = True
self.__width = self.__img.shape[1]
self.__height = self.__img.shape[0]
if len(img.shape) > 0:
self.__height = self.__img.shape[0]
if len(self.__img.shape) > 1:
self.__width = self.__img.shape[1]
else:
self.__width = self.__height
else:
self.__width = self.__height = 1
self.__ratio = float(self.__width) / self.__height
self.__wait_for_ratio = False
+10 -6
View File
@@ -68,9 +68,11 @@ class mouse_loop(object): # NOSONAR
"""
Run a function on mouse information that is received by the window, continuously in a new thread.
>>> @mouse_loop
... def fun(mouse_event):
... print("x:{}, y:{}".format(mouse_event.x, mouse_event.y))
.. code-block:: python
>>> @mouse_loop
... def fun(mouse_event):
... print("x:{}, y:{}".format(mouse_event.x, mouse_event.y))
"""
def __init__(self, f):
@@ -126,9 +128,11 @@ class key_loop(object): # NOSONAR
"""
Run a function on mouse information that is received by the window, continuously in a new thread.
>>> @key_loop
... def fun(key):
... print("key pressed:{}".format(key))
.. code-block:: python
>>> @key_loop
... def fun(key):
... print("key pressed:{}".format(key))
"""
def __init__(self, f: Callable[[str], None]):
@@ -173,6 +173,7 @@ class SubscriberWindows(object):
if frame is not None:
self.frames[-1] = frame
self.__check_too_many_channels()
self.FRAME_DICT[self.input_vid_global_names[i]] = NoData()
self._display_frames(self.frames)
def update(self, arr: np.ndarray = None, id: str = None):
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,185 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>displayarray.__main__ &#8212; DisplayArray documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex/" />
<link rel="search" title="Search" href="../../../search/" />
<link rel="stylesheet" href="../../../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for displayarray.__main__</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">DisplayArray.</span>
<span class="sd">Display NumPy arrays.</span>
<span class="sd">Usage:</span>
<span class="sd"> displayarray (-w &lt;webcam-number&gt; | -v &lt;video-filename&gt; | -t &lt;topic-name&gt;[,dtype])... [-m &lt;msg-backend&gt;]</span>
<span class="sd"> displayarray -h</span>
<span class="sd"> displayarray --version</span>
<span class="sd">Options:</span>
<span class="sd"> -h, --help Show this help text.</span>
<span class="sd"> --version Show version number.</span>
<span class="sd"> -w &lt;webcam-number&gt;, --webcam=&lt;webcam-number&gt; Display video from a webcam.</span>
<span class="sd"> -v &lt;video-filename&gt;, --video=&lt;video-filename&gt; Display frames from a video file.</span>
<span class="sd"> -t &lt;topic-name&gt;, --topic=&lt;topic-name&gt; Display frames from a topic using the chosen message broker.</span>
<span class="sd"> -m &lt;msg-backend&gt;, --message-backend &lt;msg-backend&gt; Choose message broker backend. [Default: ROS]</span>
<span class="sd"> Currently supported: ROS, ZeroMQ</span>
<span class="sd"> --ros Use ROS as the backend message broker.</span>
<span class="sd"> --zeromq Use ZeroMQ as the backend message broker.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">docopt</span> <span class="k">import</span> <span class="n">docopt</span>
<span class="kn">import</span> <span class="nn">asyncio</span>
<div class="viewcode-block" id="main"><a class="viewcode-back" href="../../../displayarray_bash/#displayarray.__main__.main">[docs]</a><span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Process command line arguments.&quot;&quot;&quot;</span>
<span class="n">arguments</span> <span class="o">=</span> <span class="n">docopt</span><span class="p">(</span><span class="vm">__doc__</span><span class="p">,</span> <span class="n">argv</span><span class="o">=</span><span class="n">argv</span><span class="p">)</span>
<span class="k">if</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&quot;--version&quot;</span><span class="p">]:</span>
<span class="kn">from</span> <span class="nn">displayarray</span> <span class="k">import</span> <span class="n">__version__</span>
<span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;DisplayArray V</span><span class="si">{__version__}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="kn">from</span> <span class="nn">displayarray</span> <span class="k">import</span> <span class="n">display</span>
<span class="n">vids</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&quot;--webcam&quot;</span><span class="p">]]</span> <span class="o">+</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&quot;--video&quot;</span><span class="p">]</span>
<span class="n">v_disps</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">vids</span><span class="p">:</span>
<span class="n">v_disps</span> <span class="o">=</span> <span class="n">display</span><span class="p">(</span><span class="o">*</span><span class="n">vids</span><span class="p">,</span> <span class="n">blocking</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="kn">from</span> <span class="nn">displayarray.frame.frame_updater</span> <span class="k">import</span> <span class="n">read_updates_ros</span><span class="p">,</span> <span class="n">read_updates_zero_mq</span>
<span class="n">topics</span> <span class="o">=</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&quot;--topic&quot;</span><span class="p">]</span>
<span class="n">topics_split</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">topics</span><span class="p">]</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">display</span><span class="p">()</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">msg_recv</span><span class="p">():</span>
<span class="k">nonlocal</span> <span class="n">d</span>
<span class="k">while</span> <span class="n">d</span><span class="p">:</span>
<span class="k">if</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&quot;--message-backend&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;ROS&quot;</span><span class="p">:</span>
<span class="k">async</span> <span class="k">for</span> <span class="n">v_name</span><span class="p">,</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">read_updates_ros</span><span class="p">(</span>
<span class="p">[</span><span class="n">t</span> <span class="k">for</span> <span class="n">t</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">topics_split</span><span class="p">],</span> <span class="p">[</span><span class="n">d</span> <span class="k">for</span> <span class="n">t</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">topics_split</span><span class="p">]</span>
<span class="p">):</span>
<span class="n">d</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arr</span><span class="o">=</span><span class="n">frame</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">v_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">arguments</span><span class="p">[</span><span class="s2">&quot;--message-backend&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;ZeroMQ&quot;</span><span class="p">:</span>
<span class="k">async</span> <span class="k">for</span> <span class="n">v_name</span><span class="p">,</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">read_updates_zero_mq</span><span class="p">(</span>
<span class="o">*</span><span class="p">[</span><span class="nb">bytes</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">topics</span><span class="p">]</span>
<span class="p">):</span>
<span class="n">d</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arr</span><span class="o">=</span><span class="n">frame</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">v_name</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">update_vids</span><span class="p">():</span>
<span class="k">while</span> <span class="n">v_disps</span><span class="p">:</span>
<span class="k">if</span> <span class="n">v_disps</span><span class="p">:</span>
<span class="n">v_disps</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="k">async</span> <span class="k">def</span> <span class="nf">runner</span><span class="p">():</span>
<span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">wait</span><span class="p">([</span><span class="n">msg_recv</span><span class="p">(),</span> <span class="n">update_vids</span><span class="p">()])</span>
<span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span>
<span class="n">loop</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span><span class="n">runner</span><span class="p">())</span>
<span class="n">loop</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../../../">DisplayArray</a></h1>
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../displayarray_bash/">displayarray</a></li>
</ul>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../">Documentation overview</a><ul>
<li><a href="../../">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../../search/" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Simulator Leek.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
</html>
@@ -31,16 +31,24 @@
<div class="body" role="main">
<h1>Source code for displayarray.effects.crop</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span></span><span class="sd">&quot;&quot;&quot;Crop any n-dimensional array.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">..input</span> <span class="k">import</span> <span class="n">mouse_loop</span>
<div class="viewcode-block" id="Crop"><a class="viewcode-back" href="../../../../crop/#displayarray.effects.crop.Crop">[docs]</a><span class="k">class</span> <span class="nc">Crop</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="Crop"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.crop.Crop">[docs]</a><span class="k">class</span> <span class="nc">Crop</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A callback class that will return the input array cropped to the output size. N-dimensional.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_size</span><span class="o">=</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span> <span class="n">center</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create the cropping callback class.</span>
<span class="sd"> :param output_size: Specified the size the input should be cropped to. Can be redefined later.</span>
<span class="sd"> :param center: Specifies the center on the input array to take the crop out of.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_output_size</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="n">o</span> <span class="o">//</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">output_size</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">odd_center</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="o">=</span> <span class="kc">None</span>
@@ -50,23 +58,27 @@
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">output_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get the output size.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_output_size</span>
<span class="nd">@output_size</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">output_size</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Set the output size.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_output_size</span> <span class="o">=</span> <span class="nb">set</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_output_size</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_output_size</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="nb">set</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">center</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Get the center.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span>
<span class="nd">@center</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">center</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="nb">set</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="nb">set</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;Set the center. Guarded so that colors need not be set.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">set</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">)):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="nb">set</span><span class="p">[</span><span class="n">x</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Crop the input array to the specified output size. output is centered on self.center point on input.&quot;&quot;&quot;</span>
@@ -119,8 +131,8 @@
<span class="n">out_array</span><span class="p">[</span><span class="n">put_slices</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">get_slices</span><span class="p">]</span>
<span class="k">return</span> <span class="n">out_array</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">dtype</span><span class="p">)</span>
<div class="viewcode-block" id="Crop.enable_mouse_control"><a class="viewcode-back" href="../../../../crop/#displayarray.effects.crop.Crop.enable_mouse_control">[docs]</a> <span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Move the mouse to move where the crop is from on the original image&quot;&quot;&quot;</span>
<div class="viewcode-block" id="Crop.enable_mouse_control"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.crop.Crop.enable_mouse_control">[docs]</a> <span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Move the mouse to move where the crop is from on the original image.&quot;&quot;&quot;</span>
<span class="nd">@mouse_loop</span>
<span class="k">def</span> <span class="nf">m_loop</span><span class="p">(</span><span class="n">me</span><span class="p">):</span>
@@ -154,13 +166,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
@@ -31,87 +31,159 @@
<div class="body" role="main">
<h1>Source code for displayarray.effects.lens</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span></span><span class="sd">&quot;&quot;&quot;Create lens effects. Currently only 2D+color arrays are supported.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">..input</span> <span class="k">import</span> <span class="n">mouse_loop</span>
<span class="kn">import</span> <span class="nn">cv2</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">torch</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="n">torch</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># type: ignore</span>
<div class="viewcode-block" id="ControllableLens"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.ControllableLens">[docs]</a><span class="k">class</span> <span class="nc">ControllableLens</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A lens callback that can be controlled by the program or the user.&quot;&quot;&quot;</span>
<span class="k">class</span> <span class="nc">ControllableLens</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_bleed</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">zoom</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="o">=</span> <span class="n">center</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
<span class="sd">&quot;&quot;&quot;Create the lens callback.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="n">center</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zoom</span> <span class="o">=</span> <span class="n">zoom</span>
<span class="bp">self</span><span class="o">.</span><span class="n">use_bleed</span> <span class="o">=</span> <span class="n">use_bleed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bleed</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">check_setup_bleed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">_check_setup_bleed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bleed</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_bleed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bleed</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">run_bleed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<div class="viewcode-block" id="ControllableLens.run_bleed"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.ControllableLens.run_bleed">[docs]</a> <span class="k">def</span> <span class="nf">run_bleed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Spread color outwards, like food coloring in water.&quot;&quot;&quot;</span>
<span class="n">arr</span><span class="p">[</span><span class="n">y</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">arr</span><span class="p">[(</span><span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="o">...</span><span class="p">]</span> <span class="o">+</span> <span class="n">arr</span><span class="p">[(</span><span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="o">...</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">arr</span><span class="p">[:,</span> <span class="n">x</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">arr</span><span class="p">[:,</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="o">...</span><span class="p">]</span> <span class="o">+</span> <span class="n">arr</span><span class="p">[:,</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="o">...</span><span class="p">]</span>
<span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
<span class="p">)</span> <span class="o">/</span> <span class="mi">2</span></div></div>
<div class="viewcode-block" id="Barrel"><a class="viewcode-back" href="../../../../lens/#displayarray.effects.lens.Barrel">[docs]</a><span class="k">class</span> <span class="nc">Barrel</span><span class="p">(</span><span class="n">ControllableLens</span><span class="p">):</span>
<div class="viewcode-block" id="Barrel"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.Barrel">[docs]</a><span class="k">class</span> <span class="nc">Barrel</span><span class="p">(</span><span class="n">ControllableLens</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A barrel lens distortion callback.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">use_bleed</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">barrel_power</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">pincushion_power</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">zoom</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create the barrel lens distortion callback.&quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">use_bleed</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">center</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="o">=</span> <span class="n">center</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="n">center</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zoom</span> <span class="o">=</span> <span class="n">zoom</span>
<span class="bp">self</span><span class="o">.</span><span class="n">use_bleed</span> <span class="o">=</span> <span class="n">use_bleed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bleed</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span> <span class="o">=</span> <span class="n">barrel_power</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_barrel_power</span> <span class="o">=</span> <span class="n">barrel_power</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="Barrel.enable_mouse_control"><a class="viewcode-back" href="../../../../lens/#displayarray.effects.lens.Barrel.enable_mouse_control">[docs]</a> <span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">center</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Guarded get center. Limits to within input.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">[</span>
<span class="nb">min</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">s</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">)</span>
<span class="p">]</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span>
<span class="nd">@center</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">center</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">setpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Guarded set center. Limits to within input.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">setpoint</span> <span class="o">=</span> <span class="p">[</span>
<span class="nb">min</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">s</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">setpoint</span><span class="p">)</span>
<span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">setpoint</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">zoom</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Guarded zoom. Avoids divide by zero conditions.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zoom</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="mf">1e-15</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_zoom</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">barrel_power</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Guarded barrel power. Avoids divide by zero conditions.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_barrel_power</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="mf">1e-15</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_barrel_power</span>
<span class="nd">@barrel_power</span><span class="o">.</span><span class="n">setter</span>
<span class="k">def</span> <span class="nf">barrel_power</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">setpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Set the barrel power.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_barrel_power</span> <span class="o">=</span> <span class="n">setpoint</span>
<span class="nd">@zoom</span><span class="o">.</span><span class="n">setter</span> <span class="c1"># type: ignore</span>
<span class="k">def</span> <span class="nf">zoom</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">setpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Set the zoom power.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_zoom</span> <span class="o">=</span> <span class="n">setpoint</span>
<div class="viewcode-block" id="Barrel.enable_mouse_control"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.Barrel.enable_mouse_control">[docs]</a> <span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">crop_size</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Move the mouse to center the image, scroll to increase/decrease barrel, ctrl+scroll to increase/decrease zoom</span>
<span class="sd"> Enable the default mouse controls.</span>
<span class="sd"> Move the mouse to center the image</span>
<span class="sd"> scroll to increase/decrease barrel</span>
<span class="sd"> ctrl+scroll to increase/decrease zoom</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@mouse_loop</span>
<span class="k">def</span> <span class="nf">m_loop</span><span class="p">(</span><span class="n">me</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">me</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">me</span><span class="o">.</span><span class="n">x</span><span class="p">]</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">event</span> <span class="o">==</span> <span class="n">cv2</span><span class="o">.</span><span class="n">EVENT_MOUSEWHEEL</span><span class="p">:</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">cv2</span><span class="o">.</span><span class="n">EVENT_FLAG_CTRLKEY</span><span class="p">:</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">flags</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">*=</span> <span class="mf">1.1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">/=</span> <span class="mf">1.1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">crop_size</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">me</span><span class="o">.</span><span class="n">y</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">crop_size</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
<span class="n">me</span><span class="o">.</span><span class="n">x</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">input_size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="n">crop_size</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
<span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">flags</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span> <span class="o">*=</span> <span class="mf">1.1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="o">=</span> <span class="p">[</span><span class="n">me</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">me</span><span class="o">.</span><span class="n">x</span><span class="p">]</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">event</span> <span class="o">==</span> <span class="n">cv2</span><span class="o">.</span><span class="n">EVENT_MOUSEWHEEL</span><span class="p">:</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">cv2</span><span class="o">.</span><span class="n">EVENT_FLAG_CTRLKEY</span><span class="p">:</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">flags</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">*=</span> <span class="mf">1.1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">/=</span> <span class="mf">1.1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span> <span class="o">/=</span> <span class="mf">1.1</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">flags</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span> <span class="o">*=</span> <span class="mf">1.1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span> <span class="o">/=</span> <span class="mf">1.1</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="n">m_loop</span>
<span class="k">return</span> <span class="bp">self</span></div>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Run the lens distortion algorithm on the input.&quot;&quot;&quot;</span>
<span class="n">zoom_out</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span>
<span class="bp">self</span><span class="o">.</span><span class="n">check_setup_bleed</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_setup_bleed</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="o">=</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">]</span>
<span class="n">y2_</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span> <span class="o">*</span> <span class="n">zoom_out</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">x2_</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span> <span class="o">*</span> <span class="n">zoom_out</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">p2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">x2_</span><span class="p">,</span> <span class="n">y2_</span><span class="p">))</span>
<span class="n">cy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">cx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">barrel_power</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span>
<span class="n">cy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">cx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">theta</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">p2</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">p2</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">p2</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">ord</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">radius</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="n">barrel_power</span><span class="p">)</span>
<span class="n">radius</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span><span class="p">)</span>
<span class="n">x_new</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">radius</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">+</span> <span class="n">cx</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">x_new</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">clip</span><span class="p">(</span><span class="n">x_new</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
@@ -135,10 +207,54 @@
<span class="k">return</span> <span class="n">arr</span></div>
<div class="viewcode-block" id="Mustache"><a class="viewcode-back" href="../../../../lens/#displayarray.effects.lens.Mustache">[docs]</a><span class="k">class</span> <span class="nc">Mustache</span><span class="p">(</span><span class="n">ControllableLens</span><span class="p">):</span>
<div class="viewcode-block" id="BarrelPyTorch"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.BarrelPyTorch">[docs]</a><span class="k">class</span> <span class="nc">BarrelPyTorch</span><span class="p">(</span><span class="n">Barrel</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A barrel distortion callback class accelerated by PyTorch.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Run a pytorch accelerated lens distortion algorithm on the input.&quot;&quot;&quot;</span>
<span class="n">zoom_out</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span>
<span class="bp">self</span><span class="o">.</span><span class="n">input_size</span> <span class="o">=</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">FloatTensor</span><span class="p">)</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">FloatTensor</span><span class="p">)</span><span class="o">.</span><span class="n">cuda</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_center</span> <span class="o">=</span> <span class="p">[</span><span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">]</span>
<span class="n">y2_</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="p">(</span><span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span> <span class="o">*</span> <span class="n">zoom_out</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">x2_</span> <span class="o">=</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">))</span> <span class="o">*</span> <span class="n">zoom_out</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">p2</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">stack</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">x2_</span><span class="p">,</span> <span class="n">y2_</span><span class="p">))</span>
<span class="n">cy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">cx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_center</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">theta</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="n">p2</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">p2</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">p2</span><span class="p">,</span> <span class="n">dim</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">radius</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">pow</span><span class="p">(</span><span class="n">radius</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span><span class="p">)</span>
<span class="n">x_new</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">radius</span> <span class="o">*</span> <span class="n">torch</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">+</span> <span class="n">cx</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">x_new</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">clamp</span><span class="p">(</span><span class="n">x_new</span> <span class="o">*</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">y_new</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">radius</span> <span class="o">*</span> <span class="n">torch</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">+</span> <span class="n">cy</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">y_new</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">clamp</span><span class="p">(</span><span class="n">y_new</span> <span class="o">*</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">stack</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">([</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]))</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">IntTensor</span><span class="p">)</span>
<span class="n">p_new</span> <span class="o">=</span> <span class="n">torch</span><span class="o">.</span><span class="n">stack</span><span class="p">((</span><span class="n">x_new</span><span class="p">,</span> <span class="n">y_new</span><span class="p">))</span>
<span class="n">p_new</span> <span class="o">=</span> <span class="n">p_new</span><span class="o">.</span><span class="n">type</span><span class="p">(</span><span class="n">torch</span><span class="o">.</span><span class="n">IntTensor</span><span class="p">)</span>
<span class="n">arr</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="n">p_new</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">p_new</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="p">:]</span>
<span class="k">return</span> <span class="n">arr</span></div>
<div class="viewcode-block" id="Mustache"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.Mustache">[docs]</a><span class="k">class</span> <span class="nc">Mustache</span><span class="p">(</span><span class="n">ControllableLens</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;A mustache distortion callback.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">use_bleed</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">barrel_power</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">pincushion_power</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">zoom</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create the mustache distortion callback.&quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">use_bleed</span><span class="p">,</span> <span class="n">zoom</span><span class="p">,</span> <span class="n">center</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span> <span class="o">=</span> <span class="n">center</span>
<span class="bp">self</span><span class="o">.</span><span class="n">zoom</span> <span class="o">=</span> <span class="n">zoom</span>
@@ -148,7 +264,15 @@
<span class="bp">self</span><span class="o">.</span><span class="n">pincushion_power</span> <span class="o">=</span> <span class="n">pincushion_power</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="Mustache.enable_mouse_control"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.lens.Mustache.enable_mouse_control">[docs]</a> <span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Enable the default mouse loop to control the mustache distortion.</span>
<span class="sd"> ctrl+scroll wheel: zoom in and out</span>
<span class="sd"> shift+scroll wheel: adjust pincushion power</span>
<span class="sd"> scroll wheel: adjust barrel power</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@mouse_loop</span>
<span class="k">def</span> <span class="nf">m_loop</span><span class="p">(</span><span class="n">me</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">[:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">me</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="n">me</span><span class="o">.</span><span class="n">x</span><span class="p">]</span>
@@ -169,11 +293,12 @@
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">barrel_power</span> <span class="o">/=</span> <span class="mf">1.1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="n">m_loop</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="n">m_loop</span></div>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Run the mustache distortion algorithm on the input numpy array.&quot;&quot;&quot;</span>
<span class="n">zoom_out</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">zoom</span>
<span class="bp">self</span><span class="o">.</span><span class="n">check_setup_bleed</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_setup_bleed</span><span class="p">(</span><span class="n">arr</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
@@ -234,13 +359,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
@@ -31,13 +31,24 @@
<div class="body" role="main">
<h1>Source code for displayarray.effects.select_channels</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span></span><span class="sd">&quot;&quot;&quot;Reduce many color images to the three colors that your eyeballs can see.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">..input</span> <span class="k">import</span> <span class="n">mouse_loop</span>
<span class="kn">import</span> <span class="nn">cv2</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Iterable</span>
<div class="viewcode-block" id="SelectChannels"><a class="viewcode-back" href="../../../../select_channels/#displayarray.effects.select_channels.SelectChannels">[docs]</a><span class="k">class</span> <span class="nc">SelectChannels</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">selected_channels</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="SelectChannels"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.select_channels.SelectChannels">[docs]</a><span class="k">class</span> <span class="nc">SelectChannels</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Select channels to display from an array with too many colors.</span>
<span class="sd"> :param selected_channels: the list of channels to display.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">selected_channels</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Select which channels from the input array to display in the output.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">selected_channels</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">selected_channels</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">selected_channels</span> <span class="o">=</span> <span class="n">selected_channels</span>
@@ -46,6 +57,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">num_input_channels</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arr</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Run the channel selector.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">num_input_channels</span> <span class="o">=</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">out_arr</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">arr</span><span class="p">[</span><span class="o">...</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">),</span> <span class="n">arr</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">selected_channels</span>
@@ -53,7 +65,15 @@
<span class="n">out_arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">stack</span><span class="p">(</span><span class="n">out_arr</span><span class="p">,</span> <span class="n">axis</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="n">out_arr</span>
<span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="SelectChannels.enable_mouse_control"><a class="viewcode-back" href="../../../../effects/#displayarray.effects.select_channels.SelectChannels.enable_mouse_control">[docs]</a> <span class="k">def</span> <span class="nf">enable_mouse_control</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Enable mouse control.</span>
<span class="sd"> Alt+Scroll to increase/decrease channel 2.</span>
<span class="sd"> Shift+Scroll to increase/decrease channel 1.</span>
<span class="sd"> Ctrl+scroll to increase/decrease channel 0.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nd">@mouse_loop</span>
<span class="k">def</span> <span class="nf">m_loop</span><span class="p">(</span><span class="n">me</span><span class="p">):</span>
<span class="k">if</span> <span class="n">me</span><span class="o">.</span><span class="n">event</span> <span class="o">==</span> <span class="n">cv2</span><span class="o">.</span><span class="n">EVENT_MOUSEWHEEL</span><span class="p">:</span>
@@ -91,7 +111,7 @@
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mouse_print_channels</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="s2">&quot;Channel 2 now maps to </span><span class="si">{self.selected_channels[2]}</span><span class="s2">.&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="n">m_loop</span></div>
<span class="bp">self</span><span class="o">.</span><span class="n">mouse_control</span> <span class="o">=</span> <span class="n">m_loop</span></div></div>
</pre></div>
</div>
@@ -112,13 +132,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
@@ -31,7 +31,8 @@
<div class="body" role="main">
<h1>Source code for displayarray.frame.frame_publishing</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">sys</span>
<span></span><span class="sd">&quot;&quot;&quot;Publish frames so any function within this program can find them.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">asyncio</span>
@@ -41,7 +42,7 @@
<span class="kn">from</span> <span class="nn">displayarray.frame</span> <span class="k">import</span> <span class="n">subscriber_dictionary</span>
<span class="kn">from</span> <span class="nn">.np_to_opencv</span> <span class="k">import</span> <span class="n">NpCam</span>
<span class="kn">from</span> <span class="nn">displayarray.uid</span> <span class="k">import</span> <span class="n">uid_for_source</span>
<span class="kn">from</span> <span class="nn">displayarray._uid</span> <span class="k">import</span> <span class="n">uid_for_source</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Callable</span>
@@ -146,6 +147,7 @@
<span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">track</span><span class="o">=</span><span class="kc">False</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Publish frames to ZeroMQ when they&#39;re updated.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">zmq</span>
<span class="kn">from</span> <span class="nn">displayarray</span> <span class="k">import</span> <span class="n">read_updates</span>
@@ -193,6 +195,7 @@
<span class="n">rate_hz</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">dtype</span><span class="o">=</span><span class="kc">None</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Publish frames to ROS when they&#39;re updated.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">rospy</span>
<span class="kn">from</span> <span class="nn">rospy.numpy_msg</span> <span class="k">import</span> <span class="n">numpy_msg</span>
<span class="kn">import</span> <span class="nn">std_msgs.msg</span>
@@ -220,7 +223,7 @@
<span class="p">)</span> <span class="c1"># allow users to use their own custom messages in numpy arrays</span>
<span class="k">return</span> <span class="n">msg_type</span>
<span class="n">publishers</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">publishers</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">rospy</span><span class="o">.</span><span class="n">Publisher</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">rospy</span><span class="o">.</span><span class="n">init_node</span><span class="p">(</span><span class="n">node_name</span><span class="p">,</span> <span class="n">anonymous</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">read_updates</span><span class="p">(</span><span class="n">vids</span><span class="p">,</span> <span class="n">callbacks</span><span class="p">,</span> <span class="n">fps_limit</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">end_callback</span><span class="p">,</span> <span class="n">blocking</span><span class="p">):</span>
@@ -268,13 +271,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
@@ -31,14 +31,16 @@
<div class="body" role="main">
<h1>Source code for displayarray.frame.frame_updater</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">threading</span>
<span></span><span class="sd">&quot;&quot;&quot;Get and handle updated frames.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">asyncio</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Dict</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">displayarray.callbacks</span> <span class="k">import</span> <span class="n">global_cv_display_callback</span>
<span class="kn">from</span> <span class="nn">displayarray.uid</span> <span class="k">import</span> <span class="n">uid_for_source</span>
<span class="kn">from</span> <span class="nn">displayarray._uid</span> <span class="k">import</span> <span class="n">uid_for_source</span>
<span class="kn">from</span> <span class="nn">displayarray.frame</span> <span class="k">import</span> <span class="n">subscriber_dictionary</span>
<span class="kn">from</span> <span class="nn">displayarray.frame.frame_publishing</span> <span class="k">import</span> <span class="n">pub_cam_thread</span>
<span class="kn">from</span> <span class="nn">displayarray.window</span> <span class="k">import</span> <span class="n">window_commands</span>
@@ -59,6 +61,7 @@
<span class="n">high_speed</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">fps_limit</span><span class="p">:</span> <span class="nb">float</span> <span class="o">=</span> <span class="mi">240</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create the frame updater thread.&quot;&quot;&quot;</span>
<span class="nb">super</span><span class="p">(</span><span class="n">FrameUpdater</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">loop</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cam_id</span> <span class="o">=</span> <span class="n">uid_for_source</span><span class="p">(</span><span class="n">video_source</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">video_source</span> <span class="o">=</span> <span class="n">video_source</span>
@@ -78,7 +81,7 @@
<span class="k">continue</span>
<span class="k">def</span> <span class="nf">__apply_callbacks_to_frame</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span>
<span class="k">if</span> <span class="n">frame</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">frame</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">NoData</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">callbacks</span><span class="p">:</span>
<span class="n">frame_c</span> <span class="o">=</span> <span class="n">c</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
@@ -148,20 +151,28 @@
<div class="viewcode-block" id="read_updates"><a class="viewcode-back" href="../../../../frame/#displayarray.read_updates">[docs]</a><span class="k">async</span> <span class="k">def</span> <span class="nf">read_updates</span><span class="p">(</span>
<span class="o">*</span><span class="n">vids</span><span class="p">,</span>
<span class="n">callbacks</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span>
<span class="n">Union</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="n">Any</span><span class="p">,</span> <span class="n">FrameCallable</span><span class="p">],</span> <span class="n">List</span><span class="p">[</span><span class="n">FrameCallable</span><span class="p">],</span> <span class="n">FrameCallable</span><span class="p">]</span>
<span class="n">Union</span><span class="p">[</span>
<span class="n">Dict</span><span class="p">[</span><span class="n">Any</span><span class="p">,</span> <span class="n">Union</span><span class="p">[</span><span class="n">FrameCallable</span><span class="p">,</span> <span class="n">List</span><span class="p">[</span><span class="n">FrameCallable</span><span class="p">]]],</span>
<span class="n">List</span><span class="p">[</span><span class="n">FrameCallable</span><span class="p">],</span>
<span class="n">FrameCallable</span><span class="p">,</span>
<span class="p">]</span>
<span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">fps_limit</span><span class="o">=</span><span class="nb">float</span><span class="p">(</span><span class="s2">&quot;inf&quot;</span><span class="p">),</span>
<span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">),</span>
<span class="n">end_callback</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[],</span> <span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">blocking</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Reads back all updates from the requested videos.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Read back all updates from the requested videos.</span>
<span class="sd"> Example usage:</span>
<span class="sd"> &gt;&gt;&gt; from examples.videos import test_video</span>
<span class="sd"> &gt;&gt;&gt; f = 0</span>
<span class="sd"> &gt;&gt;&gt; for f, r in enumerate(read_updates(test_video, end_callback=lambda :f==2)):</span>
<span class="sd"> ... print(f&quot;Frame:{f}. Array:{r}&quot;)</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> &gt;&gt;&gt; from examples.videos import test_video</span>
<span class="sd"> &gt;&gt;&gt; f = 0</span>
<span class="sd"> &gt;&gt;&gt; for f, r in enumerate(read_updates(test_video, end_callback=lambda :f==2)):</span>
<span class="sd"> ... print(f&quot;Frame:{f}. Array:{r}&quot;)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">displayarray.window</span> <span class="k">import</span> <span class="n">SubscriberWindows</span>
@@ -201,13 +212,14 @@
<span class="k">async</span> <span class="k">def</span> <span class="nf">read_updates_zero_mq</span><span class="p">(</span>
<span class="o">*</span><span class="n">topic_names</span><span class="p">,</span>
<span class="n">address</span><span class="o">=</span><span class="s2">&quot;tcp://127.0.0.1:5600&quot;</span><span class="p">,</span>
<span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">copy</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">track</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">blocking</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">end_callback</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">Any</span><span class="p">],</span> <span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">address</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;tcp://127.0.0.1:5600&quot;</span><span class="p">,</span>
<span class="n">flags</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="n">copy</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
<span class="n">track</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">blocking</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">end_callback</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">Any</span><span class="p">],</span> <span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read updated frames from ZeroMQ.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">zmq</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">zmq</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
@@ -243,8 +255,9 @@
<span class="n">dtypes</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">listener_node_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">poll_rate_hz</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">end_callback</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">Any</span><span class="p">],</span> <span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">end_callback</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">Any</span><span class="p">],</span> <span class="nb">bool</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Read updated frames from ROS.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">rospy</span>
<span class="kn">from</span> <span class="nn">rospy.numpy_msg</span> <span class="k">import</span> <span class="n">numpy_msg</span>
<span class="kn">from</span> <span class="nn">rospy.client</span> <span class="k">import</span> <span class="n">_WFM</span>
@@ -322,7 +335,8 @@
<span class="k">pass</span>
<span class="k">finally</span><span class="p">:</span>
<span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">unregister</span><span class="p">()</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">s</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">sub</span><span class="o">.</span><span class="n">unregister</span><span class="p">()</span>
<span class="k">if</span> <span class="n">rospy</span><span class="o">.</span><span class="n">core</span><span class="o">.</span><span class="n">is_shutdown</span><span class="p">():</span>
<span class="k">raise</span> <span class="n">rospy</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">ROSInterruptException</span><span class="p">(</span><span class="s2">&quot;rospy shutdown&quot;</span><span class="p">)</span>
</pre></div>
@@ -345,13 +359,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
@@ -31,7 +31,9 @@
<div class="body" role="main">
<h1>Source code for displayarray.frame.get_frame_ids</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">cv2</span>
<span></span><span class="sd">&quot;&quot;&quot;Get camera IDs.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">cv2</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">List</span>
@@ -67,13 +69,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
@@ -31,7 +31,9 @@
<div class="body" role="main">
<h1>Source code for displayarray.frame.np_to_opencv</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span></span><span class="sd">&quot;&quot;&quot;Allow OpenCV to handle numpy arrays as input.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">cv2</span>
@@ -39,12 +41,18 @@
<span class="sd">&quot;&quot;&quot;Add OpenCV camera controls to a numpy array.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">img</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create a fake camera for OpenCV based on the initial array.&quot;&quot;&quot;</span>
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">img</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__img</span> <span class="o">=</span> <span class="n">img</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__is_opened</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__img</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__height</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__img</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__height</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__img</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__img</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__img</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__height</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__height</span> <span class="o">=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__ratio</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__width</span><span class="p">)</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">__height</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__wait_for_ratio</span> <span class="o">=</span> <span class="kc">False</span>
@@ -105,13 +113,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>
+34 -14
View File
@@ -31,7 +31,9 @@
<div class="body" role="main">
<h1>Source code for displayarray.input</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span> <span class="nn">displayarray.window</span> <span class="k">import</span> <span class="n">window_commands</span>
<span></span><span class="sd">&quot;&quot;&quot;Decorators for creating input loops that OpenCV handles.&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">displayarray.window</span> <span class="k">import</span> <span class="n">window_commands</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">time</span>
@@ -42,6 +44,7 @@
<span class="sd">&quot;&quot;&quot;Holds all the OpenCV mouse event information.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">param</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create an OpenCV mouse event.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">event</span> <span class="o">=</span> <span class="n">event</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">y</span>
@@ -95,10 +98,21 @@
<div class="viewcode-block" id="mouse_loop"><a class="viewcode-back" href="../../../input/#displayarray.input.mouse_loop">[docs]</a><span class="k">class</span> <span class="nc">mouse_loop</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># NOSONAR</span>
<span class="sd">&quot;&quot;&quot;Run a function on mouse information that is received by the window, continuously in a new thread.&quot;&quot;&quot;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Run a function on mouse information that is received by the window, continuously in a new thread.</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">run_when_no_events</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_mouse_loop_thread</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">run_when_no_events</span><span class="p">))</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> &gt;&gt;&gt; @mouse_loop</span>
<span class="sd"> ... def fun(mouse_event):</span>
<span class="sd"> ... print(&quot;x:{}, y:{}&quot;.format(mouse_event.x, mouse_event.y))</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Start a new mouse thread for the decorated function.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span>
<span class="n">target</span><span class="o">=</span><span class="n">_mouse_loop_thread</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">run_when_no_events</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
@@ -144,10 +158,19 @@
<div class="viewcode-block" id="key_loop"><a class="viewcode-back" href="../../../input/#displayarray.input.key_loop">[docs]</a><span class="k">class</span> <span class="nc">key_loop</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="c1"># NOSONAR</span>
<span class="sd">&quot;&quot;&quot;Run a function on mouse information that is received by the window, continuously in a new thread.&quot;&quot;&quot;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Run a function on mouse information that is received by the window, continuously in a new thread.</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="kc">None</span><span class="p">],</span> <span class="n">run_when_no_events</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_key_loop_thread</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">run_when_no_events</span><span class="p">))</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> &gt;&gt;&gt; @key_loop</span>
<span class="sd"> ... def fun(key):</span>
<span class="sd"> ... print(&quot;key pressed:{}&quot;.format(key))</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="kc">None</span><span class="p">]):</span>
<span class="sd">&quot;&quot;&quot;Start a new key thread for the decorated function.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">_key_loop_thread</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">run_when_no_events</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
@@ -173,13 +196,10 @@
<h3>Navigation</h3>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../displayarray/">displayarray</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../crop/">displayarray.effects.crop</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../lens/">displayarray.effects.lens</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../select_channels/">displayarray.effects.select_channels</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../frame/">displayarray.frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../window/">displayarray.window</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../input/">displayarray.input</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../display/">display</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../frame/">frame</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../effects/">effects</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../input/">input</a></li>
</ul>
<p class="caption"><span class="caption-text">Bash API</span></p>
<ul>

Some files were not shown because too many files have changed in this diff Show More