2012-03-26 2 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); 
    } 

} 

웹캠에서 하나의 이미지를 가져 와서 표시 한 다음 GtkImage가 업데이트를 중지하는 경우가 발생합니다.

또한 cvReleaseImage를 사용하려고 시도 할 때 free에 잘못된 포인터가 전달되었다는 seg 오류가 발생합니다.

답변

2

GTK는 많은 다른 것들과 마찬가지로 이벤트 중심 툴킷입니다. 당신이하고있는 일은 새로운 이미지를 큐잉하여 무한 루프를 그리는 것이지만, GTK에게 그릴 기회를주지 마십시오. 이것은 message pump의 작동 방식이 아닙니다. GTK에 손을 돌려줘야 업데이트 된 이미지를 그릴 수 있습니다. 이를 수행하는 방법은 gtk_events_pending 문서에 설명되어 있습니다.

또한 각 이미지에 대해 gdk-pixpuf를 할당/할당 취소하는 것이 차선책입니다. 루프에서 한 번만 버퍼를 할당하고 루프에서 버퍼를 그립니다 (이전 내용을 덮어 씁니다). 이미지 크기가 변경된 경우에만 새 버퍼를 재 할당해야합니다.

0

나는 GtkImgae로 작업하는 방법을 모르지만 제 생각에 당신은 더 새로운 이미지를 창에 전달하지 않는다는 것입니다. 루프 내에서 실행하려면 원시 cvShowImage와 같은 것이 필요합니다. 그것이 아니라면 나는 모른다.

또한 캡처 할 이미지를 공개해서는 안됩니다. OpenCV는 그 자체를 할당하고 할당을 해제합니다.

편집 : OpenCV 기능을 사용하여 이미지를보고 문제가 아직 있는지 확인하십시오.

관련 문제