2012-07-21 43 views
1

如何在opencv检测循环后执行一些shell脚本(例如1.sh)?如何在opencv检测循环后执行一些shell脚本

我已经使用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的代码块。

+0

这个问题,在这里问,它已被删除。 – ArtemStorozhuk 2012-07-21 09:26:28

回答

1

exec *之后,没有任何代码(在这个过程中)将达到。如果您希望程序在不等待脚本完成的情况下继续执行,则可以执行fork和exec操作,否则请添加等待。或者,你可以使用系统或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); 
} 

系统命令是〜的叉EXEC - 等待“sh -c command args”

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

器一起命令而未SH -c相似,会给你的输出流(思管道,FIFO等)

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

你能否给我举例或链接到等待exec或系统或popen的例子? – Faqih 2012-07-23 02:26:14

+0

fork示例中的'a'是什么? – Faqih 2012-09-02 07:50:22

+0

它是char **(由execvp要求) – technosaurus 2012-09-03 14:31:52