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

news2024/11/26 4:24:41

一、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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

08-什么是类加载器,类加载器有哪些, 双亲委派模型机制?

1.类加载器 1.实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。 2.虚拟机设计团队把加载动作放到 JVM 外部实现&#xff0c;以便让应用程序决定如何获取所需的类。 3.类加载器虽然只用于实现类的加载动作&#xff0c;但是对于任意一个类&#xff0c;都需要…

ES索引规划方案

ES索引规划方案 1.引言 《ES索引规划方案》是研发部门针对审计系统需求&#xff0c;对海量日志数据进行实时存储和查询的解决方案&#xff0c;经过不断完善整理成册&#xff0c;以供后续相关开发人员学习使用 1.1.术语 序号用语说明1时序索引以时间为轴&#xff0c;数据只有…

Blender里的三种绑定 (二)约束

文章目录Blender里的三种绑定.约束.变换约束.复制位置.复制旋转.复制缩放.限定距离.限定位置&#xff0c;限定旋转&#xff0c;限定缩放.维持体积.变换.追踪约束.钳制到.阻尼追踪.锁定追踪.拉伸到.标准跟随.关系约束.动作.骨架.子级.基面.跟随路径.轴心.缩裹.Blender里的三种绑…

ViT(Version Transformer)原始论文解读

An Image is Worth 16x16 Words Transformers for Image Recognition at Scale paper&#xff1a;2010.11929.pdf (arxiv.org) code&#xff1a;google-research/vision_transformer (github.com) 期刊/会议&#xff1a;ICLR 2020 摘要 虽然Transformer体系结构已经成为自然…

【保姆级】@PostConstruct @PreDestroy使用示例

简介PostConstruct & PreDestroy被PostConstruct注解修饰的方法会在服务器加载Servlet的时候运行&#xff0c;并且只会被服务器调用一次&#xff0c;类似于Servlet的init()方法&#xff0c;被PostConstruct注解修饰的方法会在构造函数之后&#xff0c;init()方法执行之前执…

群晖NAS搭建portainer

参考&#xff1a; 群晖、威联通、Linux最强docker管理工具portainer安装及汉化教程2022最新版本 Portainer官方文档 How to run Docker commands without sudo on a Synology NAS 因为群晖的NAS是基于linux但是限制很多的系统&#xff0c;有一些东西通过命令行操作可能会遇到权…

Git 常见错误 之 fatal: Authentication failed 简单解决方法

Git 常见错误 之 fatal: Authentication failed 简单解决方法 目录 Git 常见错误 之 fatal: Authentication failed 简单解决方法 一、简单介绍 二、问题现象 三、解决方法 1、修改全局配置用户名 和 邮箱 2、修改凭证(具体问题具体分析) 一、简单介绍 Git(读音为/gɪt…

系分 - 案例分析 - 需求分析

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - 案例分析 - 需求分析结构化分析SA数据流图DFD答题技巧典型例题题目描述参考答案面向对象的分析OOA用例图用例模型细化用例描述用例关系【包含、扩展、泛化】分析模型定义概念类确定类之间的关系类图…

拉伯证券|LPR利率三连降 全国首套房贷利率今年或“奔三”

2022年LPR接连下调。新年伊始&#xff0c;“房贷一族”迎来好消息&#xff0c;一年一度存量房贷利率重定价的日子到了。关于房贷利率挂钩借款商场报价利率(LPR)、重定价日为每年1月1日的住宅顾客&#xff0c;本年的房贷利率将迎来下降。不仅如此&#xff0c;存量公积金借款也于…

Flink实时计算引擎入门教程

Flink实时计算引擎入门教程 1.简介 Fink是一个开源的分布式,高性能,高可用,准确的实时数据计算框架&#xff0c;它主要优点如下: 流式计算: Fink可以连接处理流式(实时)数据。 容错: Fink提供了有状态的计算,会记录任务的中间状态,当执行失败时可以实现故障恢复。 可伸缩: F…

【软件测试】关于BUG的那些点点滴滴

关于BUG1. 如何合理的创建Bug1.1 创建Bug的要素2. Bug 的级别3. Bug 的生命周期3.1 Bug的状态3.2 Bug的生命周期4. 提出Bug后&#xff0c;跟开发产生争执怎么办1. 如何合理的创建Bug 1.1 创建Bug的要素 问题的版本&#xff0c;如浏览器的版本问题的环境&#xff0c;如windows…

融合注意力模块CBAM基于轻量级yolov5n开发共享单车目标检测系统

在很多的项目实战中验证分析注意力机制的加入对于模型最终性能的提升发挥着积极正向的作用&#xff0c;在我之前的一些文章里面也做过了一些尝试&#xff0c;这里主要是想基于轻量级的n系列模型来开发构建共享单车检测系统&#xff0c;在模型中加入CBAM模块&#xff0c;以期在轻…

web自动化测试---使用java+selenium+Junit

目录 1.什么是自动化以及为什么要进行自动化 2.为什么选择selenium作为web自动化工具 3.selenium环境部署 4.什么是驱动以及驱动的原理 5.selenium的基础语法和操作 5.1定位元素 5.2元素的操作 5.3等待 5.4信息打印 5.5窗口 5.6导航 5.7弹窗 5.8鼠标、键盘操作 5.…

Python + Appium 自动化操作微信入门

Appium 是一个开源的自动化测试工具&#xff0c;支持 Android、iOS 平台上的原生应用&#xff0c;支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium&#xff0c;能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令&#xff0c;…

虚拟化技术

虚拟化 虚拟化技术 目前虚拟化技术有软件模拟、全虚拟化&#xff08;使用二进制翻译&#xff09;、半虚拟化&#xff08;操作系统辅助&#xff09;、硬件辅助虚拟化和容器虚拟化这几种。 &#xff08;1&#xff09;软件虚拟化 软件模拟是通过软件完全模拟cpu、芯片组、磁盘、…

Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

参考链接&#xff1a;https://blog.csdn.net/xiaobai_20190815/article/details/124045768 http://news.558idc.com/290335.html Java 安全-手把手教你SPEL表达式注入_4ct10n的博客-CSDN博客_spel注入 一、漏洞描述 Spring Cloud Gateway 是基于 Spring Framework 和 Spring…

组学新品|“4K”微生态之肠道菌群深度宏基因组

1.“4K”微生态定义 人体微生物群是人体内部与体表所有微生物有机体的总称[1]&#xff0c;其组成包括非细胞结构的病毒&#xff08;包括噬菌体&#xff09;、原核生物中的真细菌和古细菌&#xff0c;以及真核细胞微生物。与之对应&#xff0c;微生物群可以分为病毒群、细菌群、…

Redis未授权访问漏洞(二)Webshell提权篇

前言 在学习这篇文章之前&#xff0c;请先通过这篇文章Redis未授权访问漏洞(一)先导篇学习一下基础知识&#xff0c;再来学习这篇文章。 webshell提权 环境准备 攻击机&#xff1a; Centos7 IP:192.168.44.130 靶机&#xff1a;Centos7 IP:192.168.44.129 首先我们需要准备好…

QuartzNet的基本使用,Scheduler,Job,Trigger的应用

Quartz.Net的基本使用方法 Quartz.Net的基本使用是比较简单的&#xff0c;主要是对下面三个工具的创建和使用。 Scheduler调度器Job执行的动作Trigger触发器 Scheduler的创建和使用 scheduler的创建有几种不同的方式,但一般可以直接使用其提供的工厂类直接创建 通过工厂类…

分享92个NET源码,总有一款适合您

NET源码 分享92个NET源码&#xff0c;总有一款适合您 92个NET源码下载链接&#xff1a;https://pan.baidu.com/s/1Ya4GMXuHhNbqkLU5b7SPEw?pwd5vpx 提取码&#xff1a;5vpx 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&…