如何发送包含cv :: Mat的Qt信号?

时间:2012-03-10 11:37:33

标签: qt opencv signals-slots qthread

简而言之,我收到以下错误:

QObject::connect: Cannot queue arguments of type 'cv::Mat'
(Make sure 'cv::Mat' is registered using qRegisterMetaType().)

我要做的是将包含两个cv :: Mat图像的信号从QThread发送到主线程,以便我可以显示输出。没有编译时错误,但是当我运行程序时,它会卡在qglobal.h(inline void qt_noop() {})的断点处。

我试图在代码中添加Q_DECLARE_METATYPE(cv::Mat),但无济于事。我现在很蠢。

在QThread课程中:

signals:
void sndFlow(cv::Mat &leftEye, cv::Mat &rightEye);

void eyesDriver::run()
{
    forever
    {
        flow->draw(leftEye, rightEye);
        sndFlow(leftEye, rightEye);
    }
}

捕获QObject类:

public slots:
void recFlow(cv::Mat &leftEye, cv::Mat &rightEye);

void myClass::recFlow(cv::Mat &leftEye, cv::Mat &rightEye)
{
    cv::imshow("left", leftEye);
    cv::imshow("rigth", rightEye);
    cv::waitKey(40);
}

主要:

Q_DECLARE_METATYPE(cv::Mat)
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qRegisterMetaType< cv::Mat >("cv::Mat");
    // create objects from QThread and QObject class
    QObject::connect(&qthread, SIGNAL(sndFlow(cv::Mat&,cv::Mat&)),
                     &qobject, SLOT(recFlow(cv::Mat&,cv::Mat&)));
    qthread.start();
    return a.exec();
}

将信号槽变量更改为QSharedPointer< cv::Mat >也不起作用。给出了同样的错误:

QObject::connect: Cannot queue arguments of type 'QSharedPointer<cv::Mat>'
(Make sure 'QSharedPointer<cv::Mat>' is registered using qRegisterMetaType().)

WORKS

好吧,它似乎有效。我在qRegisterMetaType< cv::Mat >("cv::Mat");电话之前移动了QObject::connect。但是我仍然需要在Qglobal.h中的'F5'超过断点,之后它会起作用。

我可能错了,但似乎qRegisterMetaType的位置并非无足轻重。

1 个答案:

答案 0 :(得分:4)

除了宏之外,你需要调用qRegisterMetaType(或者代替它,取决于你的需要)。这对于信号能够跨线程封送数据是必要的。但是,如果使用QObject层次结构来管理对象生存期,则通过引用或智能指针或原始指针传递可能是一个更明智的想法。