无法使用 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中调用时无法在C++中使用opencv读取图像
使用java.lang.Runtime.getRuntime无法在matlab中调用多个python脚本实例