qt显示通过opencv显示摄像头

qt显示通过opencv显示摄像头

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

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

头文件

#pragma once

#include 
#include 
#include 
#include 
#include 
#include 
#include "ui_stereovisondemo.h"
#include 

using namespace cv;

class stereovisondemo : public QMainWindow
{
    Q_OBJECT

public:
    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上  
}

你可能感兴趣的:(OPENCV)