当前位置:AIGC资讯 > 数据采集 > 正文

实战QT数据采集与显示

实战QT数据采集与显示

一、QT界面绘制 二、功能实现 1、回调函数不能作为成员函数 2、实时显示相机画面 3、动态分配内存与释放


最近做了一个项目,算是从零开始完整的实现了需求,在此前还是一个局限于会写demo的小白,收获颇丰,记录下。

一、QT界面绘制

我的需求是实现相机5种不同模式的采集,那第一步就是选择采集模式,之后根据采集模式,呈现不同的界面,这里我用的是QStackedWidget组件:
通过判断选择模式的序号,开启不同的界面。

    u32 calib = ui->Calibmode->currentIndex();
    switch (calib) {
    case 0:
        mono = new Mono();
        ui->Show->addWidget(mono);
        break;
    case 1:
        stereo = new Stereo();
        ui->Show->addWidget(stereo);
        break;

如下图所示,右侧为预留出的QStackWidget

之后根据QComboBox组件的序号,选择不同相机型号,从而调用不同的函数,还有很多可配置的选项都是采用类似的方法实现,总的来说就是读取ui界面上的配置参数,预留各种功能的接口,ui绘制比较简单。

二、功能实现

1、回调函数不能作为成员函数

在相机收到图片信息时,由于不能作为成员函数,因此不能直接调用类里的private变量,通过增加public函数解决,如:

    void SetImgtime(char szimgtime[64])
    {
        strcpy(imgtime,szimgtime);
    }

    QString GetSaveName(){return save_name;}
    Ui::Mono& GetMonoUi(){return *ui;}

此外,如何在回调函数里调用成员函数,还需要将用户数据赋值为类,如:

void msgCallBack(u32 dwHandle, u32 dwMsgType, s8 *pMsg, u32 dwMsgLen, void *pUserData)
{
    Mono *m_mono = (Mono*)pUserData;
}

2、实时显示相机画面

相机画面也就是视频,何为视频,本质上也就是一组不停刷新的图片,因此,每收到一次图片信息,将其转化为图片,并通过setPixmap显示即可。
但是实际操作的时候遇到很多小问题,比如转化图片时,格式如何处理,以及相机收到图片的帧率过高(60帧),而图片转化耗时就需要20ms,图片还未转化完,下一帧图片就来了,导致图片显示有延时。
由于只需显示即可,通过跳帧的方法解决:

    case camera::EVT_IMAGE_DATA_NOTIFY:
    {
        static int i = 0;
        if (++i != 4)
        {
            break;
        }
        i = 0;
       /*功能函数*/
 }

3、动态分配内存与释放

我需要动态分配内存,以存储图片信息,这里用的是malloc函数以及free函数

        s32 imagedatalen = pImgHead->wHeight * pImgHead->wWidth *3;
        /*malloc*/
        u8 *Imagedata_RGB = NULL;
        Imagedata_RGB = (u8*)malloc(imagedatalen);
        /*功能函数*/
                /*free*/
        free(Imagedata_RGB);
        Imagedata_RGB = NULL;                 

更新时间 2023-11-08