qt显示通过opencv显示摄像头

来源:互联网 发布:如何解析json数组 编辑:程序博客网 时间:2024/06/06 00:11

qt显示通过opencv显示摄像头

做毕业设计实现这个功能时遇到博客中遇到的不使用imshow就不显示的问题,经过查找资料通过定时获取图像的方法解决了该问题。

以下是主要实现方法 下载地址(qt5.8 vs2013 addin2.0)

头文件

#pragma once#include <QtWidgets/QMainWindow>#include <QMainWindow>#include <QMenu>#include <QMenuBar>#include <QStatusBar>#include <QLabel>#include "ui_stereovisondemo.h"#include <opencv2/opencv.hpp>using namespace cv;class stereovisondemo : public QMainWindow{    Q_OBJECTpublic:    stereovisondemo(QWidget *parent = Q_NULLPTR);private:    Ui::stereovisondemoClass ui;private slots:    void openCaptureClicked();    void showImage();};

cpp

//#pragma execution_character_set("utf-8")#include "stereovisondemo.h"#include <opencv2/opencv.hpp>#include <iostream>   #include <Windows.h>#include <QTimer>using   namespace   std;using namespace cv;QTimer    *timer;QImage    image; VideoCapture cap;Mat frame;void stereovisondemo::display(cv::Mat mat){    cv::Mat rgb;    QImage img;    if (mat.channels() == 3)    {        cv::cvtColor(mat, rgb, CV_BGR2RGB);        img = QImage((const uchar*)(rgb.data), rgb.cols, rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);    }    else    {        img = QImage((const uchar*)(mat.data), mat.cols, mat.rows, mat.cols*mat.channels(), QImage::Format_Indexed8);    }    ui.label1->clear();    ui.label1->setPixmap(QPixmap::fromImage(img));    ui.label1->resize(ui.label1->pixmap()->size());    ui.label1->show();}QImage  Mat2QImage(cv::Mat cvImg){    QImage qImg;    if (cvImg.channels() == 3)                             //3 channels color image    {        cv::cvtColor(cvImg, cvImg, CV_BGR2RGB);        qImg = QImage((const unsigned char*)(cvImg.data),            cvImg.cols, cvImg.rows,            cvImg.cols*cvImg.channels(),            QImage::Format_RGB888);    }    else if (cvImg.channels() == 1)                    //grayscale image    {        qImg = QImage((const unsigned char*)(cvImg.data),            cvImg.cols, cvImg.rows,            cvImg.cols*cvImg.channels(),            QImage::Format_Indexed8);    }    else    {        qImg = QImage((const unsigned char*)(cvImg.data),            cvImg.cols, cvImg.rows,            cvImg.cols*cvImg.channels(),            QImage::Format_RGB888);    }    return qImg;}stereovisondemo::stereovisondemo(QWidget *parent)    : QMainWindow(parent){    ui.setupUi(this);    timer = new QTimer(this);    /*信号和槽*/    connect(timer, SIGNAL(timeout()), this, SLOT(showImage()));  // 时间到,读取当前摄像头信息}void stereovisondemo::openCaptureClicked()//启动定时器{    timer->start(33);    cap.open(0);}void stereovisondemo::showImage(){    cap >> frame;    image = Mat2QImage(frame);    ui.label1->setPixmap(QPixmap::fromImage(image));  // 将图片显示到label上  }
0 0