将OpenCV与php连接起来

时间:2011-06-14 18:58:56

标签: php interface opencv exec

我在c中使用opencv库开发了一个可执行文件。我想使用php脚本从我的网站(webserver:apache)执行它。我面临的问题是,可执行代码在从终端调用时打开一个窗口(一种gui,使用cvNamedWindow打开),但是当从嵌入式php脚本调用时它不会这样做。为了执行,我尝试了exec,system,passthru等,但所有这些都失败了。

更清楚:可执行文件的名称 - > gui,phpscript的名字(页) - > abcd.php

  1. @terminal如果我输入“./gui”...窗口打开。

  2. @ terminal,如果itype“php abcd.php”窗口打开

  3. abcd.php是我网站的一部分。在Web浏览器中,如果我打开“http://...../abcd.php”,则窗口DOESNOT打开。虽然可执行文件中的其他内容完美无缺。如果我把它们作为exec的参数传回去,它们就会打印出来。

  4. 任何解决方案??

    更新

    感谢回复.. 我会以这种方式提出我的问题.. 有一个可执行文件在客户端上运行。它有一个gui,用户可以通过它连接到服务器并接收可以在gui内部看到的视频流。在终端上执行时,此可执行文件运行正常 由于php也可以调用可执行文件,我正在尝试通过网页,以便我可以添加更多功能。但是,当在终端执行时,程序的执行方式与原来的相同。

2 个答案:

答案 0 :(得分:0)

如果您只需要一个窗口让应用程序正常运行,您可以尝试使用xvfb在虚拟X服务器中运行它来创建虚假的窗口。这不会非常有效,但至少你的应用程序会在不崩溃的情况下执行。

现在,如果您正在谈论在客户端上启动应用程序,我认为除非客户端实际下载您尝试运行的代码并自愿执行您的程序,否则您可以合理地期望这样做。通常,Web浏览器不应该从任意网站运行本机机器代码。

答案 1 :(得分:0)

我遇到了和你一样的问题,我花了两个月的时间来解决这个问题。

最后,我将opencv_highgui220d.dllopencv_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.dllopencv_core220d.dll

所以把它们放到网络根目录中。