[英]opencv c++, cvSaveImage not saving when program is executed from php
我正在 os X (lion) 上使用 opencv c++(eclipse) 编写人脸检测应用程序。 该程序加载图像文件,检测面孔,然后将每张面孔保存到单独的文件中。 该程序在命令行或 eclipse 中 100% 工作。然后我编写了一个 php 文件上传脚本,以便有人可以上传 jpg 或 png 文件,然后该脚本使用唯一的文件名保存照片。 然后在 php 脚本的末尾,我让它执行人脸检测程序。
我不确定从命令行运行应用程序和让 php 调用应用程序运行有什么区别。 下面是我的代码。
c++ 中的 function:
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 脚本执行时,图像会加载到应用程序中,它会进行人脸检测,但不会保存单独的人脸文件。
让我知道是否需要任何进一步的信息,或者如果我不清楚某些事情。 任何帮助是极大的赞赏!
cvSaveImage 返回的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
}
如果返回的错误是“Permission denied”,您可以检查用户是否真的是您认为的那个用户并echo shell_exec('whoami');
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.