网上关于这个的资源杂七杂八,这是我自己摸索出来的
首先创建一个QtWidgetsApplication项目,我这里叫做MYCAMERA
首先是MYCAMERA.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_MYCAMARA.h"
#include<opencv2/opencv.hpp>
#include<qtimer.h>
#include <opencv2\imgproc\types_c.h>
using namespace cv;
class MYCAMARA : public QMainWindow
{
Q_OBJECT
public:
MYCAMARA(QWidget *parent = Q_NULLPTR);
private:
Ui::MYCAMARAClass ui;
VideoCapture capture;
QImage image;
double rate;
Mat frame;
QImage Mat2QImage(Mat cvImg);
private slots:
void on_pushButton_camera_clicked();
void nextFrame();
};
这里有一些必要的数据类,记得要声明VideoCapture类以及槽函数,还有要包括Qtimer的头文件,这个我遇到很多教程都没提到,这里遇到的编译问题是VS找不到头文件"ui_MYCAMARA.h",这个的解决问题是,右键ui文件,点击编译,然后在项目的文件夹MYCAMARA\x64\Debug\uic里面就能搜索到这个头文件,拖动到头文件栏即可
Ui设置如上图,label控件是拿来显示图片的。
接下来就是MYCAMERA.cpp
#include "MYCAMARA.h"
MYCAMARA::MYCAMARA(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
void MYCAMARA::on_pushButton_camera_clicked()
{
if (capture.isOpened())
capture.release(); //decide if capture is already opened; if so,close it
capture.open(1); //open the default camera
if (capture.isOpened())
{
rate = capture.get(CAP_PROP_FPS);
capture >> frame;
if (!frame.empty())
{
image = Mat2QImage(frame);
ui.label->setPixmap(QPixmap::fromImage(image));
QTimer* timer = new QTimer(this);
timer->setInterval(double(1000 / rate)); //set timer match with FPS
connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame()));
timer->start();
}
}
}
QImage MYCAMARA::Mat2QImage(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;
}
void MYCAMARA::nextFrame()
{
capture >> frame;
image = Mat2QImage(frame);
ui.label->setPixmap(QPixmap::fromImage(image));
}
要注意的就是那个Mat2QImage函数,还有那个nextFrame的槽函数。
Timer是在Qt中按时间循环的一个工具,当时间到了以后会重复执行nextFrame函数,而capture就会重复提取相机图像,从而实现提取图像。
还要注意的是capture.open(1); 这里,如果参数设置的是0,则是调用笔记本自己的摄像头,设置为1是usb的摄像头。