桌面摄像头人像采集程序
早年写了用于采集学生照片的小程序。
开发环境:windows10 Qt5.15.2 C++
运行环境:x86 win7-11
功能:
摄像头选择;
分辨率选择(根据摄像头支持);
采集框大小可选,采集框可拖动;
照片存储路径可设置;

mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCameraInfo>
#include <QCoreApplication>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(windowFlags()&~Qt::WindowMaximizeButtonHint);
setFixedSize(this->width(),this->height());
ui->savePathTxt->setFocusPolicy(Qt::NoFocus); //保存路径文本框禁止焦点
ui->savePathTxt->setText(QCoreApplication::applicationDirPath());
enumCamera();
QComboBox *cameraList = new QComboBox();
dpiList = ui->dpiList;
cameraList = ui->cameraList;
cameraList->clear();
dpiList->clear();
cameras = QCameraInfo::availableCameras();
foreach(const QCameraInfo &cameraInfo, cameras) {
cameraList->addItem(cameraInfo.description());
}
camera = new QCamera(this);
viewfind = new QCameraViewfinder();
ui->imageView->addWidget(viewfind);
ui->imageShow->setScaledContents(true);
camera->setViewfinder(viewfind);
camera->start();
enumDpi(camera);
enumPhotosize();
on_photoSizeList_activated(0);
connect(ui->saveBtn,SIGNAL(clicked()),this,SLOT(saveImage()));
connect(ui->selectBtn,SIGNAL(clicked()),this,SLOT(selectpath()));
connect(ui->captureBtn,SIGNAL(clicked()),this,SLOT(captureImage()));
ui->imageSel->installEventFilter(this);
}
MainWindow::~MainWindow()
{
if(camera != NULL)
camera->stop();
delete ui;
}
bool MainWindow::eventFilter(QObject *obj, QEvent *evt)
{
QLabel* imageSel = nullptr;
imageSel = qobject_cast<QLabel*>(obj);
if(imageSel==nullptr)
return false;
static QPoint lastPnt;
static bool isHover = false;
if(evt->type() == QEvent::MouseButtonPress)
{
QMouseEvent* e = static_cast<QMouseEvent*>(evt);
if(imageSel->rect().contains(e->pos()) && (e->button() == Qt::LeftButton))
{
lastPnt = e->pos();
isHover = true;
}
}else if(evt->type() == QEvent::MouseMove && isHover){
QMouseEvent* e = static_cast<QMouseEvent*>(evt);
int dx = e->pos().x() - lastPnt.x();
int dy=e->pos().y()-lastPnt.y();
imageSel->move(imageSel->x()+dx,imageSel->y()+dy);
imageSel->update();
}else if(evt->type() == QEvent::MouseButtonRelease && isHover){
isHover = false;
imageSel->update();
}
return false;
}
void MainWindow::captureImage()
{
if(!camera)
return;
int x = ui->imageSel->x()+1;
int y = ui->imageSel->y()+1;
int w = ui->imageSel->width()-2;
int h = ui->imageSel->height()-2;
QPixmap pix = this->grab(QRect(x,y,w,h));
ui->imageShow->setPixmap(pix);
ui->statusBar->showMessage(tr("正在拍照......"),1000);
}
void MainWindow::saveImage()
{
QString savepath = ui->savePathTxt->text();
QString fileName = ui->imageNameTxt->text();
if(!fileName.isEmpty()){
fileName = savepath + "/"+fileName +".jpg";
const QPixmap* pixmap=ui->imageShow->pixmap();
if(pixmap){
pixmap->save(fileName);
QString info = "图片保存路径:"+ fileName;
ui->statusBar->showMessage(info,5000);
}
else{
QMessageBox *msgBox = new QMessageBox(QMessageBox::Question,tr("错误提示"),tr("你似乎忘了拍照操作了!"),QMessageBox::Yes);
msgBox->button(QMessageBox::Yes)->setText("是的");
msgBox->exec();
if(QMessageBox::Yes){
ui->captureBtn->setFocus();
}
}
}
else{
QMessageBox *msgBox = new QMessageBox(QMessageBox::Question,tr("错误提示"),tr("你似乎忘了输入文件名!"),QMessageBox::Yes);
msgBox->button(QMessageBox::Yes)->setText("是的");
msgBox->exec();
if(QMessageBox::Yes){
ui->imageNameTxt->setFocus();
}
}
}
void MainWindow::enumCamera()
{
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
foreach(const QCameraInfo &cameraInfo, cameras)
{
ui->cameraList->addItem(cameraInfo.description());
}
}
void MainWindow::on_cameraList_activated(int index)
{
index = 0;
index = ui->cameraList->currentIndex();
camera->stop();
dpiList->clear();
camera = new QCamera(cameras[index]);
camera->setCaptureMode(QCamera::CaptureVideo);
camera->setViewfinder(viewfind);
camera->start();
dpiList->clear();
enumDpi(camera);
}
void MainWindow::enumDpi(QCamera *camera)
{
mResSize.clear();
mResSize = camera->supportedViewfinderResolutions();
dpiList->clear();
int i=0;
foreach (QSize msize, mResSize) {
dpiList->addItem(QString::number(msize.width(),10)+"*"+QString::number(msize.height(),10), i++);
}
dpiList->setCurrentIndex(i-1);
}
void MainWindow::on_dpiList_activated(int index)
{
index = 0;
index = ui->dpiList->currentIndex();
camera->stop();
camera->start();
QCameraViewfinderSettings set;
set.setResolution(mResSize[index]);
camera->setViewfinderSettings(set);
}
void MainWindow::selectpath()
{
QString path=QFileDialog::getExistingDirectory (this);
ui->savePathTxt->setText(path);
qDebug()<<"PathIS:"<<path;
}
void MainWindow::enumPhotosize()
{
ui->photoSizeList->clear();
ui->photoSizeList->addItem("150×200",0);
ui->photoSizeList->addItem("180×240",1);
ui->photoSizeList->addItem("210×280",2);
}
void MainWindow::on_photoSizeList_activated(int index)
{
index = 0;
int x,y,w,h;
x=0,y=0,w=0,h=0;
index = ui->photoSizeList->currentIndex();
if(index == 0){
w=150+2;
h=200+2;
}
if(index == 1){
w=180+2;
h=240+2;
}
if(index == 2){
w=210+2;
h=280+2;
}
x=410-int(w/2);
y=285-int(h/2);
ui->imageSel->setGeometry(x,y,w,h);
}mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCamera>
#include <QCameraViewfinder>
#include <QFileDialog>
#include <QComboBox>
#include <QList>
#include <QPushButton>
#include <QHBoxLayout>
#include <QMouseEvent>
namespace Ui {
class MainWindow;
}
class QCamera;
class QCameraViewfinder;
class QCameraImageCapture;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void enumCamera();
void bindRecoder(QCamera *camera);
void enumDpi(QCamera *camera);
void enumPhotosize();
QWidget *celWidget;//
QHBoxLayout *mainLayout;//
QPushButton *Btn;//
QList<QPushButton*> btn_group;//
private slots:
void captureImage();
//void displayImage(int, QImage);
void saveImage();
void on_cameraList_activated(int index);
void on_dpiList_activated(int index);
void selectpath();
bool eventFilter(QObject *obj, QEvent *evt); //
void on_photoSizeList_activated(int index);
private:
Ui::MainWindow *ui;
QCamera *camera; //摄像头对象
QCameraViewfinder *viewfind; //摄像头取景器
QCameraImageCapture *imageCapture; //截图对象
QList<QCameraInfo> cameras;
QList<QSize> mResSize = {};//分辨率List 定义
QComboBox *dpiList;
};
#endif // MAINWINDOW_目录 返回
首页