OpenCV多线程错误[使用Qt]

时间:2012-07-16 22:32:41

标签: multithreading qt opencv

直到现在我已经学到了一件事,我正在使用OpenCV做错了,Qt在错误中没有任何作用

我正在尝试在不同的线程中运行两个方法,但它给了我错误:

  

[xcb]出队时队列中的未知请求
  [xcb]很可能这是一个多线程客户端,并且XInitThreads没有被称为   [xcb]中止,对不起。
  Blurring_Images:../../ src / xcb_io.c:178:dequeue_pending_request:断言`!xcb_xlib_unknown_req_in_deq'失败。
  该计划意外地完成了。


这是我的代码:

void Dialog::blurImages(int b)
{
    QtConcurrent::run(this,&Dialog::homogenour_blur,b);
    QtConcurrent::run(this,&Dialog::gaussianBlur,b);
}

void Dialog::homogenour_blur(int b)
{
    cv::blur(img,img1,cv::Size(b,b));
    showImage("Homogenous Blur",img1);
}

void Dialog::gaussianBlur(int b)
{
    cv::GaussianBlur(img,img2,cv::Size(b,b),b);
    showImage("Gaussian Blur",img2);
}

如果我注释掉一个电话(如下所示),它运行良好

void Dialog::blurImages(int b)
{
    QtConcurrent::run(this,&Dialog::homogenour_blur,b);
    //QtConcurrent::run(this,&Dialog::gaussianBlur,b);
}

真的很烦人,请帮忙!!

修改 我没有调用showImage(),而是将其替换为真正的OpenCV调用(见下文):

void Dialog::homogenour_blur(int b)
{
    cv::blur(img,img1,cv::Size(b,b));
    //showImage("Homogenous Blur",img1);
    cv::imshow("Homogenous Blur",img1);
}

void Dialog::gaussianBlur(int b)
{
    cv::GaussianBlur(img,img2,cv::Size(b,b),b);
    //showImage("Gaussian Blur",img2);
    cv::imshow("Gaussian Blur",img2);
}

现在我得到的错误是:

  

原始图像:X服务器上的致命IO错误11(资源暂时不可用):0。
  原始图像:X服务器上的致命IO错误0(成功):0。
  致命错误:破坏后访问全局静态'KGlobalSettings * s_self()'。定义于../../kdeui/kernel/kglobalsettings.cpp:190
  该计划意外地完成了。

3 个答案:

答案 0 :(得分:8)

对所有有关人员:

解决Jaydeep的问题

  

[xcb]出队时队列中的未知请求

     

[xcb]很可能这是一个多线程客户端,并且没有调用XInitThreads

     

[xcb]流产,对不起。

  

错误:未在此范围内声明'XInitThreads'

通过链接X11(包括xlib)和调用XInitThreads。

包含xlib和调用XInitThreads的示例:

// main.cpp
#include <thread> 
#include <X11/Xlib.h>

int main() {
   XInitThreads();
   // . . . 
}

链接示例:

g++ main.cpp -o my_program -std=c++0x -pthread -lX11 /* -pthread if you're on Linux */

当然,不要忘记链接您的应用程序可能需要的其他文件

答案 1 :(得分:-1)

imshow() 方法似乎不是线程安全的。如果你使用python,可以这样解决:

self.img_lock = threading.Lock()

with self.img_lock:
  cv2.imshow()
  cv2.waitKey(1)

答案 2 :(得分:-4)

线程关闭。

我不知道为什么会出现这个问题,但我已经解决了这个问题。

感谢RA。表现出极大的兴趣:)