1

opencv が円を検出した後にシェル スクリプト (1.sh など) を実行するにはどうすればよいですか?

私はexecを使用しましたが、動作しますが、円が検出された後にopencvプログラムが閉じます.「q」キーを押すまでプログラムが閉じないことが必要です。

これが私のコードです:

#include<cv.h>
#include<highgui.h>
#include <math.h>
#include <stdlib.h>
#include <unistd.h>

using namespace std;

int main( int argc, char **argv )
{
    CvCapture *capture = 0;
    IplImage  *img = 0;
    int       key = 0;
    CvFont font;

    cvInitFont(&font, CV_FONT_HERSHEY_PLAIN,1.0,1.0,0,1,CV_AA);
    capture = cvCaptureFromCAM( 0 );

    if ( !capture ) {
        fprintf( stderr, "Cannot open initialize webcam!\n" );
        return 1;
    }

    cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );

    img = cvQueryFrame( capture );
    if (!img)
        exit(1);

    IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
    CvMemStorage* storage = cvCreateMemStorage(0);

    while( key != 'q' ) {
        img = cvQueryFrame( capture );
        if( !img ) break;

        cvCvtColor( img, gray, CV_BGR2GRAY );
        cvSmooth( gray, gray, CV_GAUSSIAN, 5, 5 );
        CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, >gray->height/40, 200, 100/*, 20, 100*/ );
        int i;
        for( i = 0; i < circles->total; i++ )
        {
            float* p = (float*)cvGetSeqElem( circles, i );

            cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), >CV_RGB(50,255,30), 5, 8, 0 );
            cvPutText(img, "CIRCLE",cvPoint(cvRound(p[0]+45),cvRound(p[1]+45)), &font, >CV_RGB(50,10,255));

            if ( circles ) {
                execl("./1.sh", (char *)0);
            }

        }

        cvShowImage( "result", img );
        cvShowImage("gray", gray);
        key = cvWaitKey( 1 );

    }

    //    cvReleaseMemStorage(storage);
    //    cvReleaseImage(gray);
    cvDestroyAllWindows();
    cvDestroyWindow( "result" );
    cvReleaseCapture( &capture );

    return 0;
}

ubuntuでコードブロックを使用しました。

4

1 に答える 1

1

exec* の後、(そのプロセスの) どのコードにも到達しません。スクリプトが完了するのを待たずにプログラムを続行したい場合は fork 、 exec を実行できます。それ以外の場合は、待機を追加します。または、system または popen を使用することもできます。

例:

コマンドをフォークして待機する関数の例:

#include <unistd.h>
/*as a macro*/
#define FORK_EXEC_WAIT(a) ({int s,p;if((p=fork())==0) \
{execvp(a[0],a);}else{while(wait(&s)!= p);}})
/*as a function*/
void fork_exec_wait(char** a) {
    int s,p;
    if((p=fork())==0){
        execvp(a[0],a);
    }else{
        while(wait(&s)!= p);
    }
}

コマンドをフォークして続行する

#include <unistd.h>
/*as a macro*/
#define FORK_EXEC(a)    ({if((fork())==0) execvp(a[0],a);})
/*as a function*/
void fork_exec(char** a) {
    int s,p;
    if((p=fork())==0)
        execvp(a[0],a);
}

システムコマンドは ~ fork-exec-wait of "sh -c command args" です

#include <stdlib.h>
system("command args");

popen コマンドは sh -c なしでも同様であり、出力をストリームとして提供します (パイプ、fifo などを考えてください)。

#include <stdio.h>
FILE *fp;
fp = popen("command args", "r");
...
pclose(fp);
于 2012-07-21T10:18:55.180 に答える