This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/OPT8241-CDK-EVM:同步的 steram 多个 OPT8241摄像头。

Guru**** 2563960 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/628709/compiler-opt8241-cdk-evm-steram-multiple-opt8241-cameras-synchrously

器件型号:OPT8241-CDK-EVM

工具/软件:TI C/C++编译器

尊敬的所有人:

我们希望同步固件多个 OPT8241摄像头。

该流程的设计如下。
1.使用 USB 电缆将摄像头1连接至计算机。
2.启动 Voxel Viewer 并开始流式传输。
3.使用 USB 电缆将摄像头2连接至计算机。
4.启动 Voxel Viewer 的另一个实例并开始流式传输。

我们需要注册回叫两次、每个摄像头一个。 每个摄像头应具有不同的缓冲器。  (请参阅 :github.com/.../Qt)

首先、我们尝试将 grabber.cpp 和 grabber.h (在 github.com/.../Qt 中)集成到我的主代码中。我们发现回调函数只执行一次、无法继续运行。为什么?

在主代码中忽略哪个设置? 我们下一步可以做什么?  

此致、

盛华

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

部分代码如下所示。


主代码:

CameraSystem 系统;

//获取所有有效检测到的设备

  • 常量矢量 设备= sys.scan();
  • DevicePtr toConnect;
  •  DepthCameraPtr depthCamera = sys.connect (toConnect);
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ A
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ A
  • Grabber Graber1 (depthCamera、Grabber::FRAMEFLAG_DEPTY_FRAME、sys);
  • Grabber1.start();
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~μ A

网址为 grabber.cpp

空捕捉器::_callback (DepthCamera &depthCamera、const Frame &Frame、DepthCamera::FrameType 类型)

锁定 _(_mtx);//只运行一次  

~~~~μ A

否则(type = DepthCamera::frame_XYZI_point_cloud_frame)

if (_qXYZIFram.size ()>= FIFO_SIZE)

XYZIPointCloudFrame *f =_qXYZIFrame.front();
_qXYZIFrame.pop_front();
if (f!= NULL)
删除 f;

XYZIPointCloudFrame *NF =新的 XYZIPointCloudFrame;
*NF =*动态转换 (框架);
_qXYZIFrame.push_back (NF);

帧计数++;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Sheng、

    我们已收到您有关 OPT8241-CDK-EVM 的查询、器件应用团队将很快返回给您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    盛华

    如您所示、每个捕捉器都有自己的缓冲区和循环。 您必须注册两个单独的回调、每个回调一个。 您很难从代码片段中看到代码片段是否完成。 如果您可以共享完整代码(发送至 ti-3dtof@list.ti.com)、我们可以更好地为您提供帮助。

    Larry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Praveen:

    感谢您的善意支持。

    此致、

    盛华

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Larry:

    好的。
    我稍后将打包多摄像头同步代码、然后发送到" ti-3dtof@list.ti.com " a.s.a.p.
    感谢您的善意支持。

    此致、
    盛华
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Larry:

    我们修改了 TI Voxel SDK 中的 CamerasSaveStreamTest 项目,然后为每个 Grabber 注册了三个单独的回调,每个回调都有自己的缓冲区和循环。
    发现一些错误后、我们大约可以同时运行3种不同的 T.O.F 摄像头流。 感谢你的帮助。

    此致、
    盛华

    /图标 /
    主程序如下。
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    程序流:
    1.使用 USB 电缆将摄像头1/2/3连接至计算机。
    2.具有特定回调函数的初始捕捉1/2/3
    3.开始获取1/2/3流。
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /*
    * TI Voxel Lib 组件。
    *
    *版权所有(c) 2014 Texas Instruments Inc.
    *


    #include "CameraSystem.h"

    #include "SimpleOpt.h"
    #include "Common.h"
    #include "Logger.h"
    #include "UVCStreamer.h"
    #include
    #include
    /2017.0928 by ysh… 圣
    #include "graber.h"
    ////// … 结束。。
    使用命名空间 Voxel;

    枚举选项

    Vendor_ID = 0、
    Product_ID = 1、
    serial_number = 2、
    dump_file = 3、
    num_of 帧= 4
    };

    矢量 参数规格=

    {vender_ID、"-v"、SO_REQ_SEP、"USB 器件的供应商 ID (十六进制)"}、//此处仅需要工作人数
    {product_ID、"-p"、SO_REQ_SEP、"USB 器件产品 ID 的逗号分隔列表(十六进制)"}、
    {serial_number、"-s"、SO_REQ_SEP、"USB 器件的序列号(字符串)"}、
    {dump_file、"-f"、SO_REQ_SEP、"Name of the file to dump extracted frames"}、
    {NUM_OF_FRAMES、"-n"、SO_REQ_SEP、"要转储的帧数[默认值= 1]"}、
    SO_END_OPTIONS
    };

    空帮助()

    std:::cout <<"CameraSystemSaveStreamTest v1.0"<<std:endl;

    CSSimpleOpt::soption *选项= argumentSpecifications.data();

    while (选项->NID >= 0)

    std::cout << option->pszArg<<"<< option->helpInfo << std::endl;
    选项++;



    #if 1.
    typedef 枚举{
    FRAMEFLAG_RAW_坯 件=(1 << DepthCamera::frame_raW_frame_坯 件)、
    FRAMEFLAG_RAW_Processed =(1 << DepthCamera::frame_raW_FRAME_Processed)、
    FRAMEFLAG_DEPTY_FRAME =(1 << DepthCamera::FRAME_DEPTY_FRAME)、
    FRAMEFLAG_XYZI_POIN_CLOUD 帧=(1 << DepthCamera::frame_XYZI_POIN_CLOUD 帧)、
    FRAMEFLAG_ALL =(FRAMEFLAG_RAW_RAWLET
    | FRAMEFLAG_RAW_Processed
    | FRAMEFLAG_DEPTH 帧
    | FRAMEFLAG_XYZI_POT_CLOUD 帧)
    }帧标志;
    #endif


    int main (int argc、char * argv[])


    CSSimpleOpt s (argc、argv、argumentSpecifications);

    logger.setDefaultLogLevel(LOG_INFO);

    uint16_t vid = 0;

    矢量 PID;
    字符串序列号;
    /2017.0929 by ysh…
    字符串 serialNumber1 ="10408201039135";
    字符串 serialNumber2 ="10410711038992";
    字符串序列号3="10408671038987";

    字符串 dumpFileName;

    int32_t 帧计数= 1;

    /2017.0929 by ysh
    bool test_flag = 0;

    char *endptr;

    while (s.Next())

    if (s.LastError()!= SO_SUCCESS)

    std::cout << s.GetLastErrorText (s.LastError())<<":"< s.OptionText()<<"'(使用-h 获取命令行帮助)"<< std::endl;
    help();
    返回-1;


    //std:::cout << s.OptionId()<<":"<< s.OptionArg()<< std:endl;

    矢量 splits;
    switch (s.OptionId())

    case vendor_ID:
    VID =(uint16_t) strtol (s.OptionArg()、&endptr、16);
    中断;

    案例 PRODUCT_ID:
    split(s.OptionArg()、','、splits);

    对于(自动&s1:splits)
    pids.push_back ((uint16_t) strtol (s1.c_str ()、&endptr、16));

    中断;

    案例序列号:
    SerialNumber = s.OptionArg();
    中断;

    案例转储文件:
    dumpFileName = s.OptionArg();
    中断;

    大小写 NUM_OF_FRAMES:
    frameCount =(int32_t) strtol (s.OptionArg()、&endptr、10);
    中断;

    默认值:
    help();
    中断;
    };


    if (vid =0 || pids.size ()=0 || pid[0]=0 || dumpFileName.size ()=0)

    logger (log_error)<<"required argument missing." << std::endl;
    help();
    返回-1;


    CameraSystem 系统;

    //获取所有有效检测到的设备
    常量矢量 设备= sys.scan();

    DevicePtr toConnect;
    DevicePtr toConnect1;
    DevicePtr toConnect2;
    DevicePtr toConnect3;

    std:::cout <<"检测到的器件:"<< std::endl;
    (自动&d:设备)

    std::cout <<d->id()<< std:endl;

    if (d->interfaceID ()==设备:USB)

    USBDevice &USB=(USBDevice &)*d;

    //if (usb.VendorID ()=vid &&(SerialNumber.size ()=0 || usb.serialNumber ()=SerialNumber)){
    //if (usb.VendorID ()=vid &&(serialNumber1.size ()=0 || serialNumber2.size ()==0 || usb.serialNumber ()=serialNumber1 || usb.serialNumber ()=serialNumber2)){
    if (usb.VendorID ()=vid){
    for (自动 pid:PID)
    if (usb.productID ()== pid)

    if (usb.serialNumber ()=serialNumber1)
    {toConnect1 = d;}
    if (usb.serialNumber ()=serialNumber2)
    {toConnect2 = d;}
    if (usb.serialNumber ()=serialNumber3)
    {toConnect3 = d;}

    //toConnect = d;




    //if (!toConnect)
    //{
    // logger (log_error)<<"No valid device found for the specified VID:PID:serialnumber"<< std::endl;
    //返回-1;
    //}

    如果(!toConnect1 &&!toConnect2)

    logger (log_error)<<"No valid device found for the specified VID:PID:serialnumber"<< std:endl;
    返回-1;


    //DepthCameraPtr depthCamera = sys.connect (toConnect);
    DepthCameraPtr dethCamera1 = sys.connect (toConnect1);
    DepthCameraPtr dethCamera2 = sys.connect (toConnect2);
    DepthCameraPtr dethCamera3 = sys.connect (toConnect3);

    /2017.0928 by ysh…
    CameraSystem sys1、sys2、SYS3;

    /2017.0928 by ysh… 还可以…
    //Grabber Graber1 (depthCamera、Grabber::FRAMEFLAG_XYZI_POINT_CLOUD 帧、sys);

    Grabber Graber1 (deptcamera1、Grabber::FRAMEFLAG_DEPTY_FRAME、sys1);
    Grabber Graber2 (depthCamera2、Grabber::FRAMEFLAG_XYZI_POINT_CLOUD 帧、sys2);
    Grabber Grabber3 (depthCamera3、Grabber::FRAMEFLAG_XYZI_POINT_CLOUD 帧、sys2、3);
    // test_flag=Grabber1.isInitialize();

    //std:::cout <<"已成功为设备加载深度摄像机"<< toConnect->id()<< std:endl;
    Grabber1.start();
    Grabber2.start();
    Grabber3.start();

    while (1){};

    返回0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的所有人:

        我们希望通过寄存器回调函数流式传输 ToF 摄像头。 首先、我们尝试集成 grabber.cpp 和 grabber.h (在 github.com/.../Qt 中)

        我的主代码。 通过将帧速率设置为30fps 和摄像机配置文件,然后运行 Grabber1.start()。

        我们发现、由于帧在缓慢正向流水线中丢失、帧速率接近6fps。  为什么? 如何执行下一步?

    程序代码如下所示。

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    DepthCameraPtr dethCamera1 = sys1.connect (toConnect1);

    Grabber Grabber1 (deptcamera1、Grabber::FRAMEFLAG_RAW_Processed、sys1、1);

    Grabber1.setFrameRate(30.0);

    Grabber1.setProfile(_profile2_SR);

    if (Grabber1.isInitialized()&&!Grabber1.isRunning())

    Grabber1.start();

    while (1){};

    返回0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    此致、

    盛华

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的所有人:

    附件是我的程序代码。

    此致、

    盛华

    e2e.ti.com/.../CameraSystemSaveStreamTest_5F00_3.cppe2e.ti.com/.../grabber_5F00_sh.cppe2e.ti.com/.../grabber_5F00_sh.h

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Shenhua、

    您的多摄像头流式传输现在是否正常工作?

    Larry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Larry:

     

    感谢您的善意支持。 我们尝试重写回调函数、然后测试 PCL 回调函数。 连接多个 ToF 摄像头后、捕捉器的帧速率接近30fps。 现在、我们要集成多摄像头回调的算法、发现由于正向管道缓慢、帧速率降低到12fps。 在我们的应用中、我们希望通过图像处理算法将帧速率保持在30fps。 我们如何进行下一步? 为每个回调函数或其他方法使用多个线程?

     

    此致、

    盛华

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用多个线程是一种可能。 此外、请确保您使用的是 FIFO、并且不会在回调中进行过多处理。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Larry:

    好的。 如何在 PCL 回调中使用 FIFO?
    在多个摄像头同步中是否有这种情况的示例?
    感谢您的支持。

    此致、
    盛华