从 python 运行 MATLAB 脚本 + 传递参数

Posted

技术标签:

【中文标题】从 python 运行 MATLAB 脚本 + 传递参数【英文标题】:Run a MATLAB script from python + pass args 【发布时间】:2012-11-09 15:55:32 【问题描述】:

我希望从 Python 到 MATLAB。我需要使用 MATLAB Image Acquisition Toolbox 从摄像机中获取少量图像。

MATLAB 似乎是一个不错的解决方案,因为图像采集很容易,之后我必须进行一些图像处理。我已经搜索了很长时间,但我仍然没有找到任何可以从 Python 中执行此操作的方法。

以下是我的一些尝试:


mlabwrap 1.1 - 运行 MATLAB 脚本:

一个 MATLAB 脚本,例如:

vid = videoinput('testadaptor');
img = getsnapshot(vid);
imwrite(img,'./image.png','png');

您可以使用以下命令运行此脚本:

mlab.run('script.m')

但是,在哪里传递一些参数(目录、图像描述等)? 由于 mlabwraps 糟糕的纪录片,我没有找到任何东西。 我使用 mlab.lookfor('theme of interest') 功能没有成功


mlabwrap 1.1 - 使用 mlab 函数进行图像采集:

乍一看不可能读出一个“视频输入对象”,没有这样的功能:

image = getsnapshot(video input object)
imwrite(image,'directiory\image.png','png')

python-matlab-bridge

https://github.com/jaderberg/python-matlab-bridge

我有 Windows7 64 位操作系统。他们说,它只适用于 unix。


Nipype

http://nipy.sourceforge.net/nipype/api/generated/nipype.interfaces.matlab.html

似乎很新。我还没有尝试安装它。我猜它似乎适合我的问题,但不适合 Windows。


PyMAT

不支持 python 2.7


那么有人可以帮助我吗?

【问题讨论】:

我刚刚尝试过 pymatlab ,我可以在带有一些补丁 (sourceforge.net/p/pymatlab/tickets/1) 的 Windows 中运行它,但在我的情况下,我遇到了数据类型维度的问题(到目前为止它仅适用于字符串)跨度> 【参考方案1】:

虽然我对 python-matlab-bridge、Nipype 或 PyMAT 不是很熟悉,但我已经使用 mlabwrap 完成了大量工作,我将尝试回答您关于该软件包的问题。

首先,如果您根据函数而不是脚本工作会容易得多。让我们将您的 Matlab 脚本改写为一个函数,在 myFunction.m 中,如下所示:

function myFunction(v_input, directory, file_name)

    vid = videoinput(v_input);
    img = getsnapshot(vid);
    location = [directory file_name]
    imwrite(img, location,'png');

然后您可以使用 mlabwrap.mlab 从 python 调用此函数,并传入函数参数的字符串。所有 Matlab 函数,包括用户定义的函数,都可以作为 mlabwrap.mlab 模块中的属性使用。

>>> from mlabwrap import mlab
>>> mlab.myFunction('testadaptor', './', 'image.png')

mlabwrap 会将您的字符串转换为 Matlab 可读的格式,并将它们作为参数传递给您的函数。如果出现AttributeError,这通常意味着您的函数不在 Matlab 路径上。您可以使用以下命令添加它:

>>> mlab.path(mlab.path(), 'C:\function\directory')

作为一个警告,mlabwrap 会自动在 Python 和 Matlab 之间来回转换一些参数类型,例如字符串或 numpy 数组。但是,有许多类型,例如 Matlab 结构和类,它无法转换。在这种情况下,它将从 Matlab 函数返回一个MLabObjectProxy。这些代理对象无法在 Python 中进行操作或转换为 Python 类型,但可以通过 mlabwrap 成功传递到其他 Matlab 函数中。通常,对于具有复杂输出的函数,最好将该输出写入 Matlab 函数中的文件,然后在 Python 端从文件中导入数据。 祝你好运!

【讨论】:

【参考方案2】:
    Python/OpenCV:您可以使用本机解决方案从您的视频设备获取图像。使用 OpenCV,您甚至可以进行实时图像处理。 matlab_wrapper:假设您有一个接受一些参数并返回图像数组的 MATLAB 函数(不是脚本),例如[img] = get_image(some_parameter),你可以这样写:
matlab = matlab_wrapper.MatlabSession()
img = matlab.workspace.get_image(some_parameter)

免责声明:我是 matlab_wrapper 的作者

【讨论】:

以上是关于从 python 运行 MATLAB 脚本 + 传递参数的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 运行 Matlab 脚本:TypeError: 'float' object is not iterable

如何在MATLAB中调用(运行)“用Python写成的函数或脚本”

如何从 python 脚本中将参数传递给 cmd.exe?

无法在 Windows/MSYS2 下从 bash 脚本运行 MATLAB

从 Web 应用程序将参数传递给 Python 脚本?

从 AJAX 或 JQuery 运行 Python 脚本