Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GtkImage不是';t更新和opencv赢得';无t图像_C++_C_Opencv_Gtk - Fatal编程技术网

C++ GtkImage不是';t更新和opencv赢得';无t图像

C++ GtkImage不是';t更新和opencv赢得';无t图像,c++,c,opencv,gtk,C++,C,Opencv,Gtk,我正在尝试显示来自网络摄像头的视频。我使用opencv从网络摄像头捕获图像,然后尝试在GtkImage上显示它们 这是我的代码,它在一个单独的线程中运行 gpointer View::updateView(gpointer v) { IplImage *image; CvCapture *camera; GMutex *mutex; View *view; view=(View*)v; camera=view->camera;

我正在尝试显示来自网络摄像头的视频。我使用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时,我得到一个seg错误,该错误表示free被传递了一个无效指针。

我不知道如何使用GtkImgae,但我猜您没有将较新的图像传递到窗口。您需要像本机cvShowImage这样的东西才能在循环内执行。如果不是我不知道

另外,您不应该发布用于捕获的图像。OpenCV自行分配和解除分配它


编辑:尝试使用OpenCV函数查看图像,看看问题是否仍然存在。

GTK和其他许多工具一样,是一个事件驱动的工具包。你所做的是将新图像排成一个无限循环,但绝不给GTK一个绘制它们的机会。这不是a的工作方式。您需要将手交还给GTK,以便它可以绘制更新的图像。实现这一点的方法在文档中进行了说明

此外,为每个图像分配/绘制/取消分配gdk pixpuf是次优的。只要在循环外分配缓冲区,在循环中使用它(它将覆盖以前的内容),然后显示它。如果图像大小更改,只需重新分配新的缓冲区