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

8

你可以试试这个:

QImage MainWindow::putImage(const Mat& mat)
{
    // 8-bits unsigned, NO. OF CHANNELS=1
    if(mat.type()==CV_8UC1)
    {
        // Set the color table (used to translate colour indexes to qRgb values)
        QVector<QRgb> colorTable;
        for (int i=0; i<256; i++)
            colorTable.push_back(qRgb(i,i,i));
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8);
        img.setColorTable(colorTable);
        return img;
    }
    // 8-bits unsigned, NO. OF CHANNELS=3
    if(mat.type()==CV_8UC3)
    {
        // Copy input Mat
        const uchar *qImageBuffer = (const uchar*)mat.data;
        // Create QImage with same dimensions as input Mat
        QImage img(qImageBuffer, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return img.rgbSwapped();
    }
    else
    {
        qDebug() << "ERROR: Mat could not be converted to QImage.";
        return QImage();
    }
}

我用 QTimer 调用它。我从那里得到它:http ://code.google.com/p/qt-opencv-multithreaded/

希望这有帮助。

于 2012-08-08T23:15:17.020 回答
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

我认为问题来自以下代码:

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

您的应用程序冻结,因为您正在循环并且从不让 Qt 进行必要的处理。参考链接:QT 做 while 循环

你知道,Qt 有它自己的事件循环,所以,如果你在函数中使用 while(true) 循环,Qt 可能永远不会收到事件。

尝试删除 while 循环,并按照@CTZStef 所说的那样使用 Qtimer。

以下源代码可能对您有所帮助:http: //blog.csdn.net/robertkun/article/details/9030929

于 2013-12-28T07:54:57.417 回答
0

在 mat2qimage 函数中,您应该返回一个副本。

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

于 2014-12-03T21:55:16.077 回答