0

OS X (ライオン) で 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 スクリプトから実行すると、画像がアプリケーションに読み込まれ、顔検出が行われますが、個々の顔ファイルは保存されません。

さらに情報が必要な場合、または不明な点がある場合はお知らせください。どんな助けでも大歓迎です!

4

1 に答える 1

0

によって返される整数cvSaveImageは、エラーがあったかどうかを見つけるのに役立ちます。 OpenCV のソース コードをテストして調べたところ、最近のバージョンではファイル エラーが
使用されていないようですが、正しく設定されているようです。cvSetErrStatuserrno

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');.

于 2012-04-08T13:05:50.713 に答える