当前位置: 代码网 > it编程>游戏开发>ar > 机器视觉硬件篇--线激光3d相机介绍及编程

机器视觉硬件篇--线激光3d相机介绍及编程

2024年08月03日 ar 我要评论
常见的三维视觉技术,包含双目、ToF、激光三角、结构光等毫米级:双目、ToF、结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,VR/AR,刷脸支付等微米级:线激光、结构光(编码)的精度是 um 级,主要应用在工业领域,如:表面缺陷检测、三维测量等纳米级:另外,还有 nm 级精度的光谱共焦技术,可用于透明材质物体的三维测量线激光3D相机,是一种基于三角测量原理,通过图像传感器,捕获激光发生器投射在物体表面的激光线信息,重构物体表面轮廓信息的三维相机。以上文字来源于。

一、3d相机简介

常见的三维视觉技术,包含双目、tof、激光三角、结构光等

毫米级:双目、tof、结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,vr/ar,刷脸支付等

微米级:线激光、结构光(编码)的精度是 um 级,主要应用在工业领域,如:表面缺陷检测、三维测量等

纳米级:另外,还有 nm 级精度的光谱共焦技术,可用于透明材质物体的三维测量

线激光3d相机,是一种基于三角测量原理,通过图像传感器,捕获激光发生器投射在物体表面的激光线信息,重构物体表面轮廓信息的三维相机。

以上文字来源于https://zhuanlan.zhihu.com/p/486516636

线激光3d相机品牌:基恩士keyence 埃尔森lmi 深视sszn

本文将介绍深视智能的线激光常见问题以及编程方式

二、sszn线激光

2.1常见问题

触发方式: 连续触发、io触发、编码器触发

最大速度计算公式:

最大速度 = 细化点数 * 采样频率 * 0.8 * 脉冲当量

扫描长度计算公式:

扫描长度 = 细化点数 * 批处理点数 * 脉冲当量

脉冲当量一般情况下为0.001mm

批处理点数不变的情况下,如何提高扫描速度?

压缩景深,可以提高采样频率

压缩景深z轴范围变小,需要看样品高度是否支持压缩景深,如果样品扫描不全就不能压缩

2.2 sdk接口介绍

#ifndef sr7link__h
#define sr7link__h

#include <stdio.h>

#ifdef win32
#define  sr7_if_api __declspec(dllexport)
#else
#define  sr7_if_api extern
#endif

typedef void * sr7if_data;

/// \brief                      高速数据通信的回调函数接口.
///    \param pbuffer              指向储存概要数据的缓冲区的指针.
///    \param dwsize               每个单元(行)的字节数量.
///    \param dwcount              存储在pbuffer中的内存的单元数量.
///    \param dwnotify             中断或批量结束等中断的通知.
///    \param dwuser               用户自定义信息.
///
typedef void (*sr7if_callback)(char* pbuffer, unsigned int dwsize, unsigned int dwcount, unsigned int dwnotify, unsigned int dwuser);
typedef void (*sr7if_batchonetimecallback)(const void *info, const sr7if_data *data);


typedef struct {
    unsigned char    abyipaddress[4];
} sr7if_ethernet_config;

#define sr7if_error_not_found                     (-999)                  // 功能(相机)不存在.
#define sr7if_error_command                       (-998)                  // 该命令不支持.
#define sr7if_error_parameter                     (-997)                  // 参数错误.
#define sr7if_error_unimplemented                 (-996)                  // 功能未实现.
#define sr7if_error_handle                        (-995)                  // 句柄无效.
#define sr7if_error_memory                        (-994)                  // 内存(溢出/定义)错误.
#define sr7if_error_timeout                       (-993)                  // 操作超时.
#define sr7if_error_databuffer                    (-992)                  // 数据大缓冲区不足.
#define sr7if_error_stream                        (-991)                  // 数据流错误.
#define sr7if_error_closed                        (-990)                  // 接口关闭不可用.
#define sr7if_error_version                       (-989)                  // 当前版本无效.
#define sr7if_error_abort                         (-988)                  // 操作被终止,如连接被关闭、连接中断等.
#define sr7if_error_already_exists                (-987)                  // 操作和现有的设置冲突.
#define sr7if_error_frame_loss                    (-986)                  // 批处理帧丢失.
#define sr7if_error_roll_data_overflow            (-985)                  // 无终止循环批处理出现溢出异常等.
#define sr7if_error_roll_busy                     (-984)                  // 无终止循环批处理读数据忙.
#define sr7if_error_mode                          (-983)                  // 当前处理函数与设置的批处理模式有冲突.
#define sr7if_error_camera_not_online             (-982)                  // 相机(传感头)不在线.
#define sr7if_error                               (-1)                    // 一般性错误,如设置失败、数据获取失败等.
#define sr7if_normal_stop                         (-100)                  // 正常停止,如外部io停止批处理操作等.
#define sr7if_ok                                  (0)                     // 正确操作.

#ifdef __cplusplus
extern "c" {
#endif

///
/// \brief sr7if_ethernetopen   通信连接.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param pethernetconfig      ethernet 通信设定.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_ethernetopen(unsigned int ldeviceid, sr7if_ethernet_config* pethernetconfig);

///
/// \brief sr7if_commclose      断开与相机的连接.
/// \param ldeviceid            设备id号,范围为0-3.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_commclose(unsigned int ldeviceid);

///
/// \brief sr7if_switchprogram  切换相机配置的参数.重启后不保存配方号.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param no:                  任务参数列表编号 0 - 63.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_switchprogram(unsigned int ldeviceid, int no);

///
/// \brief sr7if_getonlinecamerab   获取传感头b是否在线
/// \param ldeviceid            设备id号,范围为0-3.
/// \return
///     <0:                     -982:传感头b不在线
///                             其他:获取失败
///     =0:                     传感头b在线
///
sr7_if_api int sr7if_getonlinecamerab(unsigned int ldeviceid);


///
/// \brief sr7if_startmeasure   开始批处理,立即执行批处理程序.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param timeout              非循环获取时,超时时间(单位ms);循环模式该参数可设置为-1.
/// \return
///     <0:                     失败
///     =0:                     成功
///
sr7_if_api int sr7if_startmeasure(unsigned int ldeviceid, int timeout = 50000);


/// \brief sr7if_startiotriggermeasure 开始批处理,硬件io触发开始批处理,具体查看硬件手册.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param timeout              非循环获取时,超时时间(单位ms);循环模式该参数可设置为-1.
/// \param restart              预留,设为0.
/// \return
///     <0:                     失败
///     =0:                     成功
///
sr7_if_api int sr7if_startiotriggermeasure(unsigned int ldeviceid, int timeout = 50000, int restart = 0);

///
/// \brief sr7if_stopmeasure    停止批处理
/// \param ldeviceid            设备id号,范围为0-3.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_stopmeasure(unsigned int ldeviceid);

/// \brief sr7if_receivedata    阻塞方式获取数据.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              返回数据指针.
/// \return
///     <0:                     获取失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_receivedata(unsigned int ldeviceid, sr7if_data dataobj);


/// \brief sr7if_profilepointsetcount 获取当前批处理设定行数
/// \param ldeviceid            设备id号,范围为0-3
/// \param dataobj              预留,设置为null
/// \return                     返回实际批处理行数
///
sr7_if_api int sr7if_profilepointsetcount(unsigned int ldeviceid, const sr7if_data dataobj);

/// \brief sr7if_profilepointcount 获取批处理实际获取行数.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null.
/// \return                     返回批处理实际获取行数.
///
sr7_if_api int sr7if_profilepointcount(unsigned int ldeviceid, const sr7if_data dataobj);

/// \brief sr7if_profiledatawidth 获取数据宽度.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null.
/// \return                     返回数据宽度(单位像素).
///
sr7_if_api int sr7if_profiledatawidth(unsigned int ldeviceid, const sr7if_data dataobj);

///
/// \brief sr7if_profiledata_xpitch 获取数据x方向间距.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null.
/// \return                     返回数据x方向间距(mm).
///
sr7_if_api double sr7if_profiledata_xpitch(unsigned int ldeviceid, const sr7if_data dataobj);

///
/// \brief sr7if_getencoder     获取编码器值
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param encoder              返回数据指针,双相机为a/b交替数据
/// \return
///     <0:                     获取失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getencoder(unsigned int ldeviceid, const sr7if_data dataobj, unsigned int *encoder);

///
/// \brief sr7if_getencodercontiune 非阻塞方式获取编码器值
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param encoder              返回数据指针,双相机为a/b交替数据
/// \param getcnt               获取数据长度
/// \return
///     <0:                     获取失败.
///     >=0:                    实际返回的数据长度.
///
sr7_if_api int sr7if_getencodercontiune(unsigned int ldeviceid, const sr7if_data dataobj, unsigned int *encoder, unsigned int getcnt);


///
/// \brief sr7if_getprofiledata 阻塞方式获取轮廓数据
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param profile              返回数据指针,双相机为a/b行交替数据
/// \return
///     <0:                     获取失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getprofiledata(unsigned int ldeviceid, const sr7if_data dataobj, int *profile);

///
/// \brief sr7if_getprofilecontiunedata 非阻塞方式获取轮廓数据
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param profile              返回数据指针,双相机为a/b行交替数据
/// \param getcnt               获取数据长度
/// \return
///     <0:                     获取失败.
///     >=0:                    实际返回的数据长度.
///
sr7_if_api int sr7if_getprofilecontiunedata(unsigned int ldeviceid, const sr7if_data dataobj, int *profile, unsigned int getcnt);



///
/// \brief sr7if_getintensitydata  阻塞方式获取亮度数据
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param intensity            返回数据指针,双相机为a/b行交替数据
/// \return
///     <0:                     获取失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getintensitydata(unsigned int ldeviceid, const sr7if_data dataobj, unsigned char *intensity);


///
/// \brief sr7if_getintensitycontiunedata 非阻塞获取亮度数据
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param intensity            返回数据指针,双相机为a/b行交替数据
/// \param getcnt               获取数据长度
/// \return
///     <0:                     获取失败.
///     >=0:                    返回获实际数据行数.
///
sr7_if_api int sr7if_getintensitycontiunedata(unsigned int ldeviceid, const sr7if_data dataobj, unsigned char *intensity, unsigned int getcnt);

///
/// \brief sr7if_getbatchrolldata 无终止循环获取数据
/// \param ldeviceid            设备id号,范围为0-3.
/// \param dataobj              预留,设置为null
/// \param profile              返回轮廓数据指针,双相机为a/b行交替数据
/// \param intensity            返回亮度数据指针,双相机为a/b行交替数据
/// \param encoder              返回编码器数据指针,双相机为a/b交替数据
/// \param frameid              返回帧编号数据指针
/// \param frameloss            返回批处理过快掉帧数量数据指针,双相机为a/b交替数据
/// \param getcnt               获取数据长度
/// \return
///     <0:                     获取失败.
///     >=0:                    实际返回的数据长度.
///
sr7_if_api int sr7if_getbatchrolldata(unsigned int ldeviceid, const sr7if_data dataobj,
                                        int *profile, unsigned char *intensity, unsigned int *encoder, long long *frameid, unsigned int *frameloss,
                                        unsigned int getcnt);

///
/// \brief sr7if_geterror       获取系统错误信息
/// \param ldeviceid            设备id号,范围为0-3.
/// \param pbyerrcnt            返回错误码数量
/// \param pwerrcode            返回错误码指针
/// \return
///     <0:                     获取失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_geterror(unsigned int ldeviceid, int *pbyerrcnt, int *pwerrcode);

///
/// \brief sr7if_getbatchrollerror   无终止循环获取数据异常计算值
/// \param ldeviceid            设备id号,范围为0-3.
/// \param etherrcnt            返回网络传输导致错误的数量
/// \param usererrcnt           返回用户获取导致错误的数量
/// \return
///     <0:                     获取失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getbatchrollerror(unsigned int ldeviceid, int *etherrcnt, int *usererrcnt);


///
/// \brief sr7if_clearerror     暂无
/// \param ldeviceid
/// \param werrcode
/// \return
///     <0:                     清除失败
///     =0:                     成功
///
sr7_if_api int sr7if_clearerror(unsigned int ldeviceid, unsigned short werrcode);

///
/// \brief sr7if_getversion     获取库版本号.
/// \return                     返回版本信息.
///
sr7_if_api const char *sr7if_getversion();

///
/// \brief sr7if_getmodels      获取相机型号.
/// \param ldeviceid            设备id号,范围为0-3.
/// \return                     返回相机型号字符串.
///
sr7_if_api const char *sr7if_getmodels(unsigned int ldeviceid);

///
/// \brief sr7if_getheaderserial   获取相机头序列号
/// \param ldeviceid            设备id号,范围为0-3.
/// \param head                 0:相机头a  1:相机头b
/// \return
///     !=null:                 返回相机序列号字符串.
///     =null:                  失败,相应头不存在或者参数错误.
///
sr7_if_api const char *sr7if_getheaderserial(unsigned int ldeviceid, int head);

/// 高速数据通信相关
///
/// \brief sr7if_highspeeddataethernetcommunicationinitalize 初始化以太网高速数据通信.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param pethernetconfig      ethernet 通信设定.
/// \param whighspeedportno     ethernet 通信端口设定.
/// \param pcallback            高速通信中数据接收的回调函数.
/// \param dwprofilecnt         回调函数被调用的频率. 范围1-256
/// \param dwthreadid           线程号.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_highspeeddataethernetcommunicationinitalize(unsigned int ldeviceid, sr7if_ethernet_config* pethernetconfig, int whighspeedportno,
    sr7if_callback pcallback, unsigned int dwprofilecnt, unsigned int dwthreadid);


///
/// \brief sr7if_setoutputportlevel      设置输出端口电平.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param port                 输出端口号,范围为0-7.
/// \param level                输出电平值.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_setoutputportlevel(unsigned int ldeviceid, unsigned int port, bool level);


///
/// \brief sr7if_setoutputportlevel      读取输入端口电平.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param port                 输入端口号,范围为0-7.
/// \param level                读取输入电平.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getinputportlevel(unsigned int ldeviceid, unsigned int port, bool *level);

///
/// \brief sr7if_getsingleprofile   获取当前一条轮廓(非批处理下,需在edgeimaging中设置为2.5d模式)
/// \param ldeviceid            设备id号,范围为0-3.
/// \param pprofiledata         返回轮廓的指针.
/// \param pencoder             返回编码器的指针.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getsingleprofile(unsigned int ldeviceid, int *pprofiledata, unsigned int *pencoder);

///
/// \brief sr7if_setsetting     参数设定.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param depth                设置的值的级别.
/// \param type                 设置类型.
/// \param category             设置种类.
/// \param item                 设置项目.
/// \param target[4]            根据发送 / 接收的设定,可能需要进行相应的指定。无需设定时,指定为 0。
/// \param pdata                设置数据.
/// \param datasize             设置数据的长度.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_setsetting(unsigned int ldeviceid, int depth, int type, int category, int item, int target[4], void *pdata, int datasize);


///
/// \brief sr7if_getsetting     参数设定.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param type                 获取类型.
/// \param category             获取种类.
/// \param item                 获取项目.
/// \param target[4]            根据发送 / 接收的设定,可能需要进行相应的指定。无需设定时,指定为 0。
/// \param pdata                获取的数据.
/// \param datasize             获取数据的长度.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getsetting(unsigned int ldeviceid, int type, int category, int item, int target[4], void *pdata, int datasize);
///
/// \brief sr7if_exportparameters   将系统参数导出,注意只导出当前任务的参数.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param size                 返回参数表的大小.
/// \return
///     null:                   失败.
///     其他:                    成功.
///
sr7_if_api const char *sr7if_exportparameters(unsigned int ldeviceid, unsigned int *size);

///
/// \brief sr7if_loadparameters   将导出的参数导入到系统中.
/// \param ldeviceid            设备id号,范围为0-3.
/// \param psettingdata         导入参数表指针.
/// \param size                 导入参数表的大小.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_loadparameters(unsigned int ldeviceid, const char *psettingdata, unsigned int size);

///
/// \brief sr7if_getlicensekey   返回产品剩余天数
/// \param remainday            返回剩余天数
/// \return
///     < 0:                     失败,参数错误或产品未注册
///     >=0:                     成功.
///
sr7_if_api int sr7if_getlicensekey(unsigned int ldeviceid, unsigned short *remainday);

///
/// \brief sr7if_getcurrentencoder   读取当前编码器值
/// \param value                    返回编码器值
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getcurrentencoder(unsigned int ldeviceid, unsigned int *value);


///
/// \brief sr7if_getcameratemperature   读取相机温度,单位0.01摄氏度
/// \param tempa                        相机a温度值
/// \param tempb                        相机b温度值
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_getcameratemperature(unsigned int ldeviceid, unsigned int *tempa, unsigned int *tempb);


//
typedef struct {
    int xpoints;                //x方向数据数量
    int batchpoints;            //批处理数量
    unsigned int batchtimes;    //批处理次数

    double xpixth;              //x方向点间距
    unsigned int startencoder;  //批处理开始编码器值
    int headnumber;             //相机头数量
    int returnstatus;           //sr7if_ok:正常批处理
                                //sr7if_normal_stop
                                //sr7if_error_abort
                                //sr7if_error_closed
} sr7if_str_callback_info;
///
/// \brief sr7if_setbatchonetimedatahandler   设置回调函数,建议获取数据后另外开启线程进行处理(获取数据模式:批处理一次回调一次)
/// \param ldeviceid            设备id号,范围为0-3.
/// \param callfunc             回调函数.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_setbatchonetimedatahandler(unsigned int ldeviceid, sr7if_batchonetimecallback callfunc);

///
/// \brief sr7if_startmeasurewithcallback   开始批处理(获取数据模式:批处理一次回调一次)
/// \param ldeviceid            设备id号,范围为0-3.
/// \param immediatebatch       0:立即开始批处理  1:等待外部开始批处理.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_startmeasurewithcallback(int ideviceid, int immediatebatch);

///
/// \brief sr7if_triggeronebatch   批处理软件触发开始(获取数据模式:批处理一次回调一次)
/// \param ldeviceid            设备id号,范围为0-3.
/// \return
///     <0:                     失败.
///     =0:                     成功.
///
sr7_if_api int sr7if_triggeronebatch(int ideviceid);

///
/// \brief sr7if_getbatchprofilepoint   批处理轮廓获取(获取数据模式:批处理一次回调一次)
/// \param ldeviceid            设备id号,范围为0-3.
/// \param head                 0:相机头a  1:相机头b
/// \return
///     !=null:                 返回数据指针
///     =null:                  失败,无数据或者相应头不存在.
///
sr7_if_api const int *sr7if_getbatchprofilepoint(const sr7if_data *dataindex, int head);

///
/// \brief sr7if_getbatchintensitypoint   批处理亮度获取(获取数据模式:批处理一次回调一次)
/// \param ldeviceid            设备id号,范围为0-3.
/// \param head                 0:相机头a  1:相机头b
/// \return
///     !=null:                 返回数据指针
///     =null:                  失败,无数据或者相应头不存在.
///
sr7_if_api const unsigned char *sr7if_getbatchintensitypoint(const sr7if_data *dataindex, int head);

///
/// \brief sr7if_getbatchencoderpoint   批处理编码器获取(获取数据模式:批处理一次回调一次)
/// \param ldeviceid            设备id号,范围为0-3.
/// \param head                 0:相机头a  1:相机头b
/// \return
///     !=null:                 返回数据指针
///     =null:                  失败,无数据或者相应头不存在.
///
sr7_if_api const unsigned int *sr7if_getbatchencoderpoint(const sr7if_data *dataindex, int head);


#ifdef __cplusplus
}
#endif
#endif //sr7link__h

2.3 使用流程

阻塞方式获取数据

2.4 qt中编程

设计简易界面

pro文件链接sdk

sr_third_party_path = $$pwd/3rdparty/sr_sdkdll

# sr7link
win32 {
    config(release, debug|release) {
        libs += -l$$sr_third_party_path/x64/ -lsr7link
    }else {
        libs += -l$$sr_third_party_path/x64/ -lsr7link
    }
}

includepath += $$sr_third_party_path/include
dependpath  += $$sr_third_party_path/include

调用代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"

const int device_id = 0;

mainwindow::mainwindow(qwidget *parent) :
    qmainwindow(parent),
    ui(new ui::mainwindow)
{
    ui->setupui(this);
    sr7if_ethernet_config srethernetconfig;
    srethernetconfig.abyipaddress[0] = 192;
    srethernetconfig.abyipaddress[1] = 168;
    srethernetconfig.abyipaddress[2] = 0;
    srethernetconfig.abyipaddress[3] = 10;
    int ret = sr7if_ethernetopen(device_id, &srethernetconfig);
    ui->textbrowser->append(tr("sr7if_ethernetopen ret:%1").arg(ret));
}

mainwindow::~mainwindow()
{
    int ret = sr7if_commclose(device_id);
    ui->textbrowser->append(tr("sr7if_commclose ret:%1").arg(ret));
    delete ui;
}

void mainwindow::on_btnstartmeasure_clicked()
{
    int ret = sr7if_startmeasure(device_id, 50 * 1000);
    ui->textbrowser->append(tr("sr7if_startmeasure ret:%1").arg(ret));
}

void mainwindow::on_btnreceivedata_clicked()
{
    int ret = sr7if_receivedata(device_id, dataobject);
    ui->textbrowser->append(tr("sr7if_receivedata ret:%1").arg(ret));
}

void mainwindow::on_btngetdata_clicked()
{
    int batchpoint = sr7if_profilepointcount(device_id, dataobject);
    int m_datawidth = sr7if_profiledatawidth(device_id, dataobject);
    ui->textbrowser->append(tr("batchpoint:%1 datawidth:%2").arg(batchpoint).arg(m_datawidth));

    int *heightdata = new int[batchpoint * m_datawidth];
    int ret =  sr7if_getprofiledata(device_id, dataobject, heightdata);
    ui->textbrowser->append(tr("sr7if_getprofiledata ret:%1").arg(ret));

    unsigned char *graydata = new unsigned char[batchpoint * m_datawidth];
    ret =  sr7if_getintensitydata(device_id, dataobject, graydata);
    ui->textbrowser->append(tr("sr7if_getintensitydata ret:%1").arg(ret));

    unsigned int *encoder = new unsigned int[batchpoint];
    ret =  sr7if_getencoder(device_id, dataobject, encoder);
    ui->textbrowser->append(tr("sr7if_getencoder ret:%1").arg(ret));

    cv::mat graymat = cv::mat(batchpoint, m_datawidth, cv_8uc1, graydata);
    cv::imwrite("graymat.bmp", graymat);
//    cv::flip(graymat, graymat, 0);

    delete[] heightdata;
    delete[] graydata;
    delete[] encoder;
}

void mainwindow::on_btnstopmeasure_clicked()
{
    int ret = sr7if_stopmeasure(device_id);
}

(0)

相关文章:

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

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com