目录
- 前言
- 正文
- 打开触发模式
- 开启抓图模式
- 发送触发信号
- 触发回调处理
- 总结
前言
这篇文章就开始讲一下图漾相机触发采集这部分的内容。
正文
打开触发模式
首先,先给出整个函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17qint32 MDevicePercipio3d::GrabThreadStart() { qint32 ret = RETURN_FAIL; if(m_bLoaded) { #ifdef WIN_PERCIPIO_3D m_cbWrapper.TYRegisterCallback(hDevice, frameCallback, this);//注册一个回调函数 m_trigger.mode = TY_TRIGGER_MODE_SLAVE;//开启触发模式为软触发 TYSetStruct(hDevice, TY_COMPONENT_DEVICE, TY_STRUCT_TRIGGER_PARAM, &m_trigger, sizeof(m_trigger)); ret = RETURN_OK; #endif } return ret; }
基本上也就比较重要的两句就是注册回调函数,开启触发模式为软触发。关于这个你应该是可以在demo上面的SimpleView_Callback
这个例子,看到这个东西的用法的。
开启抓图模式
为了文章的完整性,这里也是给出完整的函数,关于这个函数的解释我就直接摘抄第一篇文章关于这部分的一个解释了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35qint32 MDevicePercipio3d::AcquisitionStart() { qint32 ret = RETURN_FAIL; #ifdef WIN_PERCIPIO_3D if(m_bLoaded) { if(m_bStopWork) { uint32_t frameSize; if(hDevice!=NULL) { //这里相当于new出两个盘子来盛放buffer frameBuffer[0] = new char[m_frameSize]; frameBuffer[1] = new char[m_frameSize]; TYEnqueueBuffer(hDevice, frameBuffer[0], m_frameSize); TYEnqueueBuffer(hDevice, frameBuffer[1], m_frameSize); TYStartCapture(hDevice);//开启抓图 } m_bRunFlag = false; if(m_pConfigureObj->UpdateConfigureFromDevice()) m_pConfigureObj->SlotConfigChanged(); if(m_pConfigureObj->UpdateSimplyConfigureFromDevice()) m_pConfigureObj->SlotSimplyConfigChanged(); ret = RETURN_OK; m_bStopWork =false; } } #endif return ret; }
- 注意,整个相机要求用两个盘子(FrameBuffer)来盛放这些buffer,具体的原理,文档中应该有解释的,你只要照做就可以,然后将其放入队列之中。
1
2
3
4
5frameBuffer[0] = new char[m_frameSize]; frameBuffer[1] = new char[m_frameSize]; TYEnqueueBuffer(hDevice, frameBuffer[0], m_frameSize); TYEnqueueBuffer(hDevice, frameBuffer[1], m_frameSize);
- 然后就是开启抓图了。
1
2TYStartCapture(hDevice);//开启抓图
- 接下来的语句是更新一下参数,因为有可能有些相机的参数会因为你是否抓图的状态而发生改变。
1
2
3
4
5if(m_pConfigureObj->UpdateConfigureFromDevice()) m_pConfigureObj->SlotConfigChanged(); if(m_pConfigureObj->UpdateSimplyConfigureFromDevice()) m_pConfigureObj->SlotSimplyConfigChanged();
发送触发信号
因为我们需要的是软触发操作,也就是当相机接收到某个触发信号的时候,发动采图的操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14qint32 MDevicePercipio3d::TriggerSoftwareExecute() { qint32 ret = RETURN_FAIL; #ifdef WIN_PERCIPIO_3D if(hDevice!=NULL) { TYSendSoftTrigger(hDevice);//发送一个触发信号 ret = RETURN_OK; } #endif return ret; }
直接发送一个触发信号即可。当接收到触发信号,当然就会触发之前的注册函数中的回调采集函数了。
触发回调处理
首先,我需要用这个全局函数,来将形参中传入的指针转为我所需要的指针,所以指向我类中所声明的操作。
1
2
3
4
5
6
7
8
9void frameCallback(TY_FRAME_DATA* frame, void* pUser) { MDevicePercipio3d* pDev=static_cast<MDevicePercipio3d*>(pUser); if(pDev) { pDev->triggerEvent(frame);//将帧传递给主函数进行处理 } }
关于这个处理方式的原因是:一般这种注册函数中的回调函数,都会是全局函数,并且都会把对应的this指针在注册中作为实参传入回调函数之中。所以,我们这里作一个强转。转成我们要用的指针,然后指向我们类中的函数。之所以要指向我们类中的函数,是因为我们打算把这个buffer用这个类中的回调函数传递回最上层进行处理。这里可能讲的有点乱,但你如果有这样做过了,应该就能理解这个的意义。
下面肯定就是那个回调函数triggerEvent处理了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25//回调帧处理函数 void MDevicePercipio3d::triggerEvent(TY_FRAME_DATA* pFrameInfo) { #ifdef WIN_PERCIPIO_3D if(m_bStopWork) return; if(m_fGrabCallbackEx) { MFrameInfo info; for(int i = 0;i<pFrameInfo->validCount;i++) { info.nWidth = pFrameInfo->image[i].width; info.nHeight = pFrameInfo->image[i].height; info.nFramerLen = pFrameInfo->image[i].size; info.cFormat = pFrameInfo->image[i].pixelFormat; uchar *pbit = (uchar*)pFrameInfo->image[i].buffer; qDebug()<<info.nFramerLen; if(m_pCallUser) m_fGrabCallbackEx(m_pCallUser,pbit,&info);//将帧传递给回调函数进行处理 } TYEnqueueBuffer(hDevice, pFrameInfo->userBuffer,pFrameInfo->bufferSize); } #endif }
基本上关于这个的操作也就是取帧的信息以及取帧的地址,然后传递给回调函数进行处理。
总结
这里的触发采图跟之前的也比较类型,也是找到对应的函数,然后参考dmeo进行修改即可。其实还是应该把那个SDK给的那个程序给运行起来,关于其中的很多数据,你就可以知道你在运行时是否使用的对还是不对,若是不知道怎么弄好这个Cake程序的话,可以去看一下我的第一篇文章:图漾3d相机开发实践(1)——实时采图。若有错误,欢迎指出~
最后
以上就是曾经烤鸡最近收集整理的关于图漾3d相机开发实践(2)——触发采图前言正文总结的全部内容,更多相关图漾3d相机开发实践(2)——触发采图前言正文总结内容请搜索靠谱客的其他文章。
发表评论 取消回复