2012-04-07 2 views
0

os X (lion)에서 opencv C++ (eclipse)를 사용하여 얼굴 탐지 앱을 프로그래밍하고 있습니다. 프로그램은 이미지 파일을로드하고 얼굴을 탐지 한 다음 각 얼굴을 개별 파일에 저장합니다. 이 프로그램은 명령 행이나 일식에서와 같이 100 % 작동합니다. 그런 다음 누군가가 jpg 또는 png 파일을 업로드 할 수 있도록 파일 업로드 용 PHP 스크립트를 작성한 후 스크립트는 고유 한 파일 이름으로 사진을 저장합니다. 그런 다음 PHP 스크립트의 끝에서 얼굴 감지 프로그램을 실행합니다.opencv C++에서 프로그램을 실행할 때 cvSaveImage가 저장되지 않습니다

커맨드 라인에서 응용 프로그램을 실행하고 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 스크립트에서 실행되면 이미지가 애플리케이션으로로드되고 얼굴 인식은 수행되지만 개별 얼굴 파일은 저장되지 않습니다.

추가 정보가 필요한지 또는 뭔가 명확하지 않은 경우 알려주십시오. 어떤 도움이라도 대단히 감사합니다!

+0

PHP 스크립트를 실행중인 사용자에게 파일을 저장 한 디렉토리에 쓰기 권한이 있습니까? – alexisdm

+0

예, 터미널에서 opencv 앱을 실행하는 데 동일한 사용자 계정을 사용할 수 있으며 파일을 저장할 수 있다고 생각합니다. – jmo

답변

0

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'); 생각하는 사람이 "사용 권한이 거부되었습니다"확인할 수있다 반환합니다.

+0

먼저 답장을 보내 주셔서 감사합니다. 내가 제안한대로 시도해 보았고 업로드 후 웹 페이지의 출력물이 다음과 같았습니다. 파일 test.jpg가 업로드되었습니다. 오류 없음 오류 없음 오류 없음 오류 없음 오류 없음 오류 없음 오류 해당 사진에서 7 개의 얼굴이 실제로 발견되었으며 7 "No Error messages" – jmo

+0

@jmo 내 대답을 편집했습니다. 나는 "/"에 쓰려고 시도한 후에도 "No Error"같은 것을 가지고있었습니다. – alexisdm

+0

아, 그래. 이제는 저장하려고하는 모든면에 대해 "Permission Denied"오류가 발생합니다. 그렇다면 사용 권한이 올바르게 설정되지 않았다는 의미입니까? 그렇다면 어떻게 터미널에서 실행될 수 있는지, PHP에서는 실행되지 않는지 이해할 수 없습니다. – jmo

관련 문제