сопряжение OpenCV с php - PullRequest
       1

сопряжение OpenCV с php

2 голосов
/ 14 июня 2011

У меня есть исполняемый файл, разработанный с использованием библиотеки opencv в c. Я хочу выполнить его со своего веб-сайта (веб-сервер: apache), используя скрипт php. Проблема, с которой я сталкиваюсь, заключается в том, что исполняемый код открывает окно (вид графического интерфейса пользователя, открытое с помощью cvNamedWindow) при вызове из терминала, но не делает этого при вызове из встроенного сценария php. Для исполнения я пробовал exec, system, passthru и т. Д., Но все это не удалось.

, чтобы быть более понятным: имя исполняемого файла -> GUI, имя phpscript (страница) -> abcd.php

  1. @ терминал, если я наберу "./gui" ... откроется окно.

  2. @ терминал, если открывается окно типа «php abcd.php»

  3. abcd.php является частью моего сайта. В веб-браузере, если я открою "http: //...../abcd.php", окно НЕ ОТКРЫВАЕТСЯ. Хотя другие вещи в исполняемом файле работают отлично. Они будут напечатаны, если я передам их в качестве аргументов exec.

Любые решения ??

Обновление

спасибо за ответы .. Я поставлю свой вопрос таким образом .. Существует исполняемый файл, который запускается на клиенте. Он имеет графический интерфейс, через который пользователь может подключиться к серверу и получить видеопоток, который можно увидеть внутри графического интерфейса. Этот исполняемый файл работает нормально при выполнении на терминале. Поскольку php также может вызывать исполняемый файл, я пробую веб-страницу, чтобы добавить еще некоторые функции. Но программа НЕ выполняется так же, как и при запуске на терминале.

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

У меня была та же проблема, что и у вас, и мне потребовалось два месяца, чтобы решить эту проблему.

Наконец, я поместил 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 (In $val).

Google код и знать, что это потеря некоторой DLL, используйте обходчик зависимости (http://www.dependencywalker.com/), чтобы узнать, что ему нужно opencv_highgui220d.dll и opencv_core220d.dll.

Так что поместите их в корень сети.

0 голосов
/ 14 июня 2011

Если вам просто нужно окно для правильной работы приложения, вы можете попробовать создать поддельное окно, запустив его на виртуальном X-сервере с использованием xvfb.Это не будет очень эффективным, но по крайней мере ваше приложение будет работать без сбоев.

Теперь, если вы говорите о запуске приложения на клиенте, я не думаю, что это то, что вы могли бы разумноожидайте работы, если клиент на самом деле не загружает код, который вы пытаетесь запустить, и добровольно выполняет вашу программу.Как правило, веб-браузеры не должны запускать машинный код с произвольных веб-сайтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...