gpt4 book ai didi

c++ - GtkImage 不会更新并且 opencv 不会释放图像

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:52 25 4
gpt4 key购买 nike

我正在尝试显示来自网络摄像头的视频。我使用 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 被传递了一个无效的指针。

最佳答案

GTK 与许多其他工具包一样,是一个事件驱动的工具包。您正在做的是在无限循环中排队绘制新图像,但永远不要给 GTK 绘制它们的机会。这不怎么了message pump作品。您需要帮助 GTK,以便它可以绘制更新后的图像。 gtk_events_pending 中解释了这样做的方法。文档。

此外,为每个图像分配/绘制/取消分配 gdk-pixpuf 并不是最佳选择。只要在你的循环中分配一次缓冲区,在你的循环中绘制它(它会覆盖以前的内容),然后显示它。如果您的图像大小发生变化,您只需要重新分配一个新的缓冲区。

关于c++ - GtkImage 不会更新并且 opencv 不会释放图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9866618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com