QT中Camera相机调用

一:摄像头配置
1、创建摄像头类,获取电脑端的所有摄像头
cameras = QCameraInfo::availableCameras(); //获取所有相机的列表
if (cameras.count() > 0)
{
for(const QCameraInfo &cameraInfo:cameras)
{
qDebug() << cameraInfo.description();
}
camera = new QCamera(cameras.at(0)); //初始化实例化第一个相机对象
}
2、设置取景器(将摄像头采集的图像放入一个屏幕中)
viewfinder=new QCameraViewfinder(ui->lblVideo);
viewfinder->resize(640, 480);
CamerimageCapture=new QCameraImageCapture(camera);
CamerimageCapture>setCaptureDestination(QCameraImageCapture::CaptureToFile);
3、将取景器与摄像头连接
camera->setCaptureMode(QCamera::CaptureStillImage);//将其采集为图片camera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder);//将采集到取景器中
camera->setViewfinder(viewfinder);
viewfinder->resize(640, 480);
4、设置默认摄像头的参数
//设置默认摄像头参数
QCameraViewfinderSettings set; //专门用于设置取景器参数,创建取景器类对象
set.setResolution(640, 480); //设置显示分辨率,以像素为单位设置取景器的分辨率
set.setMaximumFrameRate(75); //设置帧率,设置取景器的最小帧速率(以每秒帧数为单位)
camera->setViewfinderSettings(set); //设置取景器参数与相机匹配
5、设置相机列表选项
for(const QCameraInfo &cameraInfo:cameras)
{
qDebug() << “CameraInfo:” << cameraInfo;
ui->cameraSel->addItem(cameraInfo.description());
}
ui->cameraSel->setCurrentIndex(0);
注释:
cameraSel:为一个控件(QComboBox);
ui->cameraSel->addItem(cameraInfo.description());把所有相机显示在控件中;
6、设置初始(默认)相机的分辨率选项
mResSize = camera->supportedViewfinderResolutions();//查询摄像头支持的分辨率
for (const QSize &msize:mResSize)
{
qDebug() << msize; //摄像头支持分辨率打印,打印相机支持的分辨率
ui->resolutionSel->addItem(QString::number(msize.width(), 10) + “" + QString::number(msize.height(), 10));
}
ui->resolutionSel->setCurrentIndex(0);//默认列表中第一个相机
resolutionSel:为一个控件(QComboBox);
7、相机选项槽函数——相机显示QComboBox控件
//信号槽连接
connect(ui->cameraSel, QOverload::of(&QComboBox::activated), [=](int index)
{
for (int i = 0; i < mResSize.size(); i++)
{
ui->resolutionSel->removeItem(0);
}
//添加新相机的所有分辨率
mResSize.clear();
mResSize = camera->supportedViewfinderResolutions();
for (const QSize &msize:mResSize) {
qDebug() << msize; //摄像头支持分辨率打印
ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "
” + QString::number(msize.height(), 10));
}
ui->resolutionSel->setCurrentIndex(0);
});
connect(ui->resolutionSel, QOverload::of(&QComboBox::activated), [=](int index)
{
//重新设置摄像头参数
QCameraViewfinderSettings reset;
reset.setResolution(mResSize[index]);
camera->setViewfinderSettings(reset);
});
8、截图槽函数
connect(ui->screenShot, &QPushButton::clicked, ={
camera->setCaptureMode(QCamera::CaptureStillImage);//设置捕获模式为拍照,静态帧捕获
delete imageCapture;
imageCapture = new QCameraImageCapture(camera); //创建图像捕获类对象,与camera配合进行拍照
QString fileName = QFileDialog::getSaveFileName(); //获得保存路径
camera->searchAndLock(); //锁定相机
imageCapture->capture(fileName); //捕获图片并保存文件
camera->unlock(); //解除相机锁定
});
connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(rcv_image(int,QImage)));
9、关闭相机槽函数
void Widget::on_closeScreen_clicked()
{
delete camera;
camera->stop();
QApplication *app;
app->exit(0);

}
10、开启相机槽函数
void Widget::on_openScreen_clicked()
{
camera->stop();
delete camera;
camera->start();
fps_time.start(33);
}
11、完整代码
Widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QUdpSocket>
#include <QCamera>
#include <QCameraInfo>
#include <QImage>
#include <QCameraImageCapture>
#include <QCameraViewfinder>
#include <QTimer>
class QCamera;
class QCameraViewfinder;
class QCameraImageCapture;
class QCameraInfo;
class QCameraViewfinderSettings;
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_openScreen_clicked();
    void rcv_image(int, QImage);
    void on_closeScreen_clicked();

private:
    Ui::Widget *ui;
    QCamera *camera;                   //相机
    QCameraViewfinder *viewfinder;     //取景器
    QCameraImageCapture *imageCapture; //图像捕获
    QList<QCameraInfo> cameras;        //相机列表
    QList<QSize> mResSize = {};        //分辨率列表
    QUdpSocket *sender;
    QTimer fps_time;
    //QCameraViewfinderSettings *set;
};
#endif // WIDGET_H
在这里插入代码片

Widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QCamera>
#include <QCameraInfo>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QFileDialog>
#include <QList>
#include <QApplication>
#include <QHostAddress>
#include <QByteArray>
#include <QBuffer>
#include <QImageReader>
#include <QPixmap>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("Camera");                    //设置标题
    cameras = QCameraInfo::availableCameras();   //获取所有相机的列表
    if (cameras.count() > 0)
    {
      for(const QCameraInfo &cameraInfo:cameras)//用来查询系统当前可用的相机设备
      {
         qDebug() << cameraInfo.description();  //打印出相机列表
      }
            camera = new QCamera(cameras.at(0));
            //使用第一个相机设备信息创建相机
            //初始化实例化一个相机对象
    }

    //设置取景器
    viewfinder = new QCameraViewfinder(ui->lblVideo);//设置一个控件为取景器,创建取景器部件
    camera->setViewfinder(viewfinder);               //加入取景器,设置取景器部件
    viewfinder->resize(640,480);                     //设置取景器显示大小,设置取景器size

    imageCapture = new QCameraImageCapture(camera); //创建图像捕获类对象,与camera配合进行拍照
    imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
    camera->setCaptureMode(QCamera::CaptureStillImage);             //设置捕获模式为拍照,静态帧捕获
    camera->setCaptureMode(QCamera::CaptureMode::CaptureViewfinder);//将采集到取景器中
    //设置默认摄像头参数
    QCameraViewfinderSettings set;               //专门用于设置取景器参数,创建取景器类对象
    set.setResolution(640, 480);                 //设置显示分辨率,以像素为单位设置取景器的分辨率
    set.setMaximumFrameRate(75);                 //设置帧率,设置取景器的最小帧速率(以每秒帧数为单位)
    camera->setViewfinderSettings(set);          //设置取景器参数与相机匹配

    //添加初始化的相机选项
    for(const QCameraInfo &cameraInfo:cameras)
    {
       qDebug() << "CameraInfo:" << cameraInfo;
       ui->cameraSel->addItem(cameraInfo.description());
    }
        ui->cameraSel->setCurrentIndex(0);

    //添加初始化相机的分辨率选项
    mResSize = camera->supportedViewfinderResolutions();//查询摄像头支持的分辨率
    for (const QSize &msize:mResSize)
    {
        qDebug() << msize; //摄像头支持分辨率打印,打印相机支持的分辨率
        ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "*" + QString::number(msize.height(), 10));
    }
        ui->resolutionSel->setCurrentIndex(0);

    //信号槽连接
    connect(ui->cameraSel, QOverload<int>::of(&QComboBox::activated), [=](int index)
    {
                for (int i = 0; i < mResSize.size(); i++)
                {
                  ui->resolutionSel->removeItem(0);
                }
                //添加新相机的所有分辨率
                mResSize.clear();
                //qDebug() << "now mResSize = " << mResSize;
                mResSize = camera->supportedViewfinderResolutions();
                for (const QSize &msize:mResSize) {
                       qDebug() << msize; //摄像头支持分辨率打印
                       ui->resolutionSel->addItem(QString::number(msize.width(), 10) + "*" + QString::number(msize.height(), 10));
                }
                ui->resolutionSel->setCurrentIndex(0);
            });

            connect(ui->resolutionSel, QOverload<int>::of(&QComboBox::activated), [=](int index)
            {
                //重新设置摄像头参数
                QCameraViewfinderSettings reset;
                reset.setResolution(mResSize[index]);
                camera->setViewfinderSettings(reset);
            });

            connect(ui->screenShot, &QPushButton::clicked, [=](){
                camera->setCaptureMode(QCamera::CaptureStillImage);//设置捕获模式为拍照,静态帧捕获
                delete imageCapture;
                imageCapture = new QCameraImageCapture(camera);     //创建图像捕获类对象,与camera配合进行拍照
                QString fileName = QFileDialog::getSaveFileName();  //获得保存路径
                camera->searchAndLock();                            //锁定相机
                imageCapture->capture(fileName);                    //捕获图片并保存文件
                camera->unlock();                                   //解除相机锁定
            });



}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openScreen_clicked()
{
    camera->start();
    fps_time.start(33);
}
void Widget::on_closeScreen_clicked()
{
    delete camera;
    camera->stop();
    QApplication *app;
    app->exit(0);

}在这里插入代码片

widget.ui
在这里插入图片描述
实际效果图
在这里插入图片描述

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 在Qt使用Android设备的相机进行拍照可以通过调用Android提供的相机API实现。首先,需要在.pro文件添加相机和权限相关的配置: ``` QT += androidextras ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android ``` 然后,在AndroidManifest.xml文件添加相机权限: ``` <uses-permission android:name="android.permission.CAMERA"/> ``` 接下来,创建一个Qt Android应用程序的C++类,例如CameraController,用于处理与相机相关的逻辑。在该类,可以使用QAndroidJniObject类来调用相机API,如下所示: ```cpp #include <QAndroidJniObject> #include <QtAndroid> class CameraController : public QObject { Q_OBJECT public: Q_INVOKABLE void takePhoto() { QAndroidJniObject intent("android/content/Intent"); QAndroidJniObject MediaStore_Images_Media = QAndroidJniObject::getStaticObjectField( "android/provider/MediaStore$Images$Media", "EXTERNAL_CONTENT_URI", "Landroid/net/Uri;"); QAndroidJniObject action = QAndroidJniObject::getStaticObjectField( "android/provider/MediaStore$ACTION_IMAGE_CAPTURE", "Ljava/lang/String;"); intent.callObjectMethod("setAction", "(Ljava/lang/String;)Landroid/content/Intent;", action.object<jstring>()); QtAndroid::startActivity(intent, 101, nullptr); } }; ``` 在Qt QML界面,首先需要导入CameraController类,并创建一个CameraController对象。然后,在拍照按钮的点击事件,可以调用CameraController的takePhoto方法来启动相机拍照: ```qml import QtQuick 2.0 import QtAndroidExtras 1.0 Item { width: 200 height: 200 CameraContoller { id: controller } Rectangle { width: parent.width height: parent.height color: "gray" MouseArea { anchors.fill: parent onClicked: { controller.takePhoto() } } } } ``` 以上是使用Qt实现在Android设备上调用相机拍照的简单示例。在实际应用,还可以添加回调函数来处理拍照结果,并对相机API进行更多的配置和使用。 ### 回答2: 在Qt,可以使用Android提供的Camera类来调用相机拍照。 首先,在Qt的工程文件(.pro文件)添加Android权限声明,以便访问相机功能。可以添加以下代码: ```shell android { ... # 添加相机功能的权限声明 android:permission="android.permission.CAMERA" } ``` 然后,在Qt创建一个按钮,用于触发拍照操作。可以使用QPushButton类,并在按钮的点击事件触发时调用拍照的函数。可以使用以下代码: ```c++ #include <QCamera> #include <QCameraImageCapture> ... QPushButton *button = new QPushButton("拍照", this); connect(button, &QPushButton::clicked, this, &MyClass::takePhoto); ... void MyClass::takePhoto() { // 创建相机对象 QCamera *camera = new QCamera(this); camera->setCaptureMode(QCamera::CaptureStillImage); // 创建图像捕获对象 QCameraImageCapture *imageCapture = new QCameraImageCapture(camera); camera->setCaptureDestination(QCameraImageCapture::CaptureToFile); // 设置拍照保存路径 QString fileName = "路径/文件名.jpg"; imageCapture->setCaptureDestination(fileName); // 开始拍照 camera->start(); imageCapture->capture(); } ``` 上述代码,首先创建相机对象和图像捕获对象。然后设置拍照保存的路径,即将图片保存到指定的路径和文件名。最后,开始相机预览并调用`capture()`函数进行拍照。 通过以上步骤,就可以在Qt使用Qt的API来调用Android系统的相机功能,实现拍照操作。当然,为了使用该功能,相应的权限要在工程文件进行声明。 ### 回答3: 要在Qt实现安卓调用相机拍照,可以按照以下步骤进行操作。 首先,需要在项目的.pro文件添加以下模块导入语句: ```ruby QT += androidextras ``` 然后,在Qt的主代码文件引入相关模块: ```cpp #include <QtAndroidExtras> #include <QAndroidJniEnvironment> #include <QAndroidJniObject> ``` 接下来,可以通过如下代码来实现调用相机拍照的功能: ```cpp void invokeCamera() { QAndroidJniObject intent("android/content/Intent"); QAndroidJniObject action = QAndroidJniObject::getStaticObjectField( "android/provider/MediaStore", "ACTION_IMAGE_CAPTURE", "Ljava/lang/String;" ); intent.callObjectMethod("setAction", "(Ljava/lang/String;)Landroid/content/Intent;", action.object<jstring>()); QtAndroid::startActivity(intent.object<jobject>(), 101, this); } ``` 以上代码创建一个Intent对象,并设置其action为ACTION_IMAGE_CAPTURE(拍照动作)。接下来,通过QtAndroid::startActivity函数来启动拍照活动,其101是请求码,用于识别结果。 最后,在Qt的主代码文件重写onActivityResult函数来处理拍照结果: ```cpp void YourClass::onActivityResult(int requestCode, int resultCode, const QAndroidJniObject &data) { if (requestCode == 101 && resultCode == -1) { // 获取拍照结果 QAndroidJniObject uri = data.callObjectMethod( "getData", "()Landroid/net/Uri;"); // 处理uri,例如显示照片 } } ``` 以上代码判断请求码和结果码是否匹配,如果拍照成功,则通过getData方法获取照片URI,可以将其用于进一步处理,比如显示照片。 需要注意的是,以上代码只适用于Qt for Android平台,并且需要在AndroidManifest.xml文件添加拍照权限的声明。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值