1. Controlling MXW through Python: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 48: | Line 48: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
The plugins are defined in a mxw_main.py file. This file is loaded, and | The plugins are defined in a mxw_main.py file. This file is loaded, and the main UI calls the provided interface functions. This is a minimal video writing example: | ||
<syntaxhighlight lang="Python" line> | <syntaxhighlight lang="Python" line> | ||
import tempfile | import tempfile | ||
import mxw, mxw_imgui # for mxw interaction, mxw ui interaction | import mxw, mxw_imgui # for mxw interaction, mxw ui interaction | ||
import cv2 | import cv2 # image processing | ||
import numpy as np | import numpy as np # math | ||
capture_device="" | |||
videosize = (640,480) | |||
f = object() | |||
out = object() | |||
# ----------------------------------------------------------------------------------- | # ----------------------------------------------------------------------------------- | ||
def onCreate(): | def onCreate(): | ||
dev = mxw.media().get_capture_device_names() | dev = mxw.media().get_capture_device_names() | ||
capture_device = dev[1] | |||
return | return | ||
def onAction(): | def onAction(): | ||
f = tempfile.NamedTemporaryFile(suffix='.avi') | |||
f.close() | |||
fourcc = cv2.VideoWriter_fourcc('M','P','4','V') | fourcc = cv2.VideoWriter_fourcc('M','P','4','V') | ||
out = cv2.VideoWriter(v.f.name, fourcc, mxw.fps, videosize) | |||
m = mxw.media( | m = mxw.media(capture_device) | ||
if(m.isvalid()): | if(m.isvalid()): | ||
m.reference(True) | m.reference(True) | ||
Line 93: | Line 78: | ||
def onPostAction(): | def onPostAction(): | ||
out.release() | |||
mxw.preload(1).set_media(v.f.name) | mxw.preload(1).set_media(v.f.name) | ||
m = mxw.media( | m = mxw.media(capture_device) | ||
if(m.isvalid()): | if(m.isvalid()): | ||
m.reference(False) | m.reference(False) | ||
Line 102: | Line 86: | ||
def onNewFrameInPlayoutCue(): | def onNewFrameInPlayoutCue(): | ||
m = mxw.media(capture_device) | |||
m = mxw.media( | |||
if(m.isvalid()): | if(m.isvalid()): | ||
img = m.get_image_sample_cvmat(videosize[0],videosize[1]) | img = m.get_image_sample_cvmat(videosize[0],videosize[1]) | ||
img = np.array(img, copy=False) | img = np.array(img, copy=False) | ||
img = cv2.flip(img, 0) | img = cv2.flip(img, 0) | ||
out.write(img) | |||
return | return | ||
# render in panel for settings etc | # render in panel for settings etc | ||
def onRenderPanel(): | def onRenderPanel(): | ||
mxw_imgui.text_unformatted("This plugin records a camera") | mxw_imgui.text_unformatted("This plugin records a camera") | ||
return | return | ||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 20:03, 3 December 2023
Python is used in MXW trough a plugin interface. Specified program paths are searched for plugins which are registered, and then loaded through the user interface.
As of version 7.2., plugins are available in the playlist. There are two paths searched during program startup, the program folder and the user folder:
- (Program folder)/plugins/playlist/python/
- ~.StageDesigner/plugins/playlist/python/ (Unix)
- ~.StageDesigner/plugins/playlist/python/ (Windows)
Each plugin resides in a folder. Inside this folder, two files have to be present,
- mxw_plugin.ini
- mxw_main.py
The file mxw_plugin.ini defines the registration of the plugin. The following fields are valid:
Tag | Use | Values/Example |
---|---|---|
plugin_version | Plugin Version | 1 |
plugin_script_language | Plugin Script Language | Python |
plugin_action_level | Plugin Activity Switch | disabled = not visible |
plugin_menu_parent | Top level parent in playlist menu | "AI", "IO" .. |
plugin_menu_name | Playlist menu entry | "Face detection" |
plugin_grid_name | Default name in grid (may be completed via script) | "Face detect" |
plugin_grid_bg_color | Default color in grid (may be changed via script) | 0.95 0.05 0.45 1.00 (RGBA with range 0..1) |
plugin_tooltip | Tool tip in grid and panel | "This plugin triggers the playlist when it finds a Face" |
An example mxw_plugin.ini looks like this:
[mxw_plugin] ; must be here
plugin_version = 1 ; must be V1 (as of V7.2)
plugin_script_language = Python ; must be Python (as of V7.2)
plugin_menu_parent = AI
plugin_menu_name = NeuronalNet(Dlib) Face Detect Plugin
plugin_grid_name = Face Detect Plugin
plugin_grid_bg_color = 0.950000 0.050000 0.450000 1.000000 ; set plugin color.
plugin_tooltip = This plugin triggers the playlist when it finds a Face using a neuronal net (Dlib)
The plugins are defined in a mxw_main.py file. This file is loaded, and the main UI calls the provided interface functions. This is a minimal video writing example:
import tempfile
import mxw, mxw_imgui # for mxw interaction, mxw ui interaction
import cv2 # image processing
import numpy as np # math
capture_device=""
videosize = (640,480)
f = object()
out = object()
# -----------------------------------------------------------------------------------
def onCreate():
dev = mxw.media().get_capture_device_names()
capture_device = dev[1]
return
def onAction():
f = tempfile.NamedTemporaryFile(suffix='.avi')
f.close()
fourcc = cv2.VideoWriter_fourcc('M','P','4','V')
out = cv2.VideoWriter(v.f.name, fourcc, mxw.fps, videosize)
m = mxw.media(capture_device)
if(m.isvalid()):
m.reference(True)
return
def onPostAction():
out.release()
mxw.preload(1).set_media(v.f.name)
m = mxw.media(capture_device)
if(m.isvalid()):
m.reference(False)
return
def onNewFrameInPlayoutCue():
m = mxw.media(capture_device)
if(m.isvalid()):
img = m.get_image_sample_cvmat(videosize[0],videosize[1])
img = np.array(img, copy=False)
img = cv2.flip(img, 0)
out.write(img)
return
# render in panel for settings etc
def onRenderPanel():
mxw_imgui.text_unformatted("This plugin records a camera")
return