实战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;