您的位置:首页 > 编程语言 > Qt开发

qt显示通过opencv显示摄像头

2017-04-13 10:50 344 查看

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_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上
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息