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

Raf*_*ens 9 qt opencv signals-slots qthread

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

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

我要做的是将包含两个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

捕获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);
}
Run Code Online (Sandbox Code Playgroud)

主要:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

作品

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

我可能错了,但似乎位置qRegisterMetaType不是微不足道的.

Tam*_*lei 6

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