Как отправить сигнал Qt, содержащий cv :: Mat? - PullRequest
9 голосов
/ 10 марта 2012

Короче говоря, я получаю следующую ошибку:

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().)

РАБОТАЕТ

Ладно, похоже на работу.Я переехал qRegisterMetaType< cv::Mat >("cv::Mat"); прямо перед QObject::connect вызовом.Однако мне все еще нужно «F5» после точки останова в qglobal.h, это работает потом.

Возможно, я ошибаюсь, но кажется, что расположение qRegisterMetaType не тривиально.

1 Ответ

4 голосов
/ 10 марта 2012

Вам необходимо вызвать qRegisterMetaType в дополнение к макросу (или вместо него, в зависимости от ваших потребностей). Это необходимо для того, чтобы сигналы могли распределять ваши данные между потоками. Тем не менее, может быть разумнее передать по ссылке, умному указателю или необработанному указателю, если вы используете иерархию QObject для управления временем жизни объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...