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
@@ -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>
@@ -31,7 +31,9 @@
<div class="body" role="main">
<h1>Source code for displayarray.window.subscriber_windows</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span> <span class="nn">warnings</span>
<span></span><span class="sd">&quot;&quot;&quot;OpenCV windows that will display the arrays.&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">warnings</span>
<span class="kn">from</span> <span class="nn">threading</span> <span class="k">import</span> <span class="n">Thread</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Union</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="n">Dict</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">Optional</span>
@@ -40,17 +42,17 @@
<span class="kn">from</span> <span class="nn">localpubsub</span> <span class="k">import</span> <span class="n">NoData</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_updater</span> <span class="k">import</span> <span class="n">FrameCallable</span>
<span class="kn">from</span> <span class="nn">displayarray.frame.frame_updater</span> <span class="k">import</span> <span class="n">FrameUpdater</span>
<span class="kn">from</span> <span class="nn">displayarray.input</span> <span class="k">import</span> <span class="n">MouseEvent</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">from</span> <span class="nn">displayarray.util</span> <span class="k">import</span> <span class="n">WeakMethod</span>
<span class="kn">from</span> <span class="nn">displayarray._util</span> <span class="k">import</span> <span class="n">WeakMethod</span>
<span class="kn">from</span> <span class="nn">displayarray.effects.select_channels</span> <span class="k">import</span> <span class="n">SelectChannels</span>
<div class="viewcode-block" id="SubscriberWindows"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows">[docs]</a><span class="k">class</span> <span class="nc">SubscriberWindows</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows">[docs]</a><span class="k">class</span> <span class="nc">SubscriberWindows</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Windows that subscribe to updates to cameras, videos, and arrays.&quot;&quot;&quot;</span>
<span class="n">FRAME_DICT</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">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
@@ -62,6 +64,7 @@
<span class="n">video_sources</span><span class="p">:</span> <span class="n">Iterable</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</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">List</span><span class="p">[</span><span class="n">Callable</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="n">Any</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create the array displaying window.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">source_names</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">close_threads</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="n">Thread</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">frames</span><span class="p">:</span> <span class="n">List</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="o">=</span> <span class="p">[]</span>
@@ -84,12 +87,13 @@
<span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">exited</span>
<span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.block"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.block">[docs]</a> <span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Update the window continuously while blocking the outer program.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loop</span><span class="p">()</span>
<span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_threads</span><span class="p">:</span>
<span class="n">ct</span><span class="o">.</span><span class="n">join</span><span class="p">()</span>
<span class="n">ct</span><span class="o">.</span><span class="n">join</span><span class="p">()</span></div>
<div class="viewcode-block" id="SubscriberWindows.add_source"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.add_source">[docs]</a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.add_source"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.add_source">[docs]</a> <span class="k">def</span> <span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Add another source for this class to display.&quot;&quot;&quot;</span>
<span class="n">uid</span> <span class="o">=</span> <span class="n">uid_for_source</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">source_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">uid</span><span class="p">)</span>
@@ -97,7 +101,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">input_cams</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="SubscriberWindows.add_window"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.add_window">[docs]</a> <span class="k">def</span> <span class="nf">add_window</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.add_window"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.add_window">[docs]</a> <span class="k">def</span> <span class="nf">add_window</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Add another window for this class to display sources with. The name will be the title.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">window_names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">cv2</span><span class="o">.</span><span class="n">namedWindow</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; (press ESC to quit)&quot;</span><span class="p">)</span>
@@ -105,7 +109,7 @@
<span class="n">cv2</span><span class="o">.</span><span class="n">setMouseCallback</span><span class="p">(</span><span class="n">name</span> <span class="o">+</span> <span class="s2">&quot; (press ESC to quit)&quot;</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="SubscriberWindows.add_callback"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.add_callback">[docs]</a> <span class="k">def</span> <span class="nf">add_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.add_callback"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.add_callback">[docs]</a> <span class="k">def</span> <span class="nf">add_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Add a callback for this class to apply to videos.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">callback</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span></div>
@@ -114,9 +118,7 @@
<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">source_names</span><span class="p">:</span>
<span class="n">subscriber_dictionary</span><span class="o">.</span><span class="n">stop_cam</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<div class="viewcode-block" id="SubscriberWindows.handle_keys"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.handle_keys">[docs]</a> <span class="k">def</span> <span class="nf">handle_keys</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">key_input</span> <span class="c1"># type: int</span>
<span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.handle_keys"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.handle_keys">[docs]</a> <span class="k">def</span> <span class="nf">handle_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key_input</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Capture key input for the escape function and passing to key control subscriber threads.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">key_input</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ESC_KEY_CODES</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">window_names</span><span class="p">:</span>
@@ -135,7 +137,7 @@
<span class="p">)</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="SubscriberWindows.handle_mouse"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.handle_mouse">[docs]</a> <span class="k">def</span> <span class="nf">handle_mouse</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>
<div class="viewcode-block" id="SubscriberWindows.handle_mouse"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.handle_mouse">[docs]</a> <span class="k">def</span> <span class="nf">handle_mouse</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;Capture mouse input for mouse control subscriber threads.&quot;&quot;&quot;</span>
<span class="n">mousey</span> <span class="o">=</span> <span class="n">MouseEvent</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="n">window_commands</span><span class="o">.</span><span class="n">mouse_pub</span><span class="o">.</span><span class="n">publish</span><span class="p">(</span><span class="n">mousey</span><span class="p">)</span></div>
@@ -188,7 +190,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">frames</span><span class="p">[</span><span class="n">fr</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">callbacks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">](</span><span class="bp">self</span><span class="o">.</span><span class="n">frames</span><span class="p">[</span><span class="n">fr</span><span class="p">])</span>
<span class="k">break</span>
<div class="viewcode-block" id="SubscriberWindows.update_window_frames"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.update_window_frames">[docs]</a> <span class="k">def</span> <span class="nf">update_window_frames</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.update_window_frames"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.update_window_frames">[docs]</a> <span class="k">def</span> <span class="nf">update_window_frames</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Update the windows with the newest data for all frames.&quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">frames</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</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="bp">self</span><span class="o">.</span><span class="n">input_vid_global_names</span><span class="p">)):</span>
@@ -204,9 +206,10 @@
<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="bp">self</span><span class="o">.</span><span class="n">frames</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">frame</span>
<span class="bp">self</span><span class="o">.</span><span class="n">__check_too_many_channels</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">FRAME_DICT</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">input_vid_global_names</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">NoData</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_display_frames</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">frames</span><span class="p">)</span></div>
<div class="viewcode-block" id="SubscriberWindows.update"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.update">[docs]</a> <span class="k">def</span> <span class="nf">update</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">np</span><span class="o">.</span><span class="n">ndarray</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.update"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.update">[docs]</a> <span class="k">def</span> <span class="nf">update</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">np</span><span class="o">.</span><span class="n">ndarray</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Update window frames once. Optionally add a new input and input id.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">arr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">id</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">global_cv_display_callback</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="nb">id</span><span class="p">)</span>
@@ -219,7 +222,7 @@
<span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_keys</span><span class="p">(</span><span class="n">cv2</span><span class="o">.</span><span class="n">waitKey</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="k">return</span> <span class="n">msg_cmd</span><span class="p">,</span> <span class="n">key</span></div>
<div class="viewcode-block" id="SubscriberWindows.wait_for_init"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.wait_for_init">[docs]</a> <span class="k">def</span> <span class="nf">wait_for_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.wait_for_init"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.wait_for_init">[docs]</a> <span class="k">def</span> <span class="nf">wait_for_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Update window frames in a loop until they&#39;re actually updated. Useful for waiting for cameras to init.&quot;&quot;&quot;</span>
<span class="n">msg_cmd</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
<span class="n">key</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
@@ -227,7 +230,7 @@
<span class="n">msg_cmd</span><span class="p">,</span> <span class="n">key</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span></div>
<div class="viewcode-block" id="SubscriberWindows.end"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.end">[docs]</a> <span class="k">def</span> <span class="nf">end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.end"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.end">[docs]</a> <span class="k">def</span> <span class="nf">end</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Close all threads. Should be used with non-blocking mode.&quot;&quot;&quot;</span>
<span class="n">window_commands</span><span class="o">.</span><span class="n">quit</span><span class="p">(</span><span class="n">force_all_read</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">__stop_all_cams</span><span class="p">()</span>
@@ -246,7 +249,7 @@
<span class="k">def</span> <span class="nf">__delete__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">end</span><span class="p">()</span>
<div class="viewcode-block" id="SubscriberWindows.loop"><a class="viewcode-back" href="../../../../window/#displayarray.SubscriberWindows.loop">[docs]</a> <span class="k">def</span> <span class="nf">loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<div class="viewcode-block" id="SubscriberWindows.loop"><a class="viewcode-back" href="../../../../display/#displayarray.SubscriberWindows.loop">[docs]</a> <span class="k">def</span> <span class="nf">loop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Continually update window frame. OpenCV only allows this in the main thread.&quot;&quot;&quot;</span>
<span class="n">sub_cmd</span> <span class="o">=</span> <span class="n">window_commands</span><span class="o">.</span><span class="n">win_cmd_sub</span><span class="p">()</span>
<span class="n">msg_cmd</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
@@ -259,7 +262,10 @@
<span class="k">def</span> <span class="nf">_get_video_callback_dict_threads</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">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="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">fps</span><span class="o">=</span><span class="mi">240</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="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">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="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">fps</span><span class="o">=</span><span class="mi">240</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="p">):</span>
<span class="k">assert</span> <span class="n">callbacks</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="n">vid_threads</span> <span class="o">=</span> <span class="p">[]</span>
@@ -268,14 +274,14 @@
<span class="n">v_callbacks</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Callable</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="n">Any</span><span class="p">]]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">v_name</span> <span class="ow">in</span> <span class="n">callbacks</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v_name</span><span class="p">],</span> <span class="n">List</span><span class="p">):</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v_name</span><span class="p">])</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v_name</span><span class="p">])</span> <span class="c1"># type: ignore</span>
<span class="k">elif</span> <span class="n">callable</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v_name</span><span class="p">]):</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v_name</span><span class="p">])</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v_name</span><span class="p">])</span> <span class="c1"># type: ignore</span>
<span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">callbacks</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">List</span><span class="p">):</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v</span><span class="p">])</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="c1"># type: ignore</span>
<span class="k">elif</span> <span class="n">callable</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v</span><span class="p">]):</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v</span><span class="p">])</span>
<span class="n">v_callbacks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">callbacks</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="c1"># type: ignore</span>
<span class="n">vid_threads</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
<span class="n">FrameUpdater</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">callbacks</span><span class="o">=</span><span class="n">v_callbacks</span><span class="p">,</span> <span class="n">fps_limit</span><span class="o">=</span><span class="n">fps</span><span class="p">,</span> <span class="n">request_size</span><span class="o">=</span><span class="n">size</span><span class="p">)</span>
<span class="p">)</span>
@@ -285,7 +291,11 @@
<span class="k">def</span> <span class="nf">_get_video_threads</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</span><span class="o">=</span><span class="mi">240</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>
@@ -312,10 +322,14 @@
<span class="k">return</span> <span class="n">vid_threads</span>
<div class="viewcode-block" id="display"><a class="viewcode-back" href="../../../../displayarray/#displayarray.display">[docs]</a><span class="k">def</span> <span class="nf">display</span><span class="p">(</span>
<div class="viewcode-block" id="display"><a class="viewcode-back" href="../../../../display/#displayarray.display">[docs]</a><span class="k">def</span> <span class="nf">display</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">window_names</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">blocking</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
@@ -346,7 +360,7 @@
<span class="k">return</span> <span class="n">s</span></div>
<div class="viewcode-block" id="breakpoint_display"><a class="viewcode-back" href="../../../../displayarray/#displayarray.breakpoint_display">[docs]</a><span class="k">def</span> <span class="nf">breakpoint_display</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>
<div class="viewcode-block" id="breakpoint_display"><a class="viewcode-back" href="../../../../display/#displayarray.breakpoint_display">[docs]</a><span class="k">def</span> <span class="nf">breakpoint_display</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>
<span class="sd">&quot;&quot;&quot;Display all the arrays, cameras, and videos passed in. Stops code execution until the window is closed.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">display</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> <span class="n">blocking</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
</pre></div>
@@ -369,13 +383,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>