【问题标题】:interfacing OpenCV with php将 OpenCV 与 php 连接
【发布时间】:2011-09-14 23:17:02
【问题描述】:

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

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

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

  2. @ 终端,如果 itype "php abcd.php" 窗口打开

  3. abcd.php 是我网站的一部分。在网络浏览器中,如果我打开“http://...../abcd.php”,窗口不会打开。尽管可执行文件中的其他内容运行良好。如果我将它们作为参数传回给 exec,它们就会被打印出来。

有什么解决办法吗??

更新

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

【问题讨论】:

  • 所以...您希望窗口在运行浏览器的机器上打开?
  • 嘿...如果是这样,这很有趣。嘿,我有一个网站,我想让你访问。它会在您的系统上安装所有类型的垃圾 - 甚至不用担心。
  • 也许你想获取 OpenCV 的 php 绑定并在 abcd.php 中进行所有处理。您可以将图像保存在服务器上并在 abcd.php 中添加 标签。

标签: php interface opencv exec


【解决方案1】:

我和你有同样的问题,我花了两个月才解决这个问题。

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

Building 后,将cv.exe 放入web root,但得到错误信息并得到返回值:0xc0000135(在$val)。

Google 代码并知道它丢失了一些 dll,使用 Dependency walker (http://www.dependencywalker.com/) 知道它需要 opencv_highgui220d.dllopencv_core220d.dll

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

【讨论】:

    【解决方案2】:

    如果您只需要一个让应用程序正常运行的窗口,您可以尝试通过使用 xvfb 在虚拟 X-server 中运行它来创建一个假的。这不会很有效,但至少你的应用程序会执行而不会崩溃。

    现在,如果您正在谈论在客户端上启动应用程序,我认为除非客户端实际下载您尝试运行的代码并自愿执行您的程序,否则您可以合理地期望它不会起作用。一般来说,网络浏览器不应该运行来自任意网站的本地机器代码。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 2010-12-30
      • 2018-08-16
      • 1970-01-01
      • 2017-01-29
      • 2017-04-03
      • 2015-01-28
      • 2020-03-17
      相关资源
      最近更新 更多