c++ - 使用 OpenCV 打开网络摄像头并使用 QLabel 显示它 - 白色窗口

标签 c++ qt opencv video-capture qlabel

我使用 OpenCV、Qt 库和 VS 2010 在 Win7 x64 上工作。

我想用 OpenCV 打开我的相机,然后在从 Mat 转换为 QImage 之后用 Qt 显示捕获的帧,例如使用 QLabel。

我想这样做是因为使用函数 imshow("camera", image) 和 waitKey() 会减慢流式摄像机的速度。

这是我的代码:

int main () {
 QApplication a(argc, argv);
 QLabel myLabel;
 VideoCapture cap(0);
 //namedWindow(c"camera", 1);

 for (;;) {

    cap >> image;
        //conversion from Mat to QImage
    Mat dest;
    cvtColor(image, dest,CV_BGR2RGB);
    QImage image1= QImage((uchar*) dest.data, dest.cols, dest.rows, dest.step, QImage::Format_RGB888);

        //show Qimage using QLabel
    myLabel.setPixmap(QPixmap::fromImage(image1));
    myLabel.show();
    //imshow("camera",image);
    //if (waitKey(30)>= 0)  break;
 }
return a.exec();
}   

网络摄像头已正确打开并正常工作,但我看到的是一个白色窗口,而不是捕获的帧,如您在此图像中所见 enter image description here

如果我取消注释:namedWindow (..), imshow(..), if(waitKey(..),它会起作用(我看到两个具有相同图像的窗口),但我显示使用 OpenCV 捕获帧,这是我想避免的。

我的问题是:我做错了什么??我不知道,从 Mat 到 Qimage 的转换是错误的??.. 或者,我不能仅使用 Qt 显示捕获的帧吗?

谢谢!

最佳答案

我没有太多经验,但我可以看出这里可能出什么问题:

 for (;;) {

    cap >> image;
        //conversion from Mat to QImage
    Mat dest;
    cvtColor(image, dest,CV_BGR2RGB);
    QImage image1= QImage((uchar*) dest.data, dest.cols, dest.rows, dest.step, QImage::Format_RGB888);

        //show Qimage using QLabel
    myLabel.setPixmap(QPixmap::fromImage(image1));
    myLabel.show();
    //imshow("camera",image);
    //if (waitKey(30)>= 0)  break;
 }

您在死循环中执行此操作 - 它会导致您的 QLabel 无限更新自身,因此您可能看不到任何内容。此外,如果取消注释 waitKey 对您有帮助,那几乎意味着您正在将数据很好地转换为 QImage,但其他部分已损坏。

请注意,a.exec() 永远不会执行,因为您将陷入循环,但我想这足以满足这个概念。

为了不卡住事件循环,您需要创建QTimer 并且每 x 毫秒更新您的小部件:

 class VideoWindow: public QWidget
 {
    Q_OBJECT
    public:
        VideoWindow(QWidget* parent = 0): QWidget(parent), cap(0)
        {
            timer = new QTimer(this);
            connect(timer, SIGNAL(timeout()), this, SLOT(updatePicture()));
            timer->start(20);
        }


    public slots:
        void updatePicture()
        {
            cap >> image;
            //conversion from Mat to QImage
            Mat dest;
            cvtColor(image, dest,CV_BGR2RGB);
            QImage image1 = QImage((uchar*) dest.data, dest.cols, dest.rows, dest.step, QImage::Format_RGB888);

            //show Qimage using QLabel
            setPixmap(QPixmap::fromImage(image1));
        }

    private:
        QTimer * timer;
        VideoCapture cap;
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    VideoWindow w;
    w.show();

    app.exec();
    return 0;   
}

关于c++ - 使用 OpenCV 打开网络摄像头并使用 QLabel 显示它 - 白色窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14729417/

相关文章:

c++ - Qt中如何修改QWebsocket定时器

c++ - 在 OpenCV 中计算 3D 梯度方向

python - 如何使用 python opencv2 在单个窗口中显示多个视频帧

c++ - 如何调用 char 构造函数而不是 char[] 构造函数

c++ - JNI_CreateJavaVM : Buffer overrun if I throw an exception in case of failure

c++ - 如何使用 std::map 将 bool 映射到 3d 点结构?

复杂数据结构的Qt Model/View编程

Qt 样式表语法 : targeting a specific button, 不是所有按钮

c++ - OpenCV 中的嘈杂色调

c++ - 编译器编译外部包括