从 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写成的函数或脚本”