2012-07-21 5 views
1

Comment exécuter un script shell (par exemple 1.sh) après que opencv ait détecté le cercle?Comment exécuter un script shell après opencv detect circle

J'ai utilisé exec, ça marche mais le programme opencv ferme après le cercle détecté, et ce que je veux, c'est que le programme ne s'est pas fermé avant d'appuyer sur la touche "q".

Voici mon code:

#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; 
} 

J'utilisé codeblocks sur ubuntu.

+0

cette question a été posée ici et il a été supprimé. – ArtemStorozhuk

Répondre

1

Après exec *, aucun code (dans ce processus) ne sera atteint. Vous pouvez fork, exec si vous voulez que le programme continue sans attendre que le script se termine, sinon ajouter une attente. Alternativement, vous pouvez utiliser le système ou popen.

Exemples:

exemple fonction à la fourchette une commande et attendre:

#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); 
    } 
} 

à la fourchette une commande et continuer

#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); 
} 

la commande du système est ~ fourche exec-attente de "sh -c command args"

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

la commande popen est similaire sans sh -c et vous donnera la sortie en tant que flux (tuyaux de réflexion, fifo, etc.)

#include <stdio.h> 
FILE *fp; 
fp = popen("command args", "r"); 
... 
pclose(fp); 
+0

Pourriez-vous me donner un exemple ou un lien vers un exemple pour exec avec wait, ou system ou popen? – Faqih

+0

qu'est-ce qu'un 'a' sur un exemple de fourche? – Faqih

+0

C'est un caractère ** (requis par execvp) – technosaurus

Questions connexes