桌面摄像头人像采集程序

04 11月
作者:cinjep|分类:代码开源

早年写了用于采集学生照片的小程序。

开发环境:windows10 Qt5.15.2 C++

运行环境:x86 win7-11

功能:

  1. 摄像头选择;

  2. 分辨率选择(根据摄像头支持);

  3. 采集框大小可选,采集框可拖动;

  4. 照片存储路径可设置;

cam.PNG


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_


浏览119
返回
目录
返回
首页
凸透镜成像小应用 网卡MAC采集器