PHP无法使用OpenCV执行C ++脚本

时间:2016-01-21 17:06:22

标签: php c++ apache opencv

我遇到了问题 - 我在C ++中编写了一个使用OpenCV库的简单应用程序:

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int faceDetect(string filename);

int main(int argc, const char** argv) {
    int result = 0;
    string filename(argv[1]);

    Mat image = imread("C:/Serwer/Apache24/htdocs/image/upload/" + filename, 1);

        if (image.empty()) {
            return 101;
        }
        CascadeClassifier faceCascade;
        if( !faceCascade.load("C:/Serwer/Apache24/htdocs/image/haarcascade_frontalface_alt2.xml") ){
             return 103;
         };

        Mat imageGray;
        std::vector<Rect> faces;

        cvtColor(image, imageGray, CV_BGR2GRAY);
        equalizeHist(imageGray, imageGray);

        feCascade.detectMultiScale(imageGray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
        for (size_t i = 0; i < faces.size(); i++) {
            Rect face(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
            rectangle(image, face, Scalar(195, 144, 212));
            Mat faceROI = imageGray(faces[i]);
        }

        imwrite("C:/Serwer/Apache24/htdocs/image/result/" + filename, image);
        return 1;

    return result;
}

当我使用cmd运行脚本时,一切正常 - 结果文件已创建。

我想在我的网络应用程序(php + js + html)中使用此脚本,但是当我尝试像这样运行它时:

<?php
 $output = [];
 $return = 0;
 exec("test.exe lenna.png", $output, $return);
 echo "return: " . $return . "<br>";
 print_r($output);
?>

未创建文件,$ return为255,$ output为空数组。我试图添加&#34; 2&amp;&gt; 1&#34;在exec命令中,但仍未创建文件(但$ return为1)。我还尝试过其他php函数(system()和shell_exec()),但它仍然没有创建结果文件。

exe与php脚本位于同一目录中(我试图用绝对路径运行它 - 同样的问题)。结果catalouge存在。 php.ini中没有禁用的函数,在路径变量中我可以看到OpenCV的libs路径。当我运行此代码时:

<?php
 echo "<pre>";
 system("dir");
 echo "</pre>";
?> 

它有效。

操作系统:赢得8.1 x64
Apache 2.4.6 x64(apachelounge版)
PHP 5.6.13 x64(fcgi_mod)

任何想法我该怎么办?

<小时/>
修改

我已经确定了问题 - 当我将PHP作为mod_fcgid运行时,我的cpp无法正常工作。当我运行php作为apache模块(php5apache2_4.dll)时,一切正常。

我从这里获得了当前的mod_fcgid配置:https://www.apachelounge.com/viewtopic.php?t=2394

它看起来像这样:

<IfModule fcgid_module> 
   FcgidIOTimeout 40 
   FcgidConnectTimeout 10 

   FcgidMaxProcesses 300 
   FcgidMaxProcessesPerClass 300 

   FcgidOutputBufferSize 64 
   ProcessLifeTime 0 
   FcgidMaxRequestsPerProcess 0 
   FcgidMinProcessesPerClass 0 
   FcgidFixPathinfo 0 
   FcgidProcessLifeTime 0 
   FcgidZombieScanInterval 20 
   FcgidMaxRequestLen 536870912 
   FcgidIOTimeout 120 
   FcgidTimeScore 3 

   FcgidPassHeader Authorization 

   FcgidInitialEnv PHPRC "C:\\Serwer\\PHP5" 
   FcgidInitialEnv PATH "C:\\Serwer\\PHP5;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;" 
   FcgidInitialEnv SystemRoot "C:\\Windows" 
   FcgidInitialEnv SystemDrive "C:" 
   FcgidInitialEnv TEMP "C:\\WINDOWS\\TEMP" 
   FcgidInitialEnv TMP "C:\\WINDOWS\\TEMP" 
   FcgidInitialEnv windir "C:\\WINDOWS" 
   <Files ~ "\.php$"> 
      Options Indexes FollowSymLinks ExecCGI 
      AddHandler fcgid-script .php 
      FcgidWrapper "C:/Serwer/PHP5/php-cgi.exe" .php 
   </Files> 
</IfModule>

Apache的error.log中没有错误。你知道我应该在fcgid配置中改变什么来执行外部cpp应用程序吗?

0 个答案:

没有答案