/*
* Header: VZNL_Detect3DObject.h
* Description:当前文件为伟景智能(Vizum)所研发的EyeCB板提供设置检测函数的接口。
*
* Author: Mjw
* Date: 2018/08/28
*/
#ifndef __VIZUM_DETECTED_3DOBJ_HEADER__
#define __VIZUM_DETECTED_3DOBJ_HEADER__
#include "VZNL_Export.h"
#include "VZNL_Types.h"
/**
* @brief 获取自动检测结果
* @param [out] p3DPoint 3D数据
* @param [out] p2DPoint 2D数据
* @param [out] nCount 数据个数
* @param [out] nTimeStamp 时间戳
* @param [out] dTotleOffset 总偏移
* @param [out] dStep 单次偏移
* @param [out] pLeftImage 左图
* @param [out] pRightImage 右图
* @param [out] pParam 回调参数
*/
typedef int(*VzNL_Output3DObjectResultCB)(SVzNL3DObjectDesc* p3DObjDesc, SVzNL3DObject2DResult* p2DObjDesc, int nObjCount, void* pParam);
/// @brief
/// 开始检测3D物体
/// [in]设备句柄
VZNLAPI int VzNL_BeginDetect3DObject(VZNLHANDLE hDevice);
/// @brief
/// 设置检测距离
/// [in]设备句柄
/// [in]设备句柄
/// [in]最小距离
/// [in]最大距离
/// @return 返回0为正确,失败返回错误码
VZNLAPI int VzNL_ConfigDetect3DObjectDistance(VZNLHANDLE hDevice, int nMin_mm, int nMax_mm);
/// @brief
/// 设置检测阈值
/// [in]设备句柄
/// [in]最小误差mm
/// [in]最大误差
/// [in]误差百分百
VZNLAPI int VzNL_ConfigDetect3DObjectThres(VZNLHANDLE hDevice, double dMinTh, double dMaxTh, double dPercent);
/// @brief
/// 设置最小检测边数
/// [in]设备句柄
/// [in]设置最小边数
VZNLAPI int VzNL_ConfigDetect3DObjectMinEdges(VZNLHANDLE hDevice, int nSideCount);
/// @brief
/// 设置检测物体模型
/// [in]设备句柄
/// [in]要检测的3D模型数据
/// @return 返回0为正确
VZNLAPI int VZNL_SetDetectObject(VZNLHANDLE hDevice, SVzNL3DObjectDesc* p3DObjectDesc, int nObjectCount);
/// @brief
/// 检测一个立体的物体
/// [in]设备句柄
/// @return 检测成功返回0
VZNLAPI int VzNL_Detect3DObject(VZNLHANDLE hDevice);
/// @brief
/// 获取检测到的物体。
/// [in]设备句柄
/// @return 返回结果个数
VZNLAPI int VzNL_Get3DObjectResultCount(VZNLHANDLE hDevice);
/// @brief
/// 获取模型数据点
/// [in]设备句柄
/// [in]结果索引
/// [out]3D结果数据
/// @reutrn 错误码,0为成功
VZNLAPI int VzNL_Get3DObject3DResult(VZNLHANDLE hDevice, int nResultIdx, SVzNL3DObjectDesc** pp3DObjDesc);
/// @brief
/// 获取模型数据点
/// [in]设备句柄
/// [in]结果索引
/// [out]2D结果数据
/// @reutrn 错误码,0为成功
VZNLAPI int VzNL_Get3DObject2DResult(VZNLHANDLE hDevice, int nResultIdx, SVzNL3DObject2DResult** pp2DObjDesc);
/// @brief
/// 释放3d结果
VZNLAPI int VzNL_Release3DObject3DResult(SVzNL3DObjectDesc** pp3DObjDesc);
/// @brief
/// 释放2d结果
VZNLAPI int VzNL_Release3DObject2DResult(SVzNL3DObject2DResult** pp2DObjDesc);
/// @brief
/// 获取模型数据的抓取点。
/// [in]设备句柄
/// [in]结果索引
/// [out]三维抓取点
/// @reutrn 错误码,0为成功
VZNLAPI int VzNL_Get3DObjectResultGrabPoint(VZNLHANDLE hDevice, int nResultIdx, SVzNL3DPoint* p3DGrabPoint);
/// @brief
/// 获取检测的线条2D结果
/// [in]设备句柄
/// [out]2D线,内存空间由用户分配
/// [in/out]传入:用户分配的SVzNL2DLineResult的结构个数;传出:用户需要分配多少个SVzNL2DLineResult
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_Get3DObjectLine2DResult(VZNLHANDLE hDevice, SVzNL2DLineResult* p2DLine, int* pnCount);
/// @brief
/// 获取检测的线条3D结果
/// [in]设备句柄
/// [out]3D线,内存空间由用户分配
/// [in/out]传入:用户分配的SVzNL3DLineResult的结构个数;传出:用户需要分配多少个SVzNL3DLineResult
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_Get3DObjectLine3DResult(VZNLHANDLE hDevice, SVzNL3DLineResult* p3DLine, int* pnCount);
/// @brief
/// 连续检测3D模型数据
/// [in]设备句柄
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_StartAutoDetect3DObject(VZNLHANDLE hDevice, VzNL_Output3DObjectResultCB pResultCB, void* pParam);
VZNLAPI int VzNL_StopAutoDetect3DObject(VZNLHANDLE hDevice);
/// @brief
/// 结束检测3D物体
/// [in]设备句柄
/// @return 错误码,0为成功
VZNLAPI int VzNL_EndDetect3DObject(VZNLHANDLE hDevice);
#endif //__VIZUM_DETECTED_3DOBJ_HEADER__