嵌入式爱好者

查看: 21603|回复: 0

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

[复制链接]

4

主题

4

帖子

64

积分

AM335x通行证i.MX6UL通行证i.MX RT通行证XX18通行证

扫一扫,手机访问本帖
发表于 2020-9-14 01:28:56 | 显示全部楼层 |阅读模式
飞凌嵌入式 OK3399-C+开发板试用体验】使用多媒体QCamera和QPointer相关类实现USB摄像头读取


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

  1. QT       += core gui ** **widgets
复制代码
48.jpg

然后是定义相关指针,我试过直接用*指针来定义不行,必须要用模板类指针:
  1. class MainWindow : public QMainWindow
  2. {
  3.     Q_OBJECT

  4. public:
  5.     explicit MainWindow(QWidget *parent = nullptr);
  6.     ~MainWindow();

  7. private slots:
  8.     void refreshCameras();
  9.     void refreshFormats();
  10.     void refreshResolutions();

  11.     void setCamera(QCameraInfo info);
  12.     void setFormat(QString format);
  13.     void setResolution(QSize resolution);

  14.     void disconnectCamera();

  15.     void updateImage();


  16. private:
  17.     Ui::MainWindow *ui;

  18.     QList<QCameraInfo> cameras;
  19.     QStringList formats;
  20.     QList<QSize> resolutions;

  21.     <font color="Blue">QCamera *camera;
  22.     QPointer<QCameraImageCapture> capture;</font>
  23.     VideoSu**ce su**ce;

  24.     QPointer<QActionGroup> ActionGroupCameras;
  25.     QPointer<QActionGroup> ActionGroupFormats;
  26.     QPointer<QActionGroup> ActionGroupResolutions;
  27. };
复制代码



VideoSu**ce类对象su**ce是自行编写的类,不需要使用指针指定,可以用实体类对象:
  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     thread1 = new mythread(this);

  7.     refreshCameras();
  8.     connect(&su**ce, &VideoSu**ce::newImageReady, this, &MainWindow::updateImage);
  9. }
复制代码

QCamera类对象camera需要跟QCameraInfo类的对象info绑定相关信息,查看QT库定义,只在构造函数中绑定QCameraInfo类,因此每次切换信息都需要使用new的方式绑定,QCameraImageCapture类同理:
  1. void MainWindow::setCamera(QCameraInfo info)
  2. {
  3.     delete camera;
  4.     delete capture;
  5.     camera = new QCamera(info, this);
  6.     capture = new QCameraImageCapture(camera, this);

  7.     camera->setViewfinder(&su**ce);
  8.     camera->load();
  9.     camera->start();

  10.     //refreshFormats();
  11.     refreshResolutions();

  12.     ui->actionDisconnect->setEnabled(true);
  13. }
复制代码

与摄像头断开连接时将QCamera类对象和QCameraImageCapture类资源回收:
  1. void MainWindow::disconnectCamera()
  2. {
  3.     delete camera;
  4.     delete capture;

  5.     for (QAction *action : ui->menuCameras->actions()) {
  6.         action->setChecked(false);
  7.     }
  8.     ui->actionDisconnect->setEnabled(false);
  9. }
复制代码

刷新摄像头列表时更新类对象信息并打印出来,还在下拉菜单中更新以便使用者选择:
  1. void MainWindow::refreshCameras()
  2. {
  3.     disconnectCamera();

  4.     cameras = QCameraInfo::availableCameras();

  5.     delete ActionGroupCameras;
  6.     ActionGroupCameras = new QActionGroup(this);
  7.     ui->menuCameras->clear();

  8.     if (cameras.size())
  9.     {
  10.         ui->menuCameras->setEnabled(true);

  11.         for (const QCameraInfo &info: cameras)
  12.         {
  13.             QAction *action = new QAction(info.description(), ActionGroupCameras); // capture->imageCodecDescription(codec)
  14.             action->setCheckable(true);
  15.             ui->menuCameras->addAction(action);
  16.             connect(action, &QAction::triggered, [=]()
  17.             {
  18.                 setCamera(info);
  19.             });
  20.         }

  21.         for (const QCameraInfo &info: cameras)
  22.         {
  23.             qDebug() << "Opening camera:" << info.deviceName();
  24.             qDebug() << "\t- Description:" << info.description();
  25.             qDebug() << "\t- Position:" << info.position();
  26.         }

  27.     } else
  28.     {
  29.         ui->menuCameras->setDisabled(true);
  30.     }
  31. }
复制代码

最后就是更新Label标签显示图像的槽函数了:
  1. void MainWindow::updateImage()
  2. {
  3.     ui->imageLabel->setPixmap(su**ce.getPixmap().scaledToWidth(ui->imageLabel->width(), Qt::SmoothTransformation));
  4. }
复制代码
45.jpg

这些都做好之后就在ui文件中添加下拉菜单即可,有刷新摄像头列表信息,断开连接,读取摄像头信息到列表等功能:
44.jpg 46.JPG
查看运行效果:
IMG_20200914_012226.jpg 47.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-11-22 03:40

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表