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

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

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

调用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());
}
获取摄像头的参数并填入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);
}
显示视频时可以把捕捉模式设置为静态帧或视频,目前这两种看起来显示效果没差别,如果有大佬知道可以评论告知区别;
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_OBJECT
public:
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 = {};//分辨率List
QList<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来初始化所有的摄像头并用控件显示,这样就可以同时显示所有摄像头的视频。但是也有部分功能需要进一步研究优化
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
在前面两节的例子中,主界面窗口的尺寸和标签控件显示的矩形区域等,都是用C++代码编写的。窗口和控件的尺寸都是预估的,控件如果多起来,那就不好估计每个控件合适的位置和大小了。用C++代码编写图形界面的问题就是不直观,因此Qt项目开发了专门的可视化图形界面编辑器——QtDesigner(Qt设计师)。通过QtDesigner就可以很方便地创建图形界面文件*.ui,然后将ui文件应用到源代码里面,做到“所见即所得”,大大方便了图形界面的设计。本节就演示一下QtDesigner的简单使用,学习拖拽控件和设置控件属性,并将ui文件应用到Qt程序代码里。使用QtDesigner设计界面在开始菜单中找到「Q
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定