目录
整体说明
- 基本功能:打开摄像头、关闭摄像头、开始抓图、停止抓图、图片浏览
- 其他功能:抓图间隔时间可以设置,图片浏览可以设置手动翻页和自动播放
- 说明:抓图后进行图片分析(人脸识别等),将抓取的图片进行显示
整体效果如下图所示:
关键代码
-
初始化摄像头
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("自动播放");
}
}