我正在尝试将OpenCV的网络摄像头访问和图像显示功能与Qt的网络功能(使用OpenCV 2.4.2 highgui的Qt 4.8.1 C ++控制台应用程序)结合起来。 我目前正在努力避免将cv :: Mat转换为Qt格式并通过自定义Qt GUI显示它以简化。
为此,我创建了一个包装类,它执行所有OpenCV的东西(cap = new VideoCapture(),namedWindow(),cap-> read(),imshow(),destroyAllWindows(),cap-> release())由QTimer控制,将其移至QThread。 这大部分都有效(仍然是garbage characters in the window title)但有时OpenCV会在线程的父类从其QTCPServer接收信号时创建一个新窗口。 这导致“死”图像窗口不再更新。
创建顺序(OpenCV线程/ QTcpServer)似乎并不重要 - 但是,如果没有客户端连接,我可以看到OpenCV首先创建一个小窗口,因此放大以适应视频图像大小。 如果客户端连接,大多数时间都会保留较小的窗口(窗口标题垃圾就像“ét”),较新的窗口正确接收图像数据(窗口标题垃圾就像“,ét”)。
不将OpenCV包装器对象移动到线程也可以正常工作,但是会出现同样的问题(更糟糕的是,创建了两个死窗口,其中第二个窗口已经收到了图像帧)。
我通常会做出什么错误导致这种行为?
我怀疑问题可能是由我的QOBject包装器类(构造函数和插槽)的两种不同方法创建和访问的命名窗口引起的。 或者QTCPServer阻止了Qt事件循环?或者,当QTCPServer事件触发Signal-Slot机制时,OpenCV窗口句柄由于某种原因被“垃圾收集”,然后imshow创建一个新窗口? 没有明显的方法通过指针访问窗口,所以这必然是原因。删除初始的namedWindow()会消除小的空窗口,但仍会创建两个窗口。
似乎我必须自己转换并显示图像 - 或者还有其他方式吗?
答案 0 :(得分:0)
我认为这里的问题是封装,据我所知,你试图从两个不同的线程在同一个窗口上显示一个图像,这是错误的。你应该从单个线程显示图像,也许你可以在该线程创建一个图像缓冲区,而你的其他线程将图像放到该缓冲区,你可以使用该缓冲区来显示图像。如果我理解错了你能更清楚地解释你的问题吗?