qt表示opencvでカメラを表示

8116 ワード

qt表示opencvでカメラを表示


卒業設計をしてこの機能を実現する際にブログで遭遇するimshowを使わないと表示されないという問題に遭遇し,資料を探してタイミングで画像を取得する方法でこの問題を解決した.
以下は主な実装方法ダウンロードアドレス(qt 5.8 vs 2013 addin 2.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   
}