2012-03-26 3 views
1

ウェブカメラからビデオを表示しようとしています。 opencvを使ってウェブカメラから画像をキャプチャし、GtkImageに表示しようとします。GtkImageが更新されておらず、opencvは画像を解放しません。

これは私のコードで、別のスレッドで実行されます。

gpointer View::updateView(gpointer v) 
{ 
    IplImage *image; 
    CvCapture *camera; 
    GMutex *mutex; 
    View *view; 

    view=(View*)v; 
    camera=view->camera; 
    mutex=view->cameraMutex; 

    while(1) 
    { 
     g_mutex_lock(view->cameraMutex); 
     image=cvQueryFrame(camera); 
     g_mutex_unlock(view->cameraMutex); 

     if(image==NULL) continue; 

     cvCvtColor(image,image,CV_BGR2RGB); 

     GDK_THREADS_ENTER(); 
     g_object_unref(view->pixbuf); 
     view->pixbuf=gdk_pixbuf_new_from_data((guchar*)image->imageData,GDK_COLORSPACE_RGB,FALSE,image->depth,image->width,image->height,image->widthStep,NULL,NULL); 

     gtk_image_set_from_pixbuf(GTK_IMAGE(view->image),view->pixbuf); 
     gtk_widget_queue_draw(view->image); 
     GDK_THREADS_LEAVE(); 
     usleep(10000); 
    } 

} 

ウェブカメラから1枚の画像が表示され、表示されてからGtkImageが更新を停止するということが起こります。

さらに、私がcvReleaseImageを使用しようとすると、フリーに無効なポインタが渡されたというsegフォルトが発生します。

答えて

2

GTKは他の多くのイベント・ドリブン・ツールキットです。あなたがやっていることは無限ループで描画するために新しい画像をキューに入れることですが、GTKに描画する機会を与えることは決してありません。これはmessage pumpの仕組みではありません。 GTKに手を戻す必要があるため、更新されたイメージを描画できます。これを行う方法については、gtk_events_pendingのマニュアルを参照してください。

また、画像ごとにgdk-pixpufを割り当てる/描画/割り当てを解除することは最適ではありません。あなたのループからバッファを1回だけ割り当て、ループ内にバッファを描画して(前のコンテンツを上書きします)、それを表示します。イメージのサイズが変更された場合は、新しいバッファを再割り当てする必要があります。

0

GtkImgaeの使い方はわかりませんが、新しい画像をウィンドウに渡していないと思います。ループ内で実行するには、ネイティブcvShowImageのようなものが必要です。そうでなければ私は知らない。

また、キャプチャに使用する画像を解放しないでください。 OpenCVはそれ自体を割り当て、割り当てを解除します。

編集:OpenCV機能を使用して画像を表示し、問題がまだ存在するかどうかを確認してください。

関連する問題