C++ GtkImage不是';t更新和opencv赢得';无t图像
我正在尝试显示来自网络摄像头的视频。我使用opencv从网络摄像头捕获图像,然后尝试在GtkImage上显示它们 这是我的代码,它在一个单独的线程中运行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;
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是次优的。只要在循环外分配缓冲区,在循环中使用它(它将覆盖以前的内容),然后显示它。如果图像大小更改,只需重新分配新的缓冲区