スレッドを使用してCamShiftを実行しようとしています

私は2つのスレッドを作成するコードを書きました(私はglibを使用しています)。最初のスレッドは、カメラからキャプチャを開始するだけの Camera という関数を実行し、キャプチャされたフレームを画面に表示します。 2番目の関数は、最初の関数からキャプチャされたイメージを使用して実行を開始するアルゴリズム CamShift です。後で最初の関数からのキャプチャにアクセスする CamShift のようなアルゴリズムを追加するので、カメラからキャプチャする最初の関数を作成しました。

私の問題は、私がこれらの2つの機能を停止するように指示するまで実行し続けることです。しかし、私はスレッドを使用して新しく、コードをコンパイルして2つの関数を実行する方法を書いたのですが、開始後直ちに「一時停止」します。以下は私の2つの機能のコードです。

//**********Sensa iluminacion (hilo)******************************************
GThread      *idGHilo,*idGHilo1, *idGHilo2, *idGHilo3, *idGHilo4;
GError       **error = NULL;
char *valorDevuelto = NULL;/* Valor que va a devolver el thread hijo */
if(!g_thread_supported())//se inicializa el sistema de hilos (se emplea cuando  se
    g_thread_init( NULL );  //emplean más de un hilo


idGHilo1 = g_thread_create( (GThreadFunc) Camara, NULL, TRUE, error );//esto lo  cambie ayer 23
/* Comprobamos el error al arrancar el thread */
if(error) {
    g_print( "Error: %s\n", error[0]->message );
    g_error_free( error[0] );
    //exit (-1);
}
sleep( 10 );         //se da un retardo para dar tiempo a que termine el hilo
idGHilo2 = g_thread_create( (GThreadFunc) CamShift2, NULL, FALSE, error );
if(error) {
    g_print( "Error: %s\n", error[0]->message );
    g_error_free( error[0] );
    //exit (-1);
}
sleep( 10 ); //10...5
g_thread_join( idGHilo1 );
g_thread_join( idGHilo2 );


//****************************
// This is the camera function
void Camara() {

    capture = cvCaptureFromCAM( 0 );
    while( stop != 's' ) {

       //get a frame 
        frame = cvQueryFrame( capture );

       //always check 
        if( !frame ) break;

       //'fix' frame 
        cvFlip( frame, frame, 2 );
        frame->origin = 0;

        cvNamedWindow( "Camara", CV_WINDOW_AUTOSIZE );
        cvShowImage( "Camara", frame );

       //quit if user press 'q' 

        stop = cvWaitKey( 10 );
    }
}

他の関数は、OpenCVに付属する通常の CamShift アルゴリズムです。 Camera 関数から取得したフレームを使用するように変更しました。それは正常に動作しますが、問題は、私が前に言ったように、2つの機能が起動してから一時停止することです。

0
あなたは "停止"を初期化していますか?
追加された 著者 Ian Medeiros,
主な機能では2つの「眠る」必要はありません。 CamShift機能を実行すると、cvQuerieImageはすでに実行されていることを確認するだけです。そうでない場合は、最悪の場合はNULLイメージで作業したり、「フレーム」が更新される前に同じイメージを処理したりすることができます。これは、キャプチャが完了したことを通知するフラグで行うことも、FIFOキューを使用することもできます。
追加された 著者 Ian Medeiros,

1 答え

sleep を使用してスレッドの同期を試みないでください。 frame 変数を GMutex 、または GStaticRWLock をご覧ください。これにより、その共有リソースで競合状態が発生するのを防止します。また、 CamShift スレッドに GCond 条件変数の構造体です。これにより、フレームが Camera スレッドでキャプチャされるまで、 CamShift スレッドがブロックされます。

それが役に立つと願っています!

0
追加された