3

カメラからライブビューをキャプチャしようとしており、QLabel に表示されるようにリダイレクトしています。ただし、半分しか表示されません (以下を参照)。 スクリーンショット

左側のウィンドウは、完全に機能する cv::imshow() を使用して表示されます。別のスレッドで Mat をキャプチャし、Qimage をパラメーターとして信号を送信し、そのイメージをスロットの QLabel に設定しています。

コードは次のとおりです。

while(true){
    cam >> mat;
    cv::imshow("name",mat);
    emit send_UIupdate(mat2qimage(mat));
}

スロットでイメージを Qlabel に設定します。

void Dialog::updateUI(const QImage &img){
    label->setPixmap(QPixmap::fromImage(img));
}

以下を使用して Mat を QImage に変換します。

QImage camera::mat2qimage(const cv::Mat& mat) {
    cv::Mat rgb;
    cv::cvtColor(mat, rgb, CV_BGR2RGB);
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);
}

この問題を解決するための提案はありますか??

4

4 に答える 4

1
VideoCapture cap("video.avi");
Mat frame;
QImage img;
QPixmap pixel;
while(cap.isOpened())
{
    cap >> frame;
    img= QImage((uchar*) frame.data, frame.cols, frame.rows, frame2.step, QImage::Format_RGB888);
    pixel = QPixmap::fromImage(img);
    ui->label->setPixmap(pixel);
}    
于 2015-02-23T14:47:02.303 に答える
0

mat2qimage 関数では、コピーを返す必要があります。

return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, Image::Format_RGB888).copy();

于 2014-12-03T21:55:16.077 に答える
0

問題は以下のコードにあると思います:

while(true){
    cam >> mat;
    cv::imshow("name",mat);
    emit send_UIupdate(mat2qimage(mat));
}

ループして Qt に必要な処理をさせないため、アプリケーションがフリーズします。ref-link: QT do while ループ

ご存じのように、Qt には独自のイベント ループがあるため、関数で while(true) ループを使用すると、Qt がイベントを受信しない可能性があります。

@CTZStefが言ったように、whileループを削除し、Qtimerを使用してみてください。

次のソース コードが参考になるかもしれません: http://blog.csdn.net/robertkun/article/details/9030929

于 2013-12-28T07:54:57.417 に答える