日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT摄像头抓图浏览demo

發布時間:2024/1/1 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT摄像头抓图浏览demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

整體說明

代碼邏輯


整體說明

  • 基本功能:打開攝像頭、關閉攝像頭、開始抓圖、停止抓圖、圖片瀏覽
  • 其他功能:抓圖間隔時間可以設置,圖片瀏覽可以設置手動翻頁和自動播放
  • 說明:抓圖后進行圖片分析(人臉識別等),將抓取的圖片進行顯示
  • 整體效果如下圖所示:

    關鍵代碼

    • 初始化攝像頭
    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_OBJECTpublic: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;elsenumofPic++;}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;elseresult1 = "非真人 " + score1;if(result2 == "0")result2 = "真人 " + score2;elseresult2 = "非真人 " + 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));}elseui->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;elseresult1 = "非真人 " + score1;if(result2 == "0")result2 = "真人 " + score2;elseresult2 = "非真人 " + 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));}elseui->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("自動播放");} }

    ?

    總結

    以上是生活随笔為你收集整理的QT摄像头抓图浏览demo的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。