2012-09-02 8 views
1

我有用於檢測方塊的opencv代碼。現在我想在偵測到方塊後,代碼運行另一個命令。檢測方塊後運行命令的C++算法

下面是代碼:

#include "cv.h" 
#include "cxcore.h" 
#include "highgui.h" 
#include "math.h" 
#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include <sstream> 

using namespace std; 

double angle(CvPoint* pt1, CvPoint* pt2, CvPoint* pt0) 
{ 
    double dx1 = pt1->x - pt0->x; 
    double dy1 = pt1->y - pt0->y; 
    double dx2 = pt2->x - pt0->x; 
    double dy2 = pt2->y - pt0->y; 
    return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10); 
} // angle 

IplImage* findSquares4( IplImage* img, CvMemStorage* storage) 
{ 
    double s = 0, t = 0; 
    int sdetect =0, sqdetect = 0,sqt = 0; 
    CvSeq* contours; 
    CvSeq* result; 
    CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage); 

    IplImage* cny = cvCreateImage(cvGetSize(img), 8, 1); 

    cvCanny(img, cny, 5, 100, 3); 

    cvNamedWindow("canny",CV_WINDOW_AUTOSIZE); 
    cvShowImage("canny",cny); 

    cvFindContours( cny, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); 

    while( contours) 
    { 
     result = cvApproxPoly( contours, 
           sizeof(CvContour), 
           storage, 
           CV_POLY_APPROX_DP, 
           cvContourPerimeter(contours)*0.02, 0); 

     if( result->total == 4 && 
      fabs(cvContourArea(result, CV_WHOLE_SEQ)) > 1000 && 
      cvCheckContourConvexity(result)) 
     { 
      s = 0; 
      for( int i = 2; i < 5; i++) 
      { 
       { 
        t = fabs(angle(
           (CvPoint*)cvGetSeqElem( result, i), 
           (CvPoint*)cvGetSeqElem( result, i-2), 
           (CvPoint*)cvGetSeqElem( result, i-1))); 
        s = s > t ? s : t; 
        cout << "s = " << s<< endl; 
        cout << "t = " << t<< endl; 
       } 
      } // for 
      if( s < 0.3) 
       for( int i = 0; i < 4; i++) 
        cvSeqPush( squares, 
          (CvPoint*)cvGetSeqElem( result, i)); 
     } // if 

    contours = contours->h_next; 

    } // while 
    if ((squares->total/4) = 1) 
    { 
     sdetect = 1; 
    }//if 
    else 
    { 
     sdetect = 2; 
     sleep(0.5); 
    } // else 

    if (sqdetect != sdetect) 
    { 
     sqdetect=sdetect; 
     switch(sqdetect) 
     { 
      case 0 : system(NULL) ; break; 
      case 2 : cout<< "no "<< endl; break; 
      case 1 : system("./ambil1.sh"); break; 
     } // switch 
    } // if 
    sdetect = 0; 

    cout<<"Persegi : "<< squares->total/4 <<endl; 

    cvReleaseMemStorage(&storage); 
    cvClearSeq(squares); 

} // findSquares4 

void drawSquares(IplImage *img, CvSeq* squares) 
{ 
    CvFont font; 
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.4f, 0.4f, 0,1, 8); 
    int i,j,sdetect,sqdetect = 0; 
    CvSeqReader reader; 
    cvStartReadSeq(squares, &reader, 0); 

    for(i = 0; i < squares->total; i += 4) 
    { 
     j++; 
     CvPoint pt[4], *rect = pt; 
     int count = 4; 

     // read 4 vertices 
     memcpy(pt, reader.ptr, squares->elem_size); 
     CV_NEXT_SEQ_ELEM(squares->elem_size, reader); 
     memcpy(pt + 1, reader.ptr, squares->elem_size); 
     CV_NEXT_SEQ_ELEM(squares->elem_size, reader); 
     memcpy(pt + 2, reader.ptr, squares->elem_size); 
     CV_NEXT_SEQ_ELEM(squares->elem_size, reader); 
     memcpy(pt + 3, reader.ptr, squares->elem_size); 
     CV_NEXT_SEQ_ELEM(squares->elem_size, reader); 

     cvPutText(img, "SQUARE", pt[i], &font, CV_RGB(20,255,0)); 

     cvPolyLine(img, &rect, &count, 1, 1, CV_RGB(200,0,0), 4, CV_AA, 0); 
    } // for 

cvClearSeq(squares); 
} // drawSquares 

但我得到的是,該方案成爲laggy。那麼執行system (./ambil1.sh)條件的正確算法是什麼?

回答

1

程序一直等到從屬命令結束。在此期間,它不會迴應。

如果這就是你所需要的,system就足夠了。

如果你想開火併忘記,你可以使用fork/exec對,或者使用shell &運算符在後臺運行東西。

如果您需要觸發,請更改您的程序行爲,然後在從屬命令完成時將其更改回來,您幾乎必須使用fork/exec/SIGCHLD/waitpid組合。

+0

你是什麼意思,火和忘記? – Faqih

+0

啓動下級程序並讓它與主程序並行運行,兩者之間沒有任何交互。 –

+0

你能提供一個我的代碼示例嗎? – Faqih