OpenCV阻塞了我的GTK接口
OpenCV blocking my GTK interface
我用GTK3编写了一个非常简单的GUI,有三个按钮:
- 启动:调用OpenCV VideoCapture
- 停止:停止VideoCapture
- 退出:破坏窗口
当我点击"停止"时,问题就出现了,OpenCV进程会阻塞GUI,并且命令会在几秒钟(通常是一分钟)后执行。
这是我的主菜:
bool stop = false;
static void start_webcam (GtkWidget *widget, gpointer data)
{
cout<<"Webcam On"<<endl;
int err = 0;
**err = opencv_webcam(); // this function loads the OpenCV Webcam**
// troubles?
if (err != 0)
{
cout<<"Unable to load the webcam. Error Code # "<<err<<endl;
}
}
static void stop_webcam (GtkWidget *widget, gpointer data)
{
stop = true;
cout<<"Webcam Off"<<endl;
}
int main (int argc, char *argv[])
{
// Widgets
GtkWidget *window;
GtkWidget *grid;
GtkWidget *button;
// GTK Init
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "WEBCAM CONTROL PANEL");
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
grid = gtk_grid_new ();
gtk_container_add (GTK_CONTAINER (window), grid);
/// START WEBCAM
button = gtk_button_new_with_label ("Start");
g_signal_connect (button, "clicked", G_CALLBACK (start_webcam), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);
/// STOP WEBCAM
button = gtk_button_new_with_label ("Stop");
g_signal_connect (button, "clicked", G_CALLBACK (stop_webcam), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 1, 0, 1, 1);
/// QUIT
button = gtk_button_new_with_label ("Quit");
g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1);
/// GO!
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
我想为"退出"按钮设置一些高优先级。我尝试在Windows中通过SetPriorityClass()设置main中的最高优先级,但没有成功。
非常感谢!
编辑
这是我的openCV代码:
extern bool stop;
int opencv_webcam()
{
/// Various stuff
cv::Mat frame;
cv::namedWindow("Webcam Session");
/// Webcam Opening
cv::VideoCapture clip(0);
while(stop != true)
{
// frames extraction
clip.grab();
clip.retrieve(frame);
// troubles?
if ((frame.empty()==1))
{
// errore!
return -1;
}
/// SHOW the frames
cv::imshow("Webcam Session", frame);
if (waitKey(30)>= 0)
{
break;
}
}
return 0;
}
GTK+是NOT多线程的。当您的一个信号处理程序正在运行时,所有其他GUI处理都会停止。opencv_webcam()
函数在GUI线程上运行,并在处理"开始"按钮信号时运行其主循环。停止和退出按钮不起作用的原因是它们从未有机会运行(至少在opencv_webcam()
出错之前)。
我不知道什么是合适的解决方案;我对OpenCV的了解还不够,无法提出一个解决方案,让你在玩GTK+的同时有稳定的时间。不过,我知道两种可能性:
- 在
gdk_threads_add_idle()
回调中执行所有OpenCV处理(稳定的定时将更困难) - 在不同的线程上运行OpenCV(如果你想在窗口中显示帧图像,你需要跨线程交流帧图像)
你需要四处搜索,找出最好的解决方案。试着在谷歌上搜索"gtk-opencv",看看你得到了什么。
或者,如果你正在做严格的网络摄像头工作,你可能想看看libcheese,它是专门针对网络摄像头的GTK+补充。
至于按钮优先级,据我所知,没有信号优先级。考虑到上面对您的错误的诊断,您应该能够理解为什么优先级无论如何都没有帮助。事实上,我不知道有任何GUI工具包适用于任何具有这种能力的平台。相反,您应该修复阻止GUI快速运行的线程错误。
相关文章:
- 如何在运行中期切换GTK CSS style_context
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何使用 GTK 3 正确设置默认文本
- 如何绑定 C++ gRPC 客户端的网络接口
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- OpenCV阻塞了我的GTK接口
- 在多线程应用程序中更新GTK接口的最佳方法是什么?
- GTK+接口应该在单独的线程中运行吗?