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
}