【飞凌嵌入式 OK3399-C+开发板试用体验】使用多媒体QCamera和QPointer相关类

参考了GitHub上某位大佬的代码,使用QCamera QCameraInfo QCameraImageCapture QPointer QActionGroup这些类来实现USB摄像头图像读取,其中三个QCamera的相关类需要在pro文件中加入** **widgets即多媒体类库支持:

QT += core gui ** **widgets


然后是定义相关指针,我试过直接用*指针来定义不行,必须要用模板类指针:
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private slots:
    void refreshCameras();
    void refreshFormats();
    void refreshResolutions();
    void setCamera(QCameraInfo info);
    void setFormat(QString format);
    void setResolution(QSize resolution);
    void disconnectCamera();
    void updateImage();
private:
    Ui::MainWindow *ui;
    QList<QCameraInfo> cameras;
    QStringList formats;
    QList<QSize> resolutions;
    <font color="Blue">QCamera *camera;
    QPointer<QCameraImageCapture> capture;</font>
    VideoSu**ce su**ce;
    QPointer<QActionGroup> ActionGroupCameras;
    QPointer<QActionGroup> ActionGroupFormats;
    QPointer<QActionGroup> ActionGroupResolutions;
};

 

VideoSu**ce类对象su**ce是自行编写的类,不需要使用指针指定,可以用实体类对象:

 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    thread1 = new mythread(this);
    refreshCameras();
    connect(&su**ce, &VideoSu**ce::newImageReady, this, &MainWindow::updateImage);
}

 

 

QCamera类对象camera需要跟QCameraInfo类的对象info绑定相关信息,查看QT库定义,只在构造函数中绑定QCameraInfo类,因此每次切换信息都需要使用new的方式绑定,QCameraImageCapture类同理:

 

void MainWindow::setCamera(QCameraInfo info)
{
    delete camera;
    delete capture;
    camera = new QCamera(info, this);
    capture = new QCameraImageCapture(camera, this);
    camera->setViewfinder(&su**ce);
    camera->load();
    camera->start();
    //refreshFormats();
    refreshResolutions();
    ui->actionDisconnect->setEnabled(true);
}

 

 

与摄像头断开连接时将QCamera类对象和QCameraImageCapture类资源回收:

 

void MainWindow::disconnectCamera()
{
    delete camera;
    delete capture;
    for (QAction *action : ui->menuCameras->actions()) {
        action->setChecked(false);
    }
    ui->actionDisconnect->setEnabled(false);
}

 

 

刷新摄像头列表时更新类对象信息并打印出来,还在下拉菜单中更新以便使用者选择:

 

void MainWindow::refreshCameras()
{
    disconnectCamera();
    cameras = QCameraInfo::availableCameras();
    delete ActionGroupCameras;
    ActionGroupCameras = new QActionGroup(this);
    ui->menuCameras->clear();
    if (cameras.size())
    {
        ui->menuCameras->setEnabled(true);
        for (const QCameraInfo &info: cameras)
        {
            QAction *action = new QAction(info.description(), ActionGroupCameras); // capture->imageCodecDescription(codec)
            action->setCheckable(true);
            ui->menuCameras->addAction(action);
            connect(action, &QAction::triggered, [=]()
            {
                setCamera(info);
            });
        }
        for (const QCameraInfo &info: cameras)
        {
            qDebug() << "Opening camera:" << info.deviceName();
            qDebug() << "\t- Description:" << info.description();
            qDebug() << "\t- Position:" << info.position();
        }
    } else
    {
        ui->menuCameras->setDisabled(true);
    }
}

 

 

最后就是更新Label标签显示图像的槽函数了:

 

void MainWindow::updateImage()
{
    ui->imageLabel->setPixmap(su**ce.getPixmap().scaledToWidth(ui->imageLabel->width(), Qt::SmoothTransformation));
}

 

这些都做好之后就在ui文件中添加下拉菜单即可,有刷新摄像头列表信息,断开连接,读取摄像头信息到列表等功能:

查看运行效果:



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值