搞到一款图漾的3d相机有好久了,一直也只是编译了sample代码跑起来看看样子,并没有着手看SDK以及开发的事。近几日对照SDK以及其中的SimpleView_FetchFrame例子,捋了捋头绪。代码如下:
include "../common/Utils.hpp"
int main(int argc, char* argv[])
{
//初始化
TYInitLib();
// 打开设备
// 用设备ID打开设备,同时构建此设备的设备管理器。
TY_DEV_HANDLE hDevice;
TYOpenDevice("207000000866", &hDevice);
// 使能组件
// 按位或上组件结构体中的值,即可打开设备。
TYEnableComponents(hDevice, TY_COMPONENT_RGB_CAM | TY_COMPONENT_DEPTH_CAM | TY_COMPONENT_IR_CAM_LEFT | TY_COMPONENT_IR_CAM_RIGHT);
// 取得帧缓存大小。
// 说一下这一步的目的,由于打开不同组件(打开哪些组件),以及不同组件参数设定(分辨率)的原因,每一帧数据的大小是不固定的,
// 所以要用此函数计算一下当前设备以及当前设定下,一帧数据出来,需要多大的缓存buffer。
// 因为后面需要压入buffer队列进行数据读取,所以要保证buffer的大小能否装下一帧数据。
int32_t frameSize;
TYGetFrameBufferSize(hDevice, &frameSize);
// 驱动内部维护一个queue,用户往队列中enqueue空的buffer,
// 设备用每一帧的framedata去填充这个空的buffer,填充后,将此buffer弹出队列(dequeue),返回给用户使用。
// 这几个buffer是循环使用的,弹出被用户取出数据后,又会回到队列尾部。理论上将,只需要两个buffer即可循环使用。
int frameBuffer_number = 3;
char* frameBuffer[frameBuffer_number];
for (int i = 0; i < frameBuffer_number; ++i)
{
frameBuffer[i] = new char[frameSize];
TYEnqueueBuffer(hDevice, frameBuffer[i], frameSize);
}
//开始拍摄
TYStartCapture(hDevice);
//取景后不断有帧输出,需要循环取得帧数据,并进行解析输出。
TY_FRAME_DATA frame;
cv::Mat depth, irl, irr, color;
while(1)
{
// 取得帧
TYFetchFrame(hDevice, &frame, -1);
// 这句为整个程序的核心,解析得到的帧,解析为cv::Mat类型的图像,跟OpenCV对接后即可进行后续的处理。 defined in Utils.hpp line36
parseFrame(frame, &depth, &irl, &irr, &color, 0);
//图像显示
cv::imshow("Depth", depth);
cv::imshow("LeftIR", irl);
cv::imshow("RightIR", irr);
cv::imshow("Color", color);
//检测
if (cv::waitKey(1) == 'q') { break; }
// 这里就是申请的buffer循环使用的根本,每次buffer被dequeue用户取得帧后,在这个帧处理函数中,最后又把当前的buffer压入队列中,循环使用,
// 由于队列特性,队首出列,队尾入列,所以会有循环使用的样子。
TYEnqueueBuffer(hDevice, frame.userBuffer,http://www.appsaa.com , frame.bufferSize);
}
//停止拍摄。
TYStopCapture(hDevice);
//关闭设备。
TYCloseDevice(hDevice);
//反初始化,注销API。
TYDeinitLib();
//delete释放内存。
for (int j = 0; j < frameBuffer_number; ++j)
{
delete frameBuffer[j];
}
return 0;
}
1 个评论
要回复文章请先登录或注册
1***@qq.com