Qt调用电脑摄像头写一个相机小程序
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:121
文┞仿目次
- 媒介
- 一、相机琅绫擎的重要功能介绍
- 二、代码实现
- 1.工程目次构造
- 2.各文件代码:
- 总结
媒介
今天我们来应用Qt写一个相机小法度榜样。
一、相机琅绫擎的重要功能介绍
- 这张是一开端运行的界面,有一个窗口显示摄像头捕获的画面,还有两个按钮控件,扑晡搀下角还有一个label控件(下张图片可见具体地位)。
- 当我们开端点荒┝寺氛按钮,此时就会应用label控件来显示一个小的┞氛片。具体如下:
- 左下角显示的┞氛片就是应用label控件来承载的,这时我们再应用鼠标点击label控件(即左下角的小图片), 这是会创建一个新的窗口, 显示我们方才拍的┞氛片。具体如下:
- 第3步的时刻我们点击保存按钮的话就会弹出一个保存文件的窗口,具体如下:
- 就是以上的几点小功能了
二、代码实现
1.工程目次构造
clicklabel.h和clicklabel.cpp:
这两个文件重要实现了label的点击功能,类似于使label也有按钮的功能。
mainwindow.h:
这琅绫擎重要定义了很多变量,便利实现旌旗灯号与槽的功能。
mainwindow.cpp:
这琅绫擎重要实现了调用摄像头,显示画面,拍┞氛,保存照片等功能。具体大年夜家可以参考下面代码。
mainwindow.ui
这琅绫擎主如果界面构造。
2.各文件代码:
clicklabel.h:
#ifndef CLICKLABEL_H
#define CLICKLABEL_H
#include <QWidget>
#include <QLabel>
#include <QDebug>
#include <QMouseEvent>
class ClickLabel : public QLabel
{
Q_OBJECT
public:
ClickLabel(QWidget * parent = 0) : QLabel(parent){}
~ClickLabel(){}
public:
signals:
void clicked1(ClickLabel * click);
protected:
void mousePressEvent(QMouseEvent *e);
};
#endif // CLICKLABEL_H
clicklabel.cpp:
#include "clicklabel.h"
void ClickLabel::mousePressEvent(QMouseEvent *)
{
emit clicked1(this); //发送自定义旌旗灯号
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QImage>
#include <QLabel>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QString fileName;
QImage image;
QWidget * parent;
char newFlag;
QLabel * label;
private slots:
void displayImage(int, QImage);
void on_capture_clicked();
void on_pushButton_clicked();
void showPhoto();
private:
Ui::MainWindow *ui;
QCameraImageCapture * imageCapture;
QCameraViewfinder * viewfinder;
QCamera * myCamera;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "clicklabel.h"
#include <QFileDialog> //文件对话框
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
newFlag = 1;
this->parent = parent;
myCamera = new QCamera(this); //创建相机对象
viewfinder = new QCameraViewfinder(this); //创建一个取景器
imageCapture = new QCameraImageCapture(myCamera, this); //创建图片捕获对象
myCamera->setViewfinder(viewfinder); //绑定相机和取景器
ui->ImageView->addWidget(viewfinder);
myCamera->start();
connect(imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(displayImage(int, QImage)));
connect(ui->PhotoShow, SIGNAL(clicked1(ClickLabel *)), this, SLOT(showPhoto()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::displayImage(int, QImage image)
{
ui->PhotoShow->setPixmap(QPixmap::fromImage(image)); //应用label控件来承载照片
this->image = image;
}
void MainWindow::on_capture_clicked() //拍┞氛按钮
{
imageCapture->capture(); //开端拍┞氛(文件默认保存在图片)
}
void MainWindow::showPhoto() //开新窗口显示拍的┞氛片
{
if(1 == newFlag) //此前提包管多次点击label控件也只会创建一个窗口
{
MainWindow * wShow = new MainWindow(parent);
wShow->setFixedSize(800, 480);
wShow->show(); //设置一个新窗口显示拍好的┞氛片
label = new QLabel(wShow);
}
label->setFixedSize(800, 480);
label->show();
label->setPixmap(QPixmap::fromImage(image));
newFlag = 0;
}
void MainWindow::on_pushButton_clicked()
{
//应用文件对话框保存图片
fileName = QFileDialog::getSaveFileName(this, "save file", QDir::homePath(), "*.jpg; *.*");
if(fileName.isEmpty())
{
return;
}
//qDebug() << fileName;
}
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
总结
以上就是今天的小法度榜样了。代码写的不是很优美。如不雅大年夜家有什么效力更高的办法,可以指出来。