【问题标题】:opencv c++, cvSaveImage not saving when program is executed from php从php执行程序时,opencv c ++,cvSaveImage不保存
【发布时间】:2012-04-30 18:26:33
【问题描述】:

我正在使用 os X (lion) 上的 opencv c++(eclipse) 编写人脸检测应用程序。该程序加载一个图像文件,检测人脸,然后将每个人脸保存到单独的文件中。该程序在命令行或 Eclipse 中可以 100% 运行。然后我编写了一个用于文件上传的 php 脚本,因此有人可以上传 jpg 或 png 文件,然后该脚本以唯一的文件名保存照片。然后在 php 脚本的最后,我让它执行人脸检测程序。

我不确定从命令行运行应用程序和让 php 调用应用程序运行有什么区别。下面是我的代码。

c++ 中的函数:

    cvNamedWindow ("ROI", CV_WINDOW_AUTOSIZE);
    cvCvtColor( clone, gray, CV_RGB2GRAY );


    cvSetImageROI ( gray, *r);

    //// * rectangle  = cvGetImageROI ( clone );
    *r = cvGetImageROI ( gray );
    cvShowImage ("ROI", gray);

    k++;
    char *name=0;

    name=(char*) calloc(512, 1);
    sprintf(name, "/Users/jason/Sites/jason.dev/images/proc_images/Image%d.png", k);
    cvSaveImage(name, gray);

php 脚本:

<?php
mysql_connect("127.0.0.1:3306","xxxx","xxxx");
mysql_select_db("opencv_development");


$uploaddir = "images/";
$file = basename($_FILES['uploadedfile']['name']);
$stamp = date("YmdHis");
$random = rand(0, 999);
$newName = $uploaddir . $stamp . $random . $file;


if ($_FILES['uploadedfile']['size']> 300000)     //Limiting image at 300K
{
exit("Your file is too large."); 
}



if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $newName)) {
echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
" has been uploaded";
} else{
echo "There was an error uploading the file, please try again!";
}

mysql_query("INSERT INTO recv_img (photo_name) VALUES ('$newName')");


shell_exec("./opencv '$newName'");

?>

正如我上面所说,如果我从终端运行应用程序,那么它会输出各个面部文件。当它从 php 脚本执行时,图像会加载到应用程序中,它会进行人脸检测,但不会保存单个人脸文件。

如果需要任何进一步的信息,或者我有什么不清楚的地方,请告诉我。非常感谢任何帮助!

【问题讨论】:

  • 运行 php 脚本的用户是否有权在您保存文件的目录中写入?
  • 是的,我相信这样我就可以使用相同的用户帐户从终端运行 opencv 应用程序并且它能够保存文件。

标签: php c++ opencv


【解决方案1】:

cvSaveImage 返回的整数可以帮助您查找是否有错误。
经过测试和查看OpenCV源代码,最近的版本似乎没有使用cvSetErrStatus处理文件错误,但errno似乎设置正确。

if(!cvSaveImage(name, gray)) {
    int error = cvGetErrStatus();
    const char * errorMessage = 0;
    if (error) {
        errorMessage = cvErrorStr(error);
    } else {
        error = errno;                   // needs #include <cerrno>
        errorMessage = strerror(error);  //       #include <cstring>        
    }
    std::cout << errorMessage << std::endl;  
    // with "echo shell_exec("./opencv '$newName'");" in php
}

如果返回的错误是“权限被拒绝”,您可以检查用户是否真的是您认为的用户和echo shell_exec('whoami');

【讨论】:

  • 首先,感谢您的回复。我按照您的建议尝试了,上传后网页上的输出是这样的:文件test.jpg已上传无错误无错误无错误无错误无错误无错误无错误事实上该照片中检测到7张面孔并对应于7 条“无错误消息”
  • @jmo 我编辑了我的答案。即使在尝试写入“/”之后,我也遇到了相同的“无错误”。
  • 啊,好的。现在,对于它试图保存的每一张脸,我都会收到“权限被拒绝”错误。那么这是否意味着权限设置不正确?如果是这样,我不明白如何从终端而不是从 php 运行它。
  • 好的,我更改了该文件夹的权限,现在一切正常。谢谢您的帮助。我真的很感激。
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2012-12-26
  • 2010-10-22
  • 2023-04-03
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多