QT摄像头抓图浏览demo

目录

 

整体说明

代码逻辑


整体说明

  1. 基本功能:打开摄像头、关闭摄像头、开始抓图、停止抓图、图片浏览
  2. 其他功能:抓图间隔时间可以设置,图片浏览可以设置手动翻页和自动播放
  3. 说明:抓图后进行图片分析(人脸识别等),将抓取的图片进行显示

整体效果如下图所示:

关键代码

  • 初始化摄像头
void MainWindow::iniCamera()
{//  创建  QCamera对象

    curCameraInfo=QCameraInfo::defaultCamera(); //获取缺省摄像头
    ui->comboCamera->addItem(curCameraInfo.description());//摄像头描述
    ui->comboCamera->setCurrentIndex(0);

    curCamera=new QCamera(curCameraInfo,this); //创建摄像头对象

    ui->actStartCamera->setEnabled(true);

    QCameraViewfinderSettings viewfinderSettings;
    viewfinderSettings.setResolution(640, 480);

    curCamera->setViewfinderSettings(viewfinderSettings);

    curCamera->setViewfinder(ui->viewFinder); //设置取景框预览
    curCamera->setCaptureMode(QCamera::CaptureStillImage);//设置为抓图


    ui->checkStillImage->setChecked(curCamera->isCaptureModeSupported(QCamera::CaptureStillImage)); //支持抓图

    connect(curCamera,SIGNAL(stateChanged(QCamera::State)),this,SLOT(on_cameraStateChanged(QCamera::State)));

    space = ui->spinBox->value();
    isWarning = true;


    t=new MyThread;//自定义线程对象
    thread=new QThread;//子线程

    t->moveToThread(thread);
    thread->start();


    connect(this,SIGNAL(sendFilePath(QImage,QString,QString)),t,SLOT(SendImageSenseStudio(QImage,QString,QString)));
    connect(t,SIGNAL(sendImage(QImage,QString)),this,SLOT(getImage(QImage,QString)));
}
  • 初始化静态画图
void MainWindow::iniImageCapture()
{
    //创建 QCameraImageCapture对象
    imageCapture = new QCameraImageCapture(curCamera,this);
    QImageEncoderSettings imageSettings;//      imageSettings;
    imageSettings.setCodec("image/jpeg");   //设置抓图图形编码
    imageSettings.setResolution(640, 360);  //分辨率
    imageSettings.setQuality(QMultimedia::HighQuality);//图片质量
    imageCapture->setEncodingSettings(imageSettings); //


    imageCapture->isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer);
    imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer); //保存目标
    imageCapture->setBufferFormat(QVideoFrame::Format_Jpeg); //缓冲区格式

    //connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)),this, SLOT(on_imageReadyForCapture(bool)));
    connect(imageCapture,SIGNAL(imageCaptured(int,  QImage)),this,SLOT(on_imageCaptured(int,  QImage)));

}
  • 开始抓图
void MainWindow::on_actCapture_triggered()
{
    //抓图
    ui->stackedWidget->setCurrentIndex(0);
    if (curCamera->captureMode()!=QCamera::CaptureStillImage)
    {
        curCamera->setCaptureMode(QCamera::CaptureStillImage);
        return;
    }

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(TimerEvent()));

    timer->start(space*1000);

    ui->actCapture->setEnabled(false);
    ui->actCaptureStop->setEnabled(true);
    ui->spinBox->setEnabled(false);

}
  • 图片转换QImage->cv::Mat
cv::Mat MyThread::QImageToMat(QImage image)
{
    cv::Mat mat;
    switch (image.format())
    {

    case QImage::Format_ARGB32:
    case QImage::Format_RGB32:
    case QImage::Format_ARGB32_Premultiplied:
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        break;
    case QImage::Format_RGB888:
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat, mat, CV_BGR2RGB);
        break;
    case QImage::Format_Indexed8:
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    }
    return mat;
}
  • 图片预览picturebrowser.h、picturebrowser.cpp
#ifndef PICTUREBROWSER_H
#define PICTUREBROWSER_H

#include <QWidget>
#include <QFileInfoList>
#include <QFileInfo>
#include <QTimer>
#include <QDir>
#include <QImage>
#include <QTextCodec>
#include <QListWidgetItem>
#include <QDebug>
#include <QFileSystemWatcher>
#include <QKeyEvent>

namespace Ui {
class PictureBrowser;
}

class PictureBrowser : public QWidget
{
    Q_OBJECT

public:
    explicit PictureBrowser(QWidget *parent = 0);
    ~PictureBrowser();

    //在QListWidget里显示当前目录下的明细
    void showFileInfoList(QFileInfoList pInfoList);

    //根据文件性质获取图标iType=1:文件夹iType=2:文件
    QIcon *getItemPropertyIcon(int iType);
    //显示当前图片
    void showPicture(int num);

public slots:
    //显示当前目录下的文件夹和文件
    void showCurrentDirFiles();
    //显示鼠标双击的列表里的文件夹下的文件
    void showNextDirFiles(QListWidgetItem *item);
    //上一张图片
    void showLastPicture();
    //下一张图片
    void showNextPicture();
    //自动播放
    void autoPlayPicture();
    //鼠标点击列表时显示
    void playCurrentItem(QListWidgetItem* item);

    void newFile(QString);

private:
    Ui::PictureBrowser *ui;

    //自动播放定时器
    QTimer *timer;
    //当前文件夹的路径
    QString currentDirPath;
    //当前文件夹里的图片文件数量
    int numofPic;

    QFileSystemWatcher fileWatcher;

};

#endif // PICTUREBROWSER_H
#include "picturebrowser.h"
#include "ui_picturebrowser.h"
#include <QPainter>

PictureBrowser::PictureBrowser(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PictureBrowser)
{
    ui->setupUi(this);

    currentDirPath = "";
    numofPic = 0;

    //初始化定时器
    timer = new QTimer(this);
    ///设定播放时间间隔
    timer->setInterval(1500);///1.5s

    //文件浏览器槽函数
    connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(showCurrentDirFiles()));
    connect(ui->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(showNextDirFiles(QListWidgetItem*)));

    //显示图片槽函数
    connect(ui->btnLastPicture,SIGNAL(clicked()),this,SLOT(showLastPicture()));
    connect(ui->btnNextPicture,SIGNAL(clicked()),this,SLOT(showNextPicture()));
    connect(ui->btnAutoPlay,SIGNAL(clicked()),this,SLOT(autoPlayPicture()));
    connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(playCurrentItem(QListWidgetItem*)));

    //自动播放
    connect(this->timer,SIGNAL(timeout()),this,SLOT(showNextPicture()));

    ui->lineEdit->setText(QDir::currentPath());
    ui->lineEdit->returnPressed();
    fileWatcher.addPath(ui->lineEdit->text());
    connect(&fileWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(newFile(QString)));//新建、删除
    connect(&fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(newFile(QString)));//修改、重命名

    ui->listWidget->setFocusPolicy(Qt::StrongFocus);

}

PictureBrowser::~PictureBrowser()
{
    delete ui;
}
void PictureBrowser::newFile(QString path)
{
    ui->lineEdit->returnPressed();
}
void PictureBrowser::showNextDirFiles(QListWidgetItem *item)
{
    ///获取鼠标双击的文件名字
    QString strName = item->text();
    QDir dir;
    //设置路径为当前目录路径
    dir.setPath(ui->lineEdit->text());
    //重新设置路径
    dir.cd(strName);
    //更新当前显示路径,并显示当前目录下所有文件
    ui->lineEdit->setText(dir.absolutePath());
    showCurrentDirFiles();
}
void PictureBrowser::showFileInfoList(QFileInfoList pInfoList)
{
    ui->listWidget->clear();
    for(int i=0;i<pInfoList.size();i++)
    {
        QFileInfo tmpInfo = pInfoList.at(i);
        QString pFileName = tmpInfo.fileName();
        QListWidgetItem *tmpItem = new QListWidgetItem(pFileName);

        if(tmpInfo.isDir())
            tmpItem->setIcon(*getItemPropertyIcon(1));
        else
        {
            tmpItem->setIcon(*getItemPropertyIcon(2));
            ///获取文件后缀名
            QString suffix = tmpInfo.suffix();
            ///只选取*.jpg,*.png格式文件
            if(suffix.indexOf("jpg")<0 && suffix.indexOf("png")<0)
                continue;
            else
                numofPic++;


        }

        ui->listWidget->addItem(tmpItem);
    }

}
QIcon * PictureBrowser::getItemPropertyIcon(int iType)
{
    QDir dir;
    QString path = dir.currentPath();
    switch(iType)
    {
    case 1:
        return new QIcon(path+"/Folder.png");
        break;
    case 2:
        return new QIcon(path+"/File.png");
        break;
    }
    return NULL;
}
void PictureBrowser::showCurrentDirFiles()
{
    fileWatcher.addPath(ui->lineEdit->text());
    //获取当前输入的目录
    QDir currentDir(ui->lineEdit->text());
    QStringList fileList;
    fileList<<"*";
    QFileInfoList infoList = currentDir.entryInfoList(fileList,QDir::AllEntries,QDir::DirsFirst);
    //在QListWidget里显示文件列表
    this->showFileInfoList(infoList);

    //记录当前路径
    if(!infoList.isEmpty())
    {
        this->currentDirPath = infoList[0].absoluteFilePath();
    }
}

void PictureBrowser::playCurrentItem(QListWidgetItem* item)
{
    QString strName = item->text();
    if(strName.indexOf("jpg")>=0 || strName.indexOf("png")>=0)
    {
        ///获取当前图片的绝对路径
        QPixmap pic(currentDirPath+"/"+strName);
        QString result1 = strName.section('_',1,1);
        QString score1 = strName.section('_',2,2);

        QString result2 = strName.section('_',3,3);
        QString score2 = strName.section('_',4,4);

        if(!result1.isEmpty() && !result2.isEmpty())
        {
            if(result1 == "0")
                result1 = "真人 "+ score1;
            else
                result1 = "非真人 " + score1;

            if(result2 == "0")
                result2 = "真人 " + score2;
            else
                result2 = "非真人 " + score2;
            QPainter painter(&pic);
            painter.setPen(Qt::red);

            QFont font = painter.font();
            font.setPixelSize(25);//改变字体大小
            font.setFamily("Microsoft YaHei");
            painter.setFont(font);

            painter.drawText(50,50, QString("商汤:"+result1));
            painter.drawText(50,80, QString("海量:"+result2));

        }
        ui->label->setScaledContents(true);
        ui->label->setPixmap(pic.scaled(ui->label->width(),ui->label->height(),Qt::IgnoreAspectRatio));
    }
    else
        ui->label->clear();
}


void PictureBrowser::showLastPicture()
{
    ///获取当前图片在当前文件夹中的索引
    int currentIndex = ui->listWidget->currentRow();


    if(currentIndex==0)
    {
        ///当前图片是第一张,则显示最后一张
        showPicture(ui->listWidget->count() - 1);
        ///鼠标移动至上一张
        ui->listWidget->setCurrentRow(ui->listWidget->count() - 1);
    }
    else if(currentIndex == -1)
    {
        qDebug()<<currentIndex;

        ///当前图片是第一张,则显示最后一张
        ui->listWidget->setCurrentRow(0);
        showPicture(0);
    }
    else
    {
        ///当前图片不是第一张,则显示上一张
        showPicture(currentIndex-1);
        ///鼠标移动至上一张
        ui->listWidget->setCurrentRow(currentIndex-1);
    }

}


void PictureBrowser::showNextPicture()
{
    ///获取当前图片在当前文件夹中的索引
    int currentIndex = ui->listWidget->currentRow();
    if(currentIndex == -1)
    {
        ui->listWidget->setCurrentRow(0);
        showPicture(0);
    }
    if(currentIndex == ui->listWidget->count()-1)
    {
        //最后一张
        showPicture(2);
        ///鼠标移动至下一张
        ui->listWidget->setCurrentRow(2);
    }
    else
    {
        showPicture(currentIndex+1);
        ///鼠标移动至下一张
        ui->listWidget->setCurrentRow(currentIndex+1);
    }
}


void PictureBrowser::showPicture(int num)
{

    QListWidgetItem* item = ui->listWidget->item(num);
    QString strName = item->text();

    ///获取当前图片的绝对路径
    QPixmap pic(currentDirPath+"/"+strName);
    if(strName.indexOf("jpg")>=0 || strName.indexOf("png")>=0)
    {
        QString result1 = strName.section('_',1,1);
        QString score1 = strName.section('_',2,2);

        QString result2 = strName.section('_',3,3);
        QString score2 = strName.section('_',4,4);

        if(!result1.isEmpty() && !result2.isEmpty())
        {
            if(result1 == "0")
                result1 = "真人 "+ score1;
            else
                result1 = "非真人 " + score1;

            if(result2 == "0")
                result2 = "真人 " + score2;
            else
                result2 = "非真人 " + score2;
            QPainter painter(&pic);
            painter.setPen(Qt::red);

            QFont font = painter.font();
            font.setPixelSize(25);//改变字体大小
            font.setFamily("Microsoft YaHei");
            painter.setFont(font);

            painter.drawText(50,50, QString("商汤:"+result1));
            painter.drawText(50,80, QString("海量:"+result2));
        }

        ui->label->setScaledContents(true);
        ui->label->setPixmap(pic.scaled(ui->label->width(),ui->label->height(),Qt::IgnoreAspectRatio));
    }
    else
        ui->label->clear();

}


void PictureBrowser::autoPlayPicture()
{
    QString str = ui->btnAutoPlay->text();
    if(str == "自动播放")
    {
        this->timer->start();
        showPicture(ui->listWidget->currentRow());
        ui->btnAutoPlay->setText("停止");
    }
    else
    {
        this->timer->stop();
        ui->btnAutoPlay->setText("自动播放");
    }
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值