我有一个使用c中的opencv库开发的可执行文件。我想使用php脚本从我的网站(webserver:apache)执行它。我面临的问题是,当从终端调用时,可执行代码会打开一个窗口(有点像gui,使用cvNamedWindow打开),但当从嵌入式php脚本调用时,它不会这样做。对于执行,我尝试过exec、system、passthrough等,但都失败了。
更清楚的是:可执行文件的名称->gui,phpscript的名称(页面)->abcd.php
-
@如果我键入"./gui",则会打开终端…窗口。
-
@终端,如果itype"php-abcd.php"窗口打开
-
abcd.php是我网站的一部分。如果我打开"http://...../abcd.php",窗口没有打开。尽管可执行文件中的其他内容运行良好。如果我将它们作为参数返回给exec.,它们就会被打印出来。"
有什么解决方案吗??
更新
谢谢你的回复。。我会这样问的。。有一个可执行文件在客户端上运行。它有一个gui,用户可以通过它连接到服务器,并接收可以在gui中看到的视频流。此可执行文件在终端上执行时运行良好。由于php也可以调用可执行文件,我正在尝试浏览网页,以便添加更多功能。但当程序在终端执行时,它的执行方式与原来不同。
如果你只需要一个窗口让应用程序正常运行,你可以尝试使用xvfb在虚拟X服务器中运行它来创建一个假窗口。这不会很有效,但至少你的应用程序不会崩溃。
现在,如果你正在谈论在客户端上启动应用程序,我认为除非客户端真的下载了你试图运行的代码并自愿执行你的程序,否则这是你无法合理预期的。一般来说,web浏览器不应该运行来自任意网站的本机代码。
我和你遇到了同样的问题,我花了两个月的时间才解决这个问题。
最后,我把opencv_highgui220d.dll
和opencv_core220d.dll
放在index.php
的目录中,它就工作了!
更多细节,下面是我的环境:
操作系统:Windows Vista SP1
HTTP服务器:Appserv2.5.10(Apache2.2.8+php5.2.6)
根目录:C:\/Appserv/www/test
根包含。
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 FilesOpenCV2.2include
C:Program FilesOpenCV2.2includeopencv
VC++ > Library Directory
C:Program FilesOpenCV2.2lib
Linker > Additional Dependencies:
C:Program FilesOpenCV2.2libopencv_core220d.lib
C:Program FilesOpenCV2.2libopencv_highgui220d.lib
C:Program FilesOpenCV2.2libopencv_video220d.lib
C:Program FilesOpenCV2.2libopencv_ml220d.lib
C:Program FilesOpenCV2.2libopencv_legacy220d.lib
C:Program FilesOpenCV2.2libopencv_imgproc220d.lib
构建后,将cv.exe
放入web根目录,但得到错误消息并得到返回值:0xc0000135
(在$val
中)。
用谷歌搜索代码,知道它丢失了一些dll,使用依赖性助行器(http://www.dependencywalker.com/)要知道它需要CCD_ 7和CCD_。
所以把它们放到网络根目录中。