Taro3

View on GitHub

Qt と OpenCV を使用してウェブカメラの映像を Qt のウィジェット内に表示する

環境: Linux Mint 20 + Qt 5.15.1

全ソースはここ

Qt と OpenCV を使用して、ウェブカメラの映像を表示してみます。今回は、 Qt のウィジェット内に映像を表示してみます。

今回は、別スレッドで OpenCV の映像を取得更新するので、 ViewThread というクラスを追加しています。

このクラスの中では、VideoCapture でウェブカメラを選択して、 » オペレータで画像を取得したあとに、 OpenCV の BGR という順番のデータを Qt で使用する RGB に変換しています。変換した画像データは、 frameUpdate シグナルで渡します。

この処理は、スレッドを終了するまで繰り返します。

    ...
    cv::VideoCapture vc(_cameraId);
    cv::Mat tempFrame;

    while (!_isStop) {
        vc >> tempFrame;
        if (tempFrame.empty())
            break;
        cv::cvtColor(tempFrame, tempFrame, cv::COLOR_BGR2RGB);
        QMutexLocker locker(_lock);
        _frame = tempFrame;
        locker.unlock();
        emit frameUpdated(&_frame);
    }
    vc.release();
    ...

メインスレッド側では、 スロットで取得した Mat データを QPixmap に変換して、QGraphicsView 内の QGraphicsScene に表示しています。

    QMutexLocker locker(_lock);
    cv::Mat data = *mat;
    locker.unlock();

    QImage frame(data.data, data.cols, data.rows, data.step, QImage::Format_RGB888);
    QPixmap image = QPixmap::fromImage(frame);
    QGraphicsView* view = ui->graphicsView;
    QGraphicsScene* scene = view->scene();
    scene->clear();
    view->resetTransform();
    scene->addPixmap(image);
    scene->update();
    view->setSceneRect(image.rect());

別スレッドで画像取得処理をしているので、 メインスレッド側で他の処理を行うこともできます。

実行結果はこのようになります。

実行結果


戻る