我在c中使用opencv库开发了一个可执行文件。我想使用php脚本从我的网站(webserver:apache)执行它。我面临的问题是,可执行代码在从终端调用时打开一个窗口(一种gui,使用cvNamedWindow打开),但是当从嵌入式php脚本调用时它不会这样做。为了执行,我尝试了exec,system,passthru等,但所有这些都失败了。
更清楚:可执行文件的名称 - > gui,phpscript的名字(页) - > abcd.php
@terminal如果我输入“./gui”...窗口打开。
@ terminal,如果itype“php abcd.php”窗口打开
abcd.php是我网站的一部分。在Web浏览器中,如果我打开“http://...../abcd.php”,则窗口DOESNOT打开。虽然可执行文件中的其他内容完美无缺。如果我把它们作为exec的参数传回去,它们就会打印出来。
任何解决方案??
更新
感谢回复.. 我会以这种方式提出我的问题.. 有一个可执行文件在客户端上运行。它有一个gui,用户可以通过它连接到服务器并接收可以在gui内部看到的视频流。在终端上执行时,此可执行文件运行正常 由于php也可以调用可执行文件,我正在尝试通过网页,以便我可以添加更多功能。但是,当在终端执行时,程序的执行方式与原来的相同。
答案 0 :(得分:0)
如果您只需要一个窗口让应用程序正常运行,您可以尝试使用xvfb在虚拟X服务器中运行它来创建虚假的窗口。这不会非常有效,但至少你的应用程序会在不崩溃的情况下执行。
现在,如果您正在谈论在客户端上启动应用程序,我认为除非客户端实际下载您尝试运行的代码并自愿执行您的程序,否则您可以合理地期望这样做。通常,Web浏览器不应该从任意网站运行本机机器代码。
答案 1 :(得分:0)
我遇到了和你一样的问题,我花了两个月的时间来解决这个问题。
最后,我将opencv_highgui220d.dll
和opencv_core220d.dll
放在index.php
的目录中,它有效!
更多细节,以下是我的环境:
操作系统:Windows Vista SP1
HTTP服务器:Appserv2.5.10(Apache2.2.8 + php5.2.6)
Root:C:/ Appserv / www / test
Root包含。
的index.php:
<?php
exec("cv.exe", $out, $val);
echo $val;
?>
cv.cpp:
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
Mat img = imread("a.jpg");
if(!img.data) return -1;
imwrite("b.jpg",img);
return 0;
}
使用Visual Studio 2010进行编译,
项目设置:
Use Run-Time Library: /Mtd
VC++ > Include Directories:
C:\Program Files\OpenCV2.2\include
C:\Program Files\OpenCV2.2\include\opencv
VC++ > Library Directory
C:\Program Files\OpenCV2.2\lib
Linker > Additional Dependencies:
C:\Program Files\OpenCV2.2\lib\opencv_core220d.lib
C:\Program Files\OpenCV2.2\lib\opencv_highgui220d.lib
C:\Program Files\OpenCV2.2\lib\opencv_video220d.lib
C:\Program Files\OpenCV2.2\lib\opencv_ml220d.lib
C:\Program Files\OpenCV2.2\lib\opencv_legacy220d.lib
C:\Program Files\OpenCV2.2\lib\opencv_imgproc220d.lib
构建完成后,将cv.exe
放入网络根目录,但收到错误消息并获取返回值:0xc0000135
(在$val
中)。
Google代码并知道它丢失了一些dll,使用Dependency walker(http://www.dependencywalker.com/)知道它需要opencv_highgui220d.dll
和opencv_core220d.dll
。
所以把它们放到网络根目录中。