做毕业设计实现这个功能时遇到博客中遇到的不使用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上 }