1

I have opencv code for detecting square. And now I want after detect square, the code run another command.

Here is the code:

#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

But what I got is that the program becomes laggy. So what is the right algorithm to place condition for executing system (./ambil1.sh)?

Faqih
  • 47
  • 1
  • 8

1 Answers1

1

The program waits until the subordinate command finishes. During this time it will not respond.

If that's what you need, system is adequate.

If you want to fire and forget, you can either use the fork/exec pair, or just use the shell & operator to run stuff in the background.

If you need to fire, change your program's behaviour, then change it back when the subordinate command finishes, you almost have to use the fork/exec/SIGCHLD/waitpid combination.

n. m. could be an AI
  • 112,515
  • 14
  • 128
  • 243