qt 打开摄像头拍照 QCamera 拍照

原文 https://blog.csdn.net/qq_35703848/article/details/79713007

用OpenCV 也可以实现打开拍照功能,这里使用的是qt自动的类QCamera

 

vs+qt   加   multimedia  multimediawidgets 模块 

mingw 在pro 文件中添加

 

getview.h

#include <QWidget>
#include "ui_getview.h"
#include <QCamera>
#include <QMediaRecorder>
#include <QCameraViewfinder>
#include <QCameraImageCapture>


class Codeget : public QWidget
{
	Q_OBJECT

public:
	Codeget(QWidget *parent = Q_NULLPTR);
	~Codeget();
private:
	void closeEvent(QCloseEvent *event);
private slots:
	void savePicture();
	void displayImage(int, QImage image);
	void showTheCapure();                //QLabel 展示图片

private:
	Ui::Codeget ui;

	QCamera *m_Cam;
	QCameraViewfinder *m_viewFinder;
	QCameraImageCapture *m_imageCapture;//截图部件
	int m_statu;                        //判断是否打开摄像头
};

getview.cpp

#include "getview.h"
#include <QMessageBox>
#include <QFile>


Codeget::Codeget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);

	m_Cam = new QCamera;
	m_viewFinder = new QCameraViewfinder();
	m_imageCapture = new QCameraImageCapture(m_Cam);
	
	QObject::connect(ui.open_closeVedio, SIGNAL(clicked()), this, SLOT(showTheCapure()));
	QObject::connect(ui.capture, SIGNAL(clicked()), this, SLOT(savePicture()));
	QObject::connect(m_imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(displayImage(int, QImage)));

	m_imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
	m_statu = 0;
}

Codeget::~Codeget()
{
}

void Codeget::closeEvent(QCloseEvent * event)
{
	m_Cam->stop();
	qDebug() << "delete" << endl;
	delete m_imageCapture;
	delete m_viewFinder;
	delete m_Cam;
	remove("code.jpg");
}

void Codeget::savePicture()
{
	m_imageCapture->capture();
}

void Codeget::displayImage(int, QImage image)
{
	image = image.convertToFormat(QImage::Format_RGB888);
	QImage::Format format = image.format();
	qDebug() << (int)format;

	QPixmap tempixmap = QPixmap::fromImage(image);
	int with = ui.label->width();
	int height = ui.label->width();
	//QPixmap fitpixmap = tempixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);  // 饱满填充  
    QPixmap fitpixmap = tempixmap.scaled(with, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);  // 按比例缩放  
	ui.label->setPixmap(fitpixmap);

	const QPixmap *pixmap = ui.label->pixmap();
	if (pixmap)
	{
		pixmap->save("code.jpg");
		qDebug() << "save ok" << endl;
	}
}

void Codeget::showTheCapure()
{
	if (m_statu == 0)
	{
		m_Cam->setViewfinder(m_viewFinder);
		ui.gridLayout->addWidget(m_viewFinder);
		m_viewFinder->show();

		m_Cam->setCaptureMode(QCamera::CaptureStillImage);
		m_Cam->setViewfinder(m_viewFinder);
		m_Cam->start(); //启动摄像头
		m_statu = 1;
		ui.open_closeVedio->setText(QStringLiteral("关闭视频"));
	}
	else
	{
		m_Cam->stop();
		m_viewFinder->close();
		m_statu = 0;
		ui.open_closeVedio->setText(QStringLiteral("打开视频"));
		ui.label->clear();
	
		remove("code.jpg");
	}
}

 

杂项:

qt 界面布局调整  QGridLayout 大小

直接把QGridLayout 放在一个QWidget上、那么你QWidget多大,layout也就多大

https://bbs.csdn.net/topics/390155508

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux平台下使用QT框架来控制摄像头进行拍照实现,需要使用V4L2(Video for Linux 2)框架实现视频采集、视频显示以及图片保存。V4L2提供了一套底层的驱动程序接口,可以访问系统中的视频设备并获取视频数据。在应用程序中,我们可以通过QT的QCamera类和QCameraViewfinder类来调用V4L2驱动程序操作视频设备,并将视频数据显示在GUI界面上。此外,还可以使用QImage类将视频帧转换为图像数据,并保存为图像文件。实现这一过程需要以下步骤: 1. 创建QCamera和QCameraViewfinder对象,设置视频设备。 2. 创建QImage对象,并将视频帧数据转换为图像数据。 3. 将图像保存为文件。 代码示例: QCamera *camera = new QCamera; QCameraViewfinder *viewFinder = new QCameraViewfinder; camera->setViewfinder(viewFinder); QImage *image = new QImage; connect(camera, SIGNAL(frameCaptured(QImage)), this, SLOT(saveImage(QImage))); void MainWindow::saveImage(QImage image) { image.save("/home/user/image.jpg"); } 通过以上代码,我们可以实现在Linux平台下使用QT框架控制摄像头进行拍照的功能。 ### 回答2: 在Linux平台上使用Qt开发程序时,想要通过摄像头拍照需要先安装v4l-utils(Video 4 Linux Utilities)工具包,它包括了对多种摄像头的支持。安装完成后,需要用v4l-info命令检测设备是否被识别,如果识别出来了就可以使用v4l2-ctl命令来调节视频流参数。要实现拍照功能,可以使用Qt的Multimedia模块来捕获摄像头图像,并调用QImage类来处理图片数据。具体实现中,需要用到QCamera和QCameraViewfinder类以及QImageEncoderSettings、QPixelFormat、QVideoFrame、QMediaPlayer等相关类实现。其中,QCameraViewfinder类可以在GUI界面中显示摄像头捕获的实时图像,而QImageEncoderSettings和QPixelFormat可以控制图片格式和编码方式。使用QVideoFrame类来读取摄像头捕获的图像数据,将其转换成QImage型的数据并保存即可完成拍照操作。总之,通过使用Qt的Multimedia模块配合v4l-utils工具包,可以方便地在Linux平台上实现摄像头拍照功能。 ### 回答3: Qt是一个跨平台的C++应用程序开发框架,能够在各种操作系统上运行,而Linux是其中一种操作系统。在Linux环境下,Qt可以很方便地实现摄像头拍照的功能。 Qt提供了QCamera类来调用摄像头,可以通过指定设备名称和设备类型创建QCamera对象。使用QCameraViewfinder作为摄像头预览的窗口,可以显示实时图像。我们可以使用QImageCapture类来实现拍照操作,设置拍照保存路径和文件名,调用capture()函数就可以完成一次拍照。 在Linux系统下,我们需要先安装Linux摄像头驱动,Linux系统会自动识别并加载摄像头驱动,此后摄像头就可以正常工作。驱动成功安装后,就可以通过Qt编写程序来调用摄像头并进行拍照操作。 总的来说,使用Qt在Linux环境下实现摄像头拍照的功能是非常便捷的。需要注意的是,Linux系统对摄像头支持的情况基本上是看硬件,因此在选购摄像头设备时需要注意,确保摄像头和Linux系统兼容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值