文章目录

  • 前言
  • 一、功能介绍和成果展示
  • 二、实现流程
    • 1.配置工作
    • 2.遍历摄像头设备
    • 3.获取摄像头支持的分辨率和最大帧率
    • 4.显示视频和抓图操作
  • 三、功能实现代码
  • 四、源码下载
  • 总结

前言

项目中需要使用USB 的免驱摄像头进行采集图像,一般这种USB的摄像头直接可以使用Qt中的QCamera获取图像及相关各种操作,这里基于QCamera来实现摄像头的显示和抓图的基本功能。


一、功能介绍和成果展示

多摄像头的信息获取、显示和抓图功能

  • CameraInfo遍历设备获取多摄像头信息
  • 获取摄像头的分辨率和最大帧率,并进行选择设置
  • 实现单张抓图和连续抓拍功能

二、实现流程

1.配置工作

首先要在Pro文件中加入multimedia模块,如下

在ui中把图像视频显示的widget提升为QVideoWidget

2.遍历摄像头设备

调用QCameraInfo来获取可用的摄像头设备列表

    cameras = QCameraInfo::availableCameras();//获取可用摄像头设备列表int index = cameras.size();for(int i=0;i<index;i++){qDebug()<<index<<cameras.at(i).description();//摄像头的设备名称ui->cmb_CameraName->addItem(cameras.at(i).description());}

3.获取摄像头支持的分辨率和最大帧率

获取摄像头的参数并填入UI控件中

void MainWindow::SetFrameResolution()
{mResSize.clear();mResSize = m_camera->supportedViewfinderResolutions();ui->cmb_Resolution->clear();int i=0;foreach (QSize msize, mResSize) {qDebug()<<msize;ui->cmb_Resolution->addItem(QString::number(msize.width(),10)+"*"+QString::number(msize.height(),10), i++);}  //摄像头支持分辨率打印ui->cmb_Resolution->setCurrentIndex(0);mMaxFrame.clear();int j;for(j=0;j< m_camera->supportedViewfinderFrameRateRanges().length();j++){qreal frameRates = m_camera->supportedViewfinderFrameRateRanges().at(j).maximumFrameRate;mMaxFrame.append(frameRates);ui->cmb_MaxFrameRate->addItem(QString::number(frameRates));}ui->cmb_MaxFrameRate->setCurrentIndex(j-1);
}

4.显示视频和抓图操作

显示视频时可以把捕捉模式设置为静态帧或视频,目前这两种看起来显示效果没差别,如果有大佬知道可以评论告知区别;

    m_camera = new QCamera(this);//初始化摄像头设备m_camera->setCaptureMode(QCamera::CaptureStillImage);//设置捕捉模式为静态帧
//    m_camera->setCaptureMode(QCamera::CaptureVideo);//设置捕捉模式为视频m_camera->setViewfinder(ui->widgetCamera);//设置 摄像头画面的显示位置image_capture = new QCameraImageCapture(m_camera);m_camera->start();//开启摄像头connect(image_capture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(processCapturedImage(int, QImage)));timer_image_capture = new QTimer(this);connect(timer_image_capture,&QTimer::timeout,this,&MainWindow::captureImage);SetFrameResolution();

三、功能实现代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QCamera>
#include <QCameraImageCapture>
#include <QTimer>
#include <QCameraInfo>
#include <QLabel>
#include <QDateTime>namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots://    void on_btnCameraCtrl_clicked();void on_btnSnap_clicked();void on_btnVedio_clicked();void processCapturedImage(int request_id, const QImage &img);void captureImage();void on_cmb_CameraName_activated(int index);void on_cmb_Resolution_activated(int index);void on_cmb_MaxFrameRate_activated(int index);private:Ui::MainWindow *ui;QList<QCameraInfo> cameras;QCamera* m_camera;//摄像头设备QCameraImageCapture* image_capture;QTimer *timer_image_capture;//图像抓图QList<QSize> mResSize = {};//分辨率ListQList<qreal> mMaxFrame = {};//最大帧率QTimer *myTimer;//状态栏时间显示//相机状态标志量参数QLabel * m_status1;QLabel * m_status2;QLabel * m_status3;void initCamera();void initForm();void SetFrameResolution();void UpdateCameraStatus();
};#endif // MAINWINDOW_H

mainwindow.cpp

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->initCamera();this->initForm();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::initCamera()
{cameras = QCameraInfo::availableCameras();//获取可用摄像头设备列表int index = cameras.size();for(int i=0;i<index;i++){qDebug()<<index<<cameras.at(i).description();//摄像头的设备名称ui->cmb_CameraName->addItem(cameras.at(i).description());}m_camera = new QCamera(this);//初始化摄像头设备m_camera->setCaptureMode(QCamera::CaptureStillImage);//设置捕捉模式为静态帧
//    m_camera->setCaptureMode(QCamera::CaptureVideo);//设置捕捉模式为视频m_camera->setViewfinder(ui->widgetCamera);//设置 摄像头画面的显示位置image_capture = new QCameraImageCapture(m_camera);m_camera->start();//开启摄像头connect(image_capture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(processCapturedImage(int, QImage)));timer_image_capture = new QTimer(this);connect(timer_image_capture,&QTimer::timeout,this,&MainWindow::captureImage);SetFrameResolution();
}void MainWindow::initForm()
{myTimer=new QTimer(this);myTimer->start(1000);QLabel * btn = new QLabel(this);connect(myTimer , &QTimer::timeout, [=](){QDateTime Date_Time =QDateTime::currentDateTime();QString Time_system = Date_Time.toString("yyyy-MM-dd hh:mm:ss ddd");btn->setText(Time_system);});
//    statusBar()->setStyleSheet(QString("QStatusBar::item{border: 2px}"));statusBar()->setSizeGripEnabled(false);ui->statusBar->addPermanentWidget(btn);m_status1 = new QLabel(this);m_status1->setGeometry(2,2,18,18);m_status2 = new QLabel(this);m_status3 = new QLabel(this);UpdateCameraStatus();
}void MainWindow::UpdateCameraStatus()
{QString curCamName = ui->cmb_CameraName->currentText();QString curCamFrame = ui->cmb_MaxFrameRate->currentText();QString curCamRes = ui->cmb_Resolution->currentText();m_status1->setText("摄像头:"+curCamName);ui->statusBar->addWidget(m_status1);m_status2->setText("帧率:"+curCamFrame);ui->statusBar->addWidget(m_status2);m_status3->setText("分辨率:"+curCamRes);ui->statusBar->addWidget(m_status3);
}void MainWindow::on_btnSnap_clicked()
{image_capture->capture();
}void MainWindow::on_btnVedio_clicked()
{int Intervalue = ui->spinBox->value();timer_image_capture->setInterval(Intervalue);timer_image_capture->start();
}void MainWindow::processCapturedImage(int request_id, const QImage &img)
{QImage scaledImage = img.scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);ui->label->setPixmap(QPixmap::fromImage(scaledImage));
}void MainWindow::captureImage()
{image_capture->capture();
}void MainWindow::on_cmb_CameraName_activated(int index)
{index = ui->cmb_CameraName->currentIndex();qDebug()<<"Index"<< index <<": "<< ui->cmb_CameraName->currentText();if(m_camera->isAvailable()){m_camera->stop();delete m_camera;}m_camera = new QCamera(cameras[index]);m_camera->setCaptureMode(QCamera::CaptureStillImage);m_camera->setViewfinder(ui->widgetCamera);image_capture = new QCameraImageCapture(m_camera);m_camera->start();connect(image_capture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(processCapturedImage(int, QImage)));SetFrameResolution();UpdateCameraStatus();
}void MainWindow::SetFrameResolution()
{mResSize.clear();mResSize = m_camera->supportedViewfinderResolutions();ui->cmb_Resolution->clear();int i=0;foreach (QSize msize, mResSize) {qDebug()<<msize;ui->cmb_Resolution->addItem(QString::number(msize.width(),10)+"*"+QString::number(msize.height(),10), i++);}  //摄像头支持分辨率打印ui->cmb_Resolution->setCurrentIndex(0);mMaxFrame.clear();int j;for(j=0;j< m_camera->supportedViewfinderFrameRateRanges().length();j++){qreal frameRates = m_camera->supportedViewfinderFrameRateRanges().at(j).maximumFrameRate;mMaxFrame.append(frameRates);ui->cmb_MaxFrameRate->addItem(QString::number(frameRates));}ui->cmb_MaxFrameRate->setCurrentIndex(j-1);
}void MainWindow::on_cmb_Resolution_activated(int index)
{index = ui->cmb_Resolution->currentIndex();qDebug()<<"Index"<< index <<": "<< ui->cmb_Resolution->currentText();qDebug()<<"mResSize:"<<mResSize[index];//设置摄像头分辨率QCameraViewfinderSettings set;set.setResolution(mResSize[index]);m_camera->setViewfinderSettings(set);UpdateCameraStatus();
}void MainWindow::on_cmb_MaxFrameRate_activated(int index)
{index = ui->cmb_MaxFrameRate->currentIndex();//设置摄像头最大帧率QCameraViewfinderSettings set;set.setMaximumFrameRate(mMaxFrame[index]);m_camera->setViewfinderSettings(set);UpdateCameraStatus();
}

四、源码下载

源码下载:多摄像头显示源码


总结

这里实现了多个相机的视频显示、参数设置和抓图操作,也可以在初始化中使用QList来初始化所有的摄像头并用控件显示,这样就可以同时显示所有摄像头的视频。但是也有部分功能需要进一步研究优化

  • 1.使用QCameraImageCapture类发送的capture的信号,系统会默认保存抓取的图像保存到电脑默认路径,一般在C盘下图片这个文件夹下,如果连续采图会导致本地缓存爆炸增长
  • 2.在实际项目中,一般要采集到图像进行图像操作后再显示,不是单独去实现视频显示,这里需要使用QAbstractVideoSurface捕获视频帧,进行图像处理后再使用QPainter画到显示控件。

Qt实现多摄像头的识别、显示、截图、分辨率帧率设置等功能相关推荐

  1. python人脸识别截图_Python OpenCV调用摄像头检测人脸并截图

    本文实例为大家分享了Python OpenCV调用摄像头检测人脸并截图的具体代码,供大家参考,具体内容如下 注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarc ...

  2. java 网络流量统计_【Java】人流量统计-动态版之摄像头识别显示

    [Java]人流量统计-动态版之视频转图识别请访问 http://ai.baidu.com/forum/topic/show/940413 本文是基于上一篇进行迭代的.本文主要是以摄像头画面进行人流量 ...

  3. qt读取摄像头数据并显示

    Qt 框架可以使用 Qt Multimedia 模块读取摄像头数据并显示.下面是一个简单的例子: 创建一个 Qt Widgets 项目 在窗口上放置一个 QCameraViewfinder 创建一个 ...

  4. 一文详解opencv摄像头数字识别

    OpenCV数字识别 一.数字识别的两种方式 1.1 轮廓提取法 1.2 行列扫描法 二.提取图像中的ROI区域 2.1 读取摄像头图像 2.2 对图像进行二值化处理 2.3 形态学处理 2.4 设置 ...

  5. 基于qt和opencv实现人脸识别打卡系统

    最近在学习opencv,因此就想着和QT结合起来实现一个人脸识别的系统来.下面我来给大家讲讲这个项目怎么实现的 1.项目源码 https://github.com/SagapoZ/FaceRecogn ...

  6. QT界面中实现视频帧显示的多种方法及应用

    QT界面中实现视频帧显示的多种方法及应用 (一) 引言 1.1 视频帧在QT界面中的应用场景 1.2 不同方法的性能和适用性分析 1.2.1 使用QLabel和QPixmap 1.2.2 使用QPai ...

  7. Qt 中获取摄像头图像数据的方法

    Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...

  8. Linux毕业设计:基于OpenCV和QT库实现的人脸识别考勤/门禁系统(arm嵌入式ubuntu)

    本文介绍:Linux上以opencv和qt库实现的人脸识别系统,可应用于考勤.门禁等场景,具有人脸录入.删除.人脸检测.识别.用户管理等完整功能.可运行于ARM嵌入式linux.ubuntu即纯软件. ...

  9. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)使用locals()函数批量配置摄像头运行识别程序并画框(代码记录)(代码示例)

    文章目录 20191126 20191202-1 20191202-2 20191126 # -*- encoding: utf-8 -*- """ @File : te ...

最新文章

  1. 为什么分类对象越多训练时间越长?
  2. Keras: 多输入及混合数据输入的神经网络模型
  3. MyBatis Plus——分页插件
  4. github中删除已建仓库(二)
  5. Qt 独立运行时伴随CMD命令窗口
  6. API网关正在经历身份危机
  7. java requestparams_java – 如何验证@RequestParams不为空?
  8. TensorFlow HOWTO 2.2 支持向量回归(软间隔)
  9. C++二分查找示例(求货物装载量)
  10. 芯片老化验证流程_IC老化测试
  11. 必读!Java开发人员的十大戒律
  12. 国产免费数据库建模工具EZDML3.24发布 支持生成和预览vue文件
  13. PowerDesigner 15及破解补丁_PowerDesigner 12.5及破解补丁_PowerDesigner破解版_PowerDesigner下载
  14. java背单词软件_背单词的java小软件
  15. Java的四种访问修饰符介绍
  16. JEPF项目初上手,一把辛酸泪
  17. 爬虫实战之爬虫漫画(有意外发现哦~嘿嘿)
  18. NOIP 停办之后,新认证 CSP-S/J 报名开启【智能快讯】
  19. bat批处理文件注释
  20. Teradata和Exadata

热门文章

  1. Oracle`.`聚宝盆
  2. 亚马逊云科技的区域和可用区概念解释
  3. 微信小程序--JavaScript实现指定数字的精度输出
  4. 【毕业设计】基于单片机的自动浇花灌溉系统设计 -嵌入式 物联网 stm32 c51
  5. 159 至多包含两个不同字符的最长子串
  6. pos 机 gd32f103 midi设备
  7. 公司账号服务单点登录到gitlab
  8. python编辑word的格式_Python 如何对word文档(.docx)的页眉和页脚进行编辑?
  9. 国密算法—SM2介绍及基于BC的实现
  10. 电脑中显示dns服务器可能不可用,DNS服务器可能不可用的解决方法