【飛凌嵌入式 OK3399-C+開發板試用體驗】使用多媒體QCamera和QPointer相關類

原創 2020-09-30 12:37:00 RK3399 RK3399開發板

作者:donatello1996


參考了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文件中添加下拉菜單即可,有刷新攝像頭列表信息,斷開連接,讀取攝像頭信息到列表等功能:



rk3399上查看運行效果:


 

相關產品 >

  • FET3399-C核心板

    飛凌RK3399安卓高性能核心板采用 采用六核Rockchip RK3399芯片,雙Cortex-A72大核+四Cortex-A53小核結構,對整數、浮點、內存等作了大幅優化,在整體性能、功耗及核心面積三個方面提升。以下將對瑞芯微芯片RK3399參數,RK3399核心板方案及其性能做具體介紹。如您對飛凌RK3399系列核心板有興趣,歡迎咨詢了解。

    了解詳情
    FET3399-C核心板
  • OK3399-C開發板

    飛凌嵌入式RK3399安卓開發板主芯片采用高性能六核CPU Rockchip RK3399,GPU采用Mail-T860四核 GPU,RK3399作為目RK產品線中低功耗、高性能的代表,可滿足人臉識別設備、機器人、無人機、IoT物聯網領域應用。飛凌RK3399開發板在整體性能、功耗及核心面積做了大幅度優化,更加滿足工業設計需求。飛凌RK3399開發板為進一步減少用戶二次開發難度,開放了底板原理圖,并提供了RK3399用戶手冊、芯片手冊,加上優質的技術服務,讓您的方案從構思到上市時間縮短。

    了解詳情
    OK3399-C開發板

推薦閱讀 換一批 換一批