无法使用 system() 在 matlab 中运行可执行文件,但它可以在命令行中运行

Posted

技术标签:

【中文标题】无法使用 system() 在 matlab 中运行可执行文件,但它可以在命令行中运行【英文标题】:Can't run an executable file in matlab with system(), but it works in command line 【发布时间】:2014-06-22 03:29:46 【问题描述】:

我需要使用 Matlab 中的系统命令运行一个使用 OPencv 库的 C++ 可执行文件。我已经用make编译了所有代码,并且成功了。当我在命令行中运行程序时,它的工作方式如下所示。

lib/sift/bin/siftfeat -x -o tampered1.txt tampered1.jpg
Finding SIFT features... 
Found 2596 features.

问题是当我用 matlab 运行它时。发生以下错误:

>>system('lib/sift/bin/siftfeat -x -o tampered1.txt tampered1.jpg')
  Finding SIFT features...
  Error: unable to load image from tampered1.jpg
  lib/sift/bin/siftfeat -x -o tampered1.txt tampered1.jpg: Aborted

错误发生在 lib/sift/src/siftfeat.c 的以下代码段中:

fprintf( stderr, "Finding SIFT features...\n" );
img = cvLoadImage( img_file_name, 1 );
if( ! img )
 fatal_error( "unable to load image from %s", img_file_name );

为什么会这样?我的意思是,如果代码在命令行中运行,为什么它不能使用系统 Matlab 命令运行? matlab 不能识别 cvLoadImage 函数吗?我正在使用 Matlab R2014a 和 OPencv-2.4.9。此代码是从另一台 PC 复制的,我只是重新编译了它。在复制代码的原始 PC 中,系统命令有效。

【问题讨论】:

是否需要提供tampered1.jpg的完整路径? 您使用的是相对路径,两种情况下您当前的工作目录是什么? 我不需要提供图像的完整路径,因为它与我正在执行 matlab 系统命令的路径相同。在这两种情况下(命令行和 Matlab)我都在同一个目录中。 目录是~/sift-forensic 【参考方案1】:

您在错误的文件夹中运行system()-cmd。 当您使用绝对路径调用二进制文件时,图像的路径是相对的。 因此,图像需要位于 matlab 执行您的system()-cmd 的文件夹中。 您可以通过执行简单地检查:

>> system('pwd')
   "Folder/where/matlab/exec/your/cmd"

如果输出对应于你的图像位置,一切都应该没问题,否则你必须给你的程序这样的绝对路径:

>> system('lib/sift/bin/siftfeat -x -o Folder/to/your/txt/tampered1.txt Folder/to/your/image/tampered1.jpg')

【讨论】:

图像在我执行系统命令的同一个文件夹中。如果我使用绝对路径运行它,则会发生相同的错误。 >> 系统('lib/sift/bin/siftfeat -x -o ~/sift-forensic/tampered1.txt ~/sift-forensic/tampered.jpg')。如果我在命令行中同时使用绝对路径和相对路径,它们就可以工作。还是谢谢。【参考方案2】:

我试过了,发现使用 sudo 可以。

【讨论】:

这应该是评论,而不是答案。

以上是关于无法使用 system() 在 matlab 中运行可执行文件,但它可以在命令行中运行的主要内容,如果未能解决你的问题,请参考以下文章

System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务

从继承超类时实现matlab.system进行故障排除

在matlab中调用时无法在C++中使用opencv读取图像

使用java.lang.Runtime.getRuntime无法在matlab中调用多个python脚本实例

无法在 Windows XP 中运行使用 QT5 和 VS2013 创建的应用程序

System.FormatException 从 4.7 运行 .NET Framework 2.0