GtkImage не обновляется и opencv не освобождает изображения - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь отобразить видео с веб-камеры. Я снимаю изображения с веб-камеры с помощью opencv, а затем пытаюсь отобразить их на GtkImage.

Это мой код, который выполняется в отдельном потоке.

  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 был передан неверный указатель.

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

GTK - это управляемый событиями инструментарий, как и многие другие. То, что вы делаете - это ставите в очередь новые изображения, чтобы рисовать их в бесконечном цикле, но никогда не дайте GTK возможность их нарисовать. Это не то, как работает насос сообщений . Вам нужно вернуть руку GTK, чтобы он мог нарисовать обновленное изображение. Способ сделать это объяснен в gtk_events_pending документации.

Кроме того, распределение / рисование / освобождение gdk-pixpuf для каждого изображения является неоптимальным. Просто выделите буфер из цикла, нарисуйте его в цикле (он перезапишет предыдущий контент) и отобразите его. Вам нужно только перераспределить новый буфер, если размер вашего изображения изменится.

0 голосов
/ 26 марта 2012

Я не знаю, как работать с GtkImgae, но я предполагаю, что вы не передаете более новые изображения в окно.Вам нужно что-то вроде родного cvShowImage для выполнения внутри цикла.Если это не так, я не знаю.

Кроме того, вы не должны выпускать изображение, используемое для захвата.OpenCV выделяет и освобождает его сам.

РЕДАКТИРОВАТЬ: попробуйте использовать функции OpenCV для просмотра изображения и посмотреть, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...