/* * Header: VZNL_Graphics.h * Description:当前文件为伟景智能(Vizum)所研发的EyeCB板提供检测函数接口。 * * Sample: * VzNL_BeginDetectLaser(); * * VzNL_SetLaserStandard(); * * VzNL_EndDetectLaser(); * Author: Mjw * Date: 2018/08/28 */ #ifndef __VIZUM_DETECTED_LASER_HEADER__ #define __VIZUM_DETECTED_LASER_HEADER__ #include "VZNL_Export.h" #include "VZNL_Types.h" /** * @brief 开始激光检测 * @param [in] hDevice 设备句柄 * @return 返回0表示正确 * @retval 0 表示成功 * @retval 非0 表示失败,可以使用VzNL_GetErrorInfo获取 */ VZNLAPI int VzNL_BeginDetectLaser(VZNLHANDLE hDevice); /** * @brief 设置激光门限值(只支持EyeCB和星光眼) * @param [in] hDevice 设备句柄 * @param [in] nLaserThres 激光门限值[Range:1~255] * @return 返回0表示正确 * @retval 0 表示成功 * @retval 非0 表示失败,可以使用VzNL_GetErrorInfo获取 */ VZNLAPI int VzNL_SetLaserThres(VZNLHANDLE hDevice, int nLaserThres); VZNLAPI int VzNL_GetLaserThres(VZNLHANDLE hDevice, int* pnLaserThres); /** * @brief 设置激光标定。 * @param [in] hDevice 设备句柄 * @param [in] dStandardObjectHeight 设置标定高度 * @param [in] pTopROI 顶部ROI数组指针 * @param [in] nTopROICount 顶部ROI的数组个数 * @param [in] pBottomROI 底部ROI数组指针 * @param [in] nBottomROICount 底部ROI数组个数 * @return 返回0为正确,失败返回错误码 */ VZNLAPI int VzNL_SetLaserStandard(VZNLHANDLE hDevice, double dStandardObjectHeight, const SVzNLROIRect* pTopROI, const int nTopROICount, const SVzNLROIRect* pBottomROI, const int nBottomROICount); /** * @brief 清除标定信息。 * @param [in] hDevice 设备句柄 * @return 返回0为正确,失败返回错误码 */ VZNLAPI int VzNL_ClearLaserStandard(VZNLHANDLE hDevice); /** * @brief 激光检测 * @param [in] hDevice 设备句柄 * @param [in] nPointInterval 点的间隔 * @return 返回0为正确,失败返回错误码 */ VZNLAPI int VzNL_DetectLaser(VZNLHANDLE hDevice, int nPointInterval); /** * @brief 获取激光线结果点的个数 * @param [in] hDevice 设备句柄 * @return 返回点的个数 */ VZNLAPI int VzNL_GetLaserResultPointCount(VZNLHANDLE hDevice); /// @brief /// 获取激光线2D结果 /// [in]设备句柄 /// [out]2D点,内存空间由用户分配 /// [in/out]传入:用户分配的SVzNL2DPoint的结构个数;传出:用户需要分配多少个SVzNL2DPoint /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_GetLaser2DResult(VZNLHANDLE hDevice, SVzNL2DPosition* p2DPoint, int* pnCount); /// @brief /// 获取激光线3D结果 /// [in]设备句柄 /// [out]3D点,内存空间由用户分配 /// [in/out]传入:用户分配的SVzNL3DPosition的结构个数;传出:用户需要分配多少个SVzNL3DPosition /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_GetLaser3DResult(VZNLHANDLE hDevice, SVzNL3DPosition* p3DPoint, int* pnCount); /// @brief /// 获取结果图像 /// [in]设备句柄 /// [in]图像数据 VZNLAPI int VzNL_GetLaserImageResult(VZNLHANDLE hDevice, SVzNLImageData** ppLeftImageData, SVzNLImageData** ppRightImageData); /// @brief /// 检测激光凹槽数据 /// [in]设备句柄 /// [in]最小凹槽深度 /// @return 返回0为正确,失败返回错误码 VZNLAPI int VzNL_SetLaserMinSlotDeep(VZNLHANDLE hDevice, double dMinSlotDeep); /// @brief /// 获取激光凹槽数据结果的波峰点的个数 /// [in]设备句柄 VZNLAPI int VzNL_GetLaserSlotResultPeakPonitCount(VZNLHANDLE hDevice); /// @brief /// 获取激光凹槽数据结果的波谷点的个数 /// [in]设备句柄 VZNLAPI int VzNL_GetLaserSlotResultValleyPonitCount(VZNLHANDLE hDevice); /// @brief /// 获取激光凹槽2D结果 /// [in]设备句柄 /// [out]波峰点,内存空间由用户分配 /// [in/out]传入:用户分配的SVzNL2DPoint的结构个数;传出:用户需要分配多少个SVzNL2DPoint /// [out]波谷点,内存空间由用户分配 /// [in/out]传入:用户分配的SVzNL2DPoint的结构个数;传出:用户需要分配多少个SVzNL2DPoint /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_GetLaserSlot2DResult(VZNLHANDLE hDevice, SVzNL2DPosition* pPeakPoint, int* pnPeakPointCount, SVzNL2DPosition* pValleyPoint, int* pnValleyPointCount); /// @brief /// 获取激光凹槽3D结果 /// [in]设备句柄 /// [out]波峰点,内存空间由用户分配 /// [in/out]传入:用户分配的SVzNL3DPoint的结构个数;传出:用户需要分配多少个SVzNL3DPoint /// [out]波谷点,内存空间由用户分配 /// [in/out]传入:用户分配的SVzNL3DPoint的结构个数;传出:用户需要分配多少个SVzNL3DPoint /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_GetLaserSlot3DResult(VZNLHANDLE hDevice, SVzNL3DPosition* pPeakPoint, int* pnPeakPointCount, SVzNL3DPosition* pValleyPoint, int* pnValleyPointCount); /// @brief /// 启动自动检测,并且返回激光线 /// [in]设备句柄 /// [in]激光线方向,keFlipType_Vertical垂直翻转 /// [in]回调函数 /// [in]回调函数参数 /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_StartAutoDetect(VZNLHANDLE hDevice, EVzFlipType eFlipType, VzNL_GetAutoDetectResultCB pCB, void* pCBParam); VZNLAPI int VzNL_StartAutoDetectEx(VZNLHANDLE hDevice, EVzResultDataType eResultType, EVzFlipType eFlipType, VzNL_AutoOutputLaserLineExCB pCB, void* pCBParam); VZNLAPI int VzNL_StopAutoDetect(VZNLHANDLE hDevice); /// @brief /// 是否在自动检测中 VZNLAPI VzBool VzNL_IsAutoDetecting(VZNLHANDLE hDevice, int* pnErrorCode); /// @brief /// 获取扫描后的RGB原图(见说明书3.5.31) /// [in]设备 /// [out]输出RGB图像,需要用户调用VzNL_ReleaseImage进行数据释放 /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_GetAutoDetectResultSurface(VZNLHANDLE hDevice, SVzNLImageData** ppResultImage); /// @brief /// 设置过滤高度 /// [in]设备 /// [in]过滤高度(未高度标定时,大于此高度的数据不输出,高度标定后,小于此数据的高度不输出) /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_ConfigLaserLineFilterHeight(VZNLHANDLE hDevice, double dFilterHeight); /// @brief /// 获取过滤高度 /// [in]设备 /// [out]过滤高度 /// @return 成功返回0,失败返回错误码。 VZNLAPI int VzNL_GetLaserLineFilterHeight(VZNLHANDLE hDevice, double* pdFilterHeight); /// @brief /// 配置激光线过滤范围 /// [in]设备 /// [in]过滤类型 /// [in]过滤范围 /// @return 成功返回0,失败返回错误码 VZNLAPI int VzNL_SetLaserLineFilterRange(VZNLHANDLE hDevice, EVzLaserPointFilterType eFilterType, double dRange[2]); /// @brief /// 获取激光线过滤范围 /// [in]设备 /// [in]过滤类型 /// [in]过滤范围 /// @return 成功返回0,失败返回错误码 VZNLAPI int VzNL_GetLaserLineFilterRange(VZNLHANDLE hDevice, EVzLaserPointFilterType eFilterType, double dRange[2]); /// @brief /// 启用/禁用激光过滤 /// [in]设备 /// [in]过滤类型 /// [in]过滤范围 /// @return 成功返回0,失败返回错误码 VZNLAPI int VzNL_EnableLaserLineFilter(VZNLHANDLE hDevice, EVzLaserPointFilterType eFilterType, VzBool bEnable); /// @brief /// 是否启用激光过滤 /// [in]设备 /// [out]错误码 /// @return 启用返回VzTrue,未启用返回VzFalse VZNLAPI VzBool VzNL_IsEnableLaserLineFilter(VZNLHANDLE hDevice, EVzLaserPointFilterType eFilterType, int* pnErrorCode); /// @brief /// 启用/禁用过滤高度 /// [in]设备 /// [in]启用过滤高度 /// @return 成功返回0,失败返回错误码 VZNLAPI int VzNL_EnableLaserLineFilterHeight(VZNLHANDLE hDevice, VzBool bEnable); /// @brief /// 是否启用过滤高度 /// [in]设备 /// [out]错误码 /// @return 启用返回VzTrue,未启用返回VzFalse VZNLAPI VzBool VzNL_IsEnableLaserLineFilterHeight(VZNLHANDLE hDevice, int* pnErrorCode); /// @brief /// 设置杂点过滤阈值 /// [in]设备句柄 /// [in]过滤值 VZNLAPI int VzNL_ConfigLaserLineMaxDeviation(VZNLHANDLE hDevice, double dMaxDeviation); /// @brief /// 设置偏移量 /// [in]设备句柄 /// [in]偏移量 VZNLAPI int VzNL_ConfigLaserBeginOffsetValue(VZNLHANDLE hDevice, double dOffsetValue); /** * @brief 眼睛是否标定过 * @param [in] hDevice 设备句柄 * @param [in] pErrorCode ErrorCode * @return 如果标定过返回VzTrue */ VZNLAPI VzBool VzNL_LaserIsCalibration(VZNLHANDLE hDevice, int* pErrorCode); /** * @brief 设置点云处理模式 * @param [in] hDevice 设备句柄 * @param [in] ePointCloudProcMode kePointCloudProcMode_Speed 速度计算模式, kePointCloudProcMode_Encoder 编码器模式 kePointCloudProcMode_FixedStep 固定步长模式 * @return 成功返回0,否则为其他错误码 * Old Interface int VzNL_EnableLaserRollerMode(VZNLHANDLE hDevice, VzBool bEnable); */ VZNLAPI int VzNL_SetPointCloudProcMode(VZNLHANDLE hDevice, EVzPointCloudProcMode ePointCloudProcMode); VZNLAPI int VzNL_GetPointCloudProcMode(VZNLHANDLE hDevice, EVzPointCloudProcMode* pePointCloudProcMode); /** @brief 设置物体运动方向 * [in]设备句柄 * [in]运行方向[keObjRunDirect_Plus:偏移递增 keObjRunDirect_Minus:偏移递减] * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserObjRunDirection(VZNLHANDLE hDevice, EVzObjRunDirect eDirect); VZNLAPI int VzNL_GetLaserObjRunDirection(VZNLHANDLE hDevice, EVzObjRunDirect* peDirect); /** @brief 设置传送带速度值 * 需要配置 VzNL_SetPointCloudProcMode(hDevice, kePointCloudProcMode_Speed) 速度计算模式 * [in]设备句柄 * [in]速度 * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_ConfigLaserObjRunSpeedValue(VZNLHANDLE hDevice, double dSpeed); VZNLAPI int VzNL_GetLaserObjRunSpeedValue(VZNLHANDLE hDevice, double* pdSpeed); /** * @brief 设置固定步长 * @detail 需要配置 VzNL_SetPointCloudProcMode(hDevice, kePointCloudProcMode_FixedStep) 固定步长计算模式 * @param [in] hDevice 设备句柄 * @param [in] dStep * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserLineFixedStep(VZNLHANDLE hDevice, double dStep); VZNLAPI int VzNL_GetLaserLineFixedStep(VZNLHANDLE hDevice, double* pdStep); /* * @brief 设置/获取编码器参数类型 * @detail 需要配置 VzNL_SetPointCloudProcMode(hDevice, kePointCloudProcMode_Encoder) 编码器计算模式 * @param[in] hDevice 设备句柄 * @param[in] eParamType 编码器参数类型 * 使用 编码器分辨率 + 编码器半径参数 时配置 keEncodeParamType_RollerResolution * 使用 编码器每两个脉冲的间距 时配置 keEncodeParamType_DistancePerPulse * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserEncoderParamType(VZNLHANDLE hDevice, EVzEncodeParamType eParamType); VZNLAPI int VzNL_GetLaserEncoderParamType(VZNLHANDLE hDevice, EVzEncodeParamType* peParamType); /** * @brief 配置转动轴半径 * @detail 需要配置 VzNL_SetPointCloudProcMode(hDevice, kePointCloudProcMode_Encoder) 编码器计算模式 * 需要配置 VzNL_SetLaserEncoderParamType(hDevice, keEncodeParamType_RollerResolution) 参数使用模式 * @param [in] hDevice 设备句柄 * @param [in] dRadius 转动轴半径 * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_ConfigLaserRollerRadius(VZNLHANDLE hDevice, double dRadius); VZNLAPI int VzNL_GetLaserRollerRadius(VZNLHANDLE hDevice, double* pdRadius); /** * @brief 设置编码器脉冲精度 * @detail 需要配置 VzNL_SetPointCloudProcMode(hDevice, kePointCloudProcMode_Encoder) 编码器计算模式 * 需要配置 VzNL_SetLaserEncoderParamType(hDevice, keEncodeParamType_RollerResolution) 参数使用模式 * @param [in] hDevice 设备句柄 * @param [in] nPulsePerRound 脉冲个数 * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserEncoderResolution(VZNLHANDLE hDevice, unsigned int nPulsePerRound); VZNLAPI int VzNL_GetLaserEncoderResolution(VZNLHANDLE hDevice, unsigned int* pnPulsePerRound); /** * @brief 配置编码器间距 * @detail 需要配置 VzNL_SetPointCloudProcMode(hDevice, kePointCloudProcMode_Encoder) 编码器计算模式 * 需要配置 VzNL_SetLaserEncoderParamType(hDevice, keEncodeParamType_DistancePerPulse) 参数使用模式 * @param [in] hDevice 设备句柄 * @param [in] dDistancePerPulse 编码器间距 * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserEncoderDistancePerPulse(VZNLHANDLE hDevice, double dDistancePerPulse); VZNLAPI int VzNL_GetLaserEncoderDistancePerPulse(VZNLHANDLE hDevice, double* pdDistancePerPulse); /** * @brief 设置数据采集间隔 * @param [in] hDevice 设备句柄 * @param [in] nCaptureInterval 采集间隔 * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserCaptureInterval(VZNLHANDLE hDevice, unsigned int nCaptureInterval); VZNLAPI int VzNL_GetLaserCaptureInterval(VZNLHANDLE hDevice, unsigned int* pnCaptureInterval); /** * @brief 计算平均高度/最低高度/最高高度 * @param [in] p3DPoint 3D点【Array】 * @param [in] nCount 点个数 * @param [out] pdAvgHeight 平均高度 * @param [out] pdMinHeight 最小高度 * @param [out] pdMaxHeight 最大高度 * @return 成功返回0,否则为其他错误码 */ VZNLAPI void VzNL_CalcLaserZHeight(SVzNL3DPosition* p3DPoint, int nCount, double* pdAvgHeight, double* pdMinHeight, double* pdMaxHeight); /** * @brief 激光检测填充点模式 * @param [in] hDevice 设备句柄 * @param [in] bFillPoint VzTrue为填充,VzFalse为不填充(默认为VzFalse) * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_EnableFillLaserPoint(VZNLHANDLE hDevice, VzBool bFillPoint); VZNLAPI int VzNL_IsEnableFillLaserPoint(VZNLHANDLE hDevice, VzBool* pbFillPoint); /** * @brief 设置数据扫描长度,当扫描达到指定长度后,自动停止扫描。 * @param [in] hDevice 设备句柄 * @param [in] nDistance 扫描长度,单位毫米(mm) * @return 成功返回0,否则为其他错误码 */ VZNLAPI int VzNL_SetLaserCaptureDistance(VZNLHANDLE hDevice, double dDistance); VZNLAPI int VzNL_GetLaserCaptureDistance(VZNLHANDLE hDevice, double* dnDistance); /** * @brief 结束激光检测 * @param [in] hDevice 设备句柄 * @return 返回点的个数 */ VZNLAPI void VzNL_EndDetectLaser(VZNLHANDLE hDevice); #endif //__VIZUM_DETECTED_LASER_HEADER__