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

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