tof 相机的数据读取,depth data和amplitude data以及3D数据[通俗易懂]

tof 相机的数据读取,depth data和amplitude data以及3D数据[通俗易懂]1.开发前提如果相机带有SDK也就是开发需要的工具以及包,就要用相机带的开发包,里面包含了相应的读取文件的函数,以及设置的相机的相关函数。本文使用的是TTF相机,C++头文件代码如下:#include"../../include/TTF_API.h"#include<unistd.h>usingnamespacestd;usingnamespaceV…

大家好,又见面了,我是你们的朋友全栈君。

1.开发前提

如果相机带有SDK 也就是开发需要的工具以及包,就要用相机带的开发包,里面包含了相应的读取文件的函数,以及设置的相机的相关函数。

本文使用的是TTF相机,C++头文件代码如下:

#include "../../include/TTF_API.h"
#include <unistd.h>

using namespace std;
using namespace Voxel;

class Depth_Camera
{

public:    
    Depth_Camera();
    ~Depth_Camera();

    TTF_API::_ttfDeviceInfo m_pDevInfo[MAX_DEVICE];

    DepthFrame          *m_pDepthFrame;
    XYZIPointCloudFrame *m_pPCLFrame;

    int ReadDepthFrame(const DepthFrame* pDepthFrame);
    int ReadPointCloudFrame(const XYZIPointCloudFrame* pXYZIPointCloudFrame);

    bool System_init();
    int Buffer_init();

    void Data_Depth();
    void Data_PCL();

    void Device_Close();
    void Device_Stop();

};

其中TTF::相关函数是相机自带的接口。

 

2.读取数据

函数的实现部分,c++代码如下:

#include "Depth_Camera.h"


Depth_Camera::Depth_Camera()
{

}

Depth_Camera::~Depth_Camera()
{

}

//读取相关内容
int Depth_Camera::ReadDepthFrame(const DepthFrame* pDepthFrame)
{
    const DepthFrame *d = pDepthFrame;
    const float* data;

    data = d->depth.data();
    cout<< "depth:"<< d->id << "@" << d->timestamp << " data:" <<  data[320*120+160] << endl;


    return TTF_API::ERROR_NO;
}

int Depth_Camera::ReadPointCloudFrame(const XYZIPointCloudFrame* pXYZIPointCloudFrame)
{
    const XYZIPointCloudFrame *d = pXYZIPointCloudFrame;
    cout<< "pcl:" << d->id << "@" << d->timestamp << " data:" << d->points[320*120+160].z << endl;
    return TTF_API::ERROR_NO;
}
//函数初始化
bool Depth_Camera::System_init()
{
    int nDevCount;//device count
    int nDevOpened;


    TTF_API::ttfGetDeviceList(m_pDevInfo, nDevCount);

    if (nDevCount < 1)
    {
        std::cerr << "No Camera Found!, Please connection check and restart." "Connection Error" << std::endl;
    }
    else
    {
        nDevOpened = TTF_API::ttfDeviceOpen(m_pDevInfo[0].hnd);

        if (nDevOpened > 0)
        {

            //Callback Register //回调函数,           

TTF_API::ttfRegister_Callback_DepthFrame(std::bind(&Depth_Camera::ReadDepthFrame, this, std::placeholders::_1));
            TTF_API::ttfRegister_Callback_PointCloudFrame(std::bind(&Depth_Camera::ReadPointCloudFrame, this, std::placeholders::_1));

            std::cout << "Camera[VID:" << m_pDevInfo[0].nVendorId << ", PID:" << m_pDevInfo[0].nProductId <<
                         ", SerialNum:" << m_pDevInfo[0].szSerialNum << "] Open Success" << endl;

        }
        else
        {
            return TTF_API::ERROR_OPEN;
        }        

        Buffer_init();
    }

    Data_Depth();//start Depth
    //imshow("Binary", pDepthFrame);
    return TTF_API::ERROR_NO;
}

int Depth_Camera::Buffer_init()
{
    m_pDepthFrame   = (DepthFrame*)malloc(sizeof(DepthFrame));;
    m_pPCLFrame     = (XYZIPointCloudFrame*)malloc(sizeof(XYZIPointCloudFrame));

    if(m_pDepthFrame == NULL || m_pPCLFrame == NULL)
    {
        cout << "Failed to create nescecary buffers to display the image" << endl;
        return TTF_API::ERROR_FAIL;
    }
    else
        return TTF_API::ERROR_NO;
}


void Depth_Camera::Data_Depth()
{
    TTF_API::ttfClearCallback(m_pDevInfo[0].hnd, TTF_API::FrameType::FRAME_XYZI_POINT_CLOUD_FRAME);
    TTF_API::ttfDeviceStart(m_pDevInfo[0].hnd, TTF_API::FrameType::FRAME_DEPTH_FRAME);
}

void Depth_Camera::Data_PCL()
{
    TTF_API::ttfClearCallback(m_pDevInfo[0].hnd, TTF_API::FrameType::FRAME_DEPTH_FRAME);
    TTF_API::ttfDeviceStart(m_pDevInfo[0].hnd, TTF_API::FrameType::FRAME_XYZI_POINT_CLOUD_FRAME);
}

void Depth_Camera::Device_Close()
{
    TTF_API::ttfDeviceStop(m_pDevInfo[0].hnd);
    TTF_API::ttfDeviceClose(m_pDevInfo[0].hnd);
}

void Depth_Camera::Device_Stop()
{
    TTF_API::ttfDeviceStop(m_pDevInfo[0].hnd);
}

3.主函数的实现:

主函数未使用线程,只是比较简单的数据的读取 代码如下,

#include "Depth_Camera.h"

int main()
{ 
    Depth_Camera *depth_camera = new Depth_Camera;

    int nRet;
    nRet = depth_camera->System_init();
    if(nRet < 1)
    {
        cout << "init Error :" << nRet << endl;
        exit(0);
    }

    char getkey;
    while(1)
    {
        getkey = getchar();

        //Reading end Process
        if(getkey == 'q')
        {
            depth_camera->Device_Close();
            break;
        }        
        else if(getkey == '2')//Depth
        {
            depth_camera->Data_Depth();
        }
        else if(getkey == '3')//PCL
        {
            depth_camera->Data_PCL();
        }
        else if(getkey == 's')
        {
            depth_camera->Device_Stop();
        }


    }

    if(depth_camera != NULL)
    {
        delete depth_camera;
        depth_camera = NULL;
    }

    return 0;
}

4.今天只写数据的简单读取,下次完成深度数据以及3D数据的显示。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141345.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c#设计登录界面并添加数据库_windows窗体连接数据库

    c#设计登录界面并添加数据库_windows窗体连接数据库本篇文章介绍了C#窗体的数据库连接及登录功能的实现工具或平台:VS2010、sqlserver20121.创建完窗体后,点击数据,选择添加新数据源2.选择数据库3.选择数据集4.新建连接-MicrosoftSQLServer,添加完测试一下5.添加数据库-注意把连接字符串部分复制一下,一会儿要用的6.保存连接字符串到配置文

    2025年12月13日
    4
  • 戴尔g3数字键盘失灵的情况解决

    戴尔g3数字键盘失灵的情况解决

    2021年10月2日
    76
  • JSON字符串转对象_微信小程序配置文件

    JSON字符串转对象_微信小程序配置文件微信就是最大的坑!!!!!之前做的小程序,前台都是默认参数(返回json之类的),使用也都正常然而,今天发现的问题也是愁死个人,返回的json就是字符串,自然取不到里面的数据.小程序的js还有好多函数他不支持,坑.之前都是returnjson_encode($arr);这样子返回数据,代码都是一样,就这次莫名不好使.网上的答案也是千篇一律.最后有两篇文章都提到了一个问题,一试,果然有效.转jso…

    2022年9月28日
    4
  • win7显示器亮度怎么调_虚拟机外接显示器

    win7显示器亮度怎么调_虚拟机外接显示器很久没有继续研究wddmhook了,最后一次研究还在3年前,不得不说虽然应用的少,但是wddmhook却是很有技术含量的一项技术,而且实用性很高,我们除了做虚拟显示器还能做很多的东西,比如高效的截屏(因为直接从驱动层面截屏,所以效率和实现效果秒杀mirrordriver和DXGI)、视频重定向(视频硬件加速的时候可以直接获取原始码流)、修改原始的显示器厂商信息、修改显示器支持分辨率,等等骚操作wddmhook都可以实现。去年,深圳某硬件公司找到我,他们正在做usb转HDMI或者USB转VGA的硬件

    2022年8月21日
    5
  • android读取短信_android发短信代码

    android读取短信_android发短信代码在Tasker中利用短信的通知实现短信内容转发到微信之前的教程是利用Tasker自带的短信变量来实现的,这有一个无法解决问题:在360,魅族,坚果等品牌的手机中无法获取短信的消息内容。利用短信的通知则可以获取短信的内容,并且对于华为手机来说也可以不用关闭短信验证码保护功能,所以相较于原来的方法更简单,方便。应用通知的变量是一个本地数组变量%evtprm(),这个变量数组包含%evtprm…

    2022年10月13日
    2
  • AirSim和UE4的环境配置

    关于具体的环境配置网上有很多的资料,之前也配置过这个环境,但是没有好好的整理过,每次遇到问题都是瞎搞,然后莫名其妙的解决了。这次的博客主要是把配置的过程要注意的地方记录一下。1、前提条件cmake3.10.3、VisualStudio2015professionalupdate3、UE4.16.3这是我的机器上的环境,作为参考。2、编译AirSim源码首先要到Air…

    2022年4月14日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号