8

opencvとQtを使用してアプリケーションを作成しています。アプリケーション内で、ビデオを録画するための小さなツールを作成しています。このため、メインイベントスレッドをブロックしないように、記録スレッドを含む別のダイアログを作成しました。初心者向けのこのスレッドでは、カメラの出力だけを見たかったのです(レコーディングコードはまだ紹介していません)。したがって、サブクラス化QThreadすると、run()関数は次のようになります。

void VideoRecordThread::run(){
    cv::VideoCapture capture;
    cv::Mat frame;
    QImage img;

    qDebug() << "Opening camera" << cameraIndex ;
    capture.open(cameraIndex);

    if(!capture.isOpened()){
        qDebug() << "Could not open camera" << cameraIndex;
        emit threadReturned();
        return;
    }

    while(!stopFlag){
        capture >> frame;
        qDebug() << "Frame Width = " << frame.cols << "Frame Height = " << frame.rows;
        if(frame.cols ==0 || frame.rows==0){
            qDebug() << "Invalid frame skipping";
            continue;
        }
        img = cvMatToQImage(frame); //Custom function
        emit imageCaptured(img);
    }
    capture.release();
    emit threadReturned(); //Custom signal
    qDebug() << "Thread returning";
}

これは機能するはずですが、問題は、スレッドが開始すると、接続されているカメラの1つを選択すると、カメラを選択するように求める新しいダイアログが「突然」表示されることです。機能する場合と機能しない場合があります。 t。これが私が得るダイアログです:

ここに画像の説明を入力してください

私に何ができるかについて何か助けはありますか?

4

1 に答える 1

4

一部の関数がメイン スレッドから実行されない場合、OpenCV に問題があることに気付きました。

キャプチャ プロシージャの初期化をアプリケーションのメイン スレッドに移動し、残りはセカンダリ スレッドに残します。初期化部分は次のようです。

cv::VideoCapture capture;

qDebug() << "Opening camera" << cameraIndex ;
capture.open(cameraIndex);

if(!capture.isOpened())
{
    qDebug() << "Could not open camera" << cameraIndex;
    emit threadReturned();
    return;
}
于 2012-04-27T02:08:29.027 に答える