1

私は cv::VideoCapture から継承するクラス Camera を持っています。そのコア メソッドは、ライブ ストリームから取得した cv::Mat を QImage に変換することです。

QImage Camera::getFrame() {
    if(isOpened()) {
        cv::Mat image;
        (*this) >> image;
        cv::cvtColor(image, image, CV_BGR2RGB);
        return QImage((uchar*) image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
    }
    else return QImage();
}

そして、このメソッドを呼び出して遅延を追加するカプセル化クラス CameraDelayedView :

void CameraDelayedView::timerEvent(QTimerEvent *evt) {
    if(cam != NULL) {
        buffer.enqueue(cam->getFrame());

        if(buffer.size() > delay*fps) {
            setPixmap(QPixmap::fromImage(buffer.dequeue()));
        }
    }
}

動画の初期表示が5秒遅れて表示されますが、その後はスムーズに動作しています。画像はポインタを介してライブフィードに何らかの形でリンクされているようです (または QQeueue は適切な FIFO ではありませんが、私はそれを疑っています)...そうですか?

もしそうなら、この方法で同じことを経験している他の人に答えを与えることができ、効率的なコピー方法(または上記のコードのより効率的な方法)に興味があります。そうでなければ、何が起こっているのかわかりません...

前もって感謝します。

よろしく、 ミスター・ミステール

4

2 に答える 2

2

カメラからのフィードは、ある種のバッファーでキューに入れられます。私はしばらくの間、この問題に苦労しており、別のスレッドを使用して解決しました。これは、バッファからフレームを常に取得し、要求された場合はフレームをメインスレッドに送信します。

于 2013-05-05T17:00:20.327 に答える