结构光传感器库函数(十七)
一、传感器初始化
1、设置摄像机参数
C++: LSHD6_SetCameraParameter(const uint32 cameraIndex, char cameraDataFileName[]);
载入配置文件(相对路径)
序号1-6+配置文件名
2、设置摄像机绝对路径
C++:LSHD6_SetCameraParameterAbsolutePath(constuint32 cameraIndex, char cameraDataFileName[]);
载入配置文件(绝对路径)
序列1-6+C:\\Laser\\配置文件名
3、设置配置文件路径
C++: LSHD6_SetSysFilePath(char filePath[]);
设置轮廓仪动态库及配置文件的文件路径(绝对路径)
注意:LSHD6_SetCameraParameter 之前调用该函数
二、相机初始化
1、初始化摄像头
C++:LSHD6_InitialCamera(const uint32 cameraIndex, const char* cameraSerialNumber, const HWND hWnd,const uint32 imgLeft, const uint32 imgTop, const uint32 imgWidth, const uint32 imgHeight,const double ExposureTime, const double AcquisitionFrameRate, const bool
SpeedOrPrecise, const uint32 TriggerMode);
相机初始化(带UI显示)
曝光时间:100~3000ms
帧速:1~400帧/秒
300mm量程一下一般200帧/秒,以上可400帧/秒
增益:100帧以下高精度false,高速设置为ture
触发模式:0:软件触发,1:IO低频率触发,2:编码器高速触发。
成功返回0
报错代码:
enum ERR_CODE_HD6{ HD6_ERRCODE_UNKNOWN = 1,//未知错误 HD6_ERRCODE_FINDNODEVICE = 2,//无设备可连接 HD6_ERRCODE_ALREADYBEUSED = 3,//设备已被占用 HD6_ERRCODE_DEVICEBUSY = 4,//设备工作中 HD6_ERRCODE_FRAMERATETOOHIGH = 5,//频率设置过高 HD6_ERRCODE_MISSDATAFILE = 6,//未找到轮廓仪配置文件 HD6_ERRCODE_MISSDLL = 7,//未找到动态库文件};
2、初始化摄像头不带UI
C++:LSHD6_InitialCameraWithoutUI(const uint32 cameraIndex, const char* cameraSerialNumber, const double ExposureTime, const double AcquisitionFrameRate, const bool SpeedOrPrecise, const uint32 TriggerMode);
设置传感器Bining 模式(合并相机相邻的两个像素,可以降低精度提高速度),如需此功能,必须在LSHD6_SetCameraParameter 之前调用,使用过程中不可修改
C++: LSHD6_LowSpeedGrab(const uint32 cameraIndex,double frequency);
内部软件触发方式进行连续取像,在LSHD6_SetshowUI 设置显示UI 的情况下一般帧速50 以下,否则会造成系统卡顿,不显示UI 时则可以根据需要提高
参数:编号+传感器低帧速(1~100帧/s)
C++: LSHD6_SetBatchProfileBuffer(const uint32 cameraIndex, int ProfileCnt);
申请批处理内存
参数:序号+轮廓个数(最大20000)
7、高速内部软件触发固定帧数扫描
C++: LSHD6_InnerTriggerHighSpeedScan(const uint32 cameraIndex, int snapNumber);
C++: LSHD6_EncoderTriggerHighSpeedScan(const uint32 cameraIndex, int snapNumber);
按照设定的帧数及输入的编码器信号执行高速扫描,扫描结束后执行一次数据回调,支持外置编码器,伺服差分信号等标准差分信号或上升沿脉冲信号。
9、高速内部软件触发连续扫描
C++: LSHD6_InnerTriggerHighSpeedConstantScan(const uint32 cameraIndex);
按照设定的频率连续扫描,200 帧以下可长时间工作,帧数更高时在
SetBatchProfileBuffer 申请的内存循环存满后自动停止。适合在提前不可预估轮廓数量或者要求高速采集过程中实时获取数据时使用,此方式扫描得到轮廓数据后不执行回调,可通过UDP 端口高速发送到目标UDP 端口。
10、编码器触发连续扫描
C++: LSHD6_EncoderTriggerHighSpeedConstantScan(const uint32 cameraIndex);
帧数在300以内,其余和9同。
11、停止取像
C++:LSHD6_Stop(const uint32 cameraIndex);
C++: LSHD6_SetshowUI(const uint32 cameraIndex,bool showUI,bool
showRawImageOrProfileCurve);
控制是否显示轮廓曲线或者原始图像,一般用来预览和调试时设置显示,正常运行时设置为不显示以降低资源消耗,提高帧率
13、设置单轮廓数据回调模式
C++: LSHD6_SetSingleCallBackMode(const uint32 cameraIndex, bool imageOrProfile);
设置单轮廓回调模式
参数:序号+单轮回调函数中获取原始图像数据(ture)
四、参数设置
1、曝光设置
C++:LSHD6_SetExposureTime(const uint32 cameraIndex, double value);
设置相机曝光时间
参数:序号+曝光时间(ms:100~300)
2、频率设置
C++:LSHD6_SetFrameRate(const uint32 cameraIndex, double value);
设置相机帧速,必须在相机停止取像状态下以及触发模式设置位软件触发时使用
参数:序号+相机帧速(1~400帧/秒)
300mm量程一下一般200帧/秒,以上可400帧/秒
3、增益设置
C++:LSHD6_SetGain(const uint32 cameraIndex, bool speedOrPrecise);
设置相机增益类型,较低增益需要更长的曝光时间,但获取的图像噪点可显著下降,有助于提高精度,较高增益可在更短的曝光时间内获取图像,但精度一般会有一定下降
参数:序号+ture(高增益)/false(低增益100帧以下)
4、相机ROI 设置
C++: LSHD6_SetCameraROI(const uint32 cameraIndex, const uint32 ROIleft, const uint32 ROItop, const uint32 ROIWidthSize, const uint32 ROIHeightSize,const uint32 imgLeft, const uint32 imgTop, const uint32 imgWidth, const uint32 imgHeight);
设置相机取像区域及显示区域,相机需要在初始化完成后,且在停止状态
参数:序号
+相机取像左上列坐标(0~1200,16 的倍数)
+左上行坐标(0~1024,1 的倍数)
+取像区域宽度(64~1200,16 的倍数)
+取像区域高度(1~1023,1 的倍数)
+(使用InitialCameraWithoutUI 以下四个参数不起作用)
+显示原始图像或轮廓曲线,在此处传入显示控件区域左上角行坐标(单位pixel)
+左上角列坐标(单位pixel)
+控件区域宽度(单位pixel)
+控件区域高度(单位pixel)
五、轮廓设置
1、提取轮廓设置
C++:LSHD6_SetRawImageThreshold(const uint32 cameraIndex, int threshold);
设置从原始图像提取轮廓像素坐标的亮度阈值
参数:序号+亮度阈值(10~250)
2、轮廓滤波设置
C++: LSHD6_SetFilter(const uint32 cameraIndex, int type, int SmoothNumber, int SmoothTimes,int MidNumber);
滤波
参数:序号
+滤波类型(0 不滤波,1 均值滤波,2 中值滤波,3 均值滤波+中值滤波)
+均值滤波值
+均值滤波次数
+中值滤波值
3、轮廓无效点设置
C++: LSHD6_SetCompansation(const uint32 cameraIndex,int type, int compansationCnt);
无效点填充
参数:序号
+补间类型,0 不补间,1 垂直补间,2 直线补间
+补间距离阈值,连续无效点数量小于该值则转换为有效点
六、数据获取
1、设置单轮廓回调函数
C++: LSHD6_SetSingleCallBack(const uint32 cameraIndex, pCallbackSingleProfile func);
设置单轮廓回调函数,适合LSHD6_LowSpeedGrab 和LSHD6_LowSpeedGrabOutter 模式下连续获取相机回传数据,相机按照设定的频率或者外部触发的频率采集到每帧数据就会执行一次,一般适合100HZ 以内的速度
回调函数格式说明:@param profileX 单个轮廓的X 轴数据指针@param profileZ 单个轮廓的Z 轴数据指针@param profileZ 单个轮廓的点数,一般为750~1000@param pImage 原始图像数据指针(8byte 灰度图像)@param imgWidth 原始图像宽度(单位:像素)@param imgHeight 原始图像高度(单位:像素)
一般情况下用户使用回调参数为前三项以获取轮廓物理坐标。
如需要获取原始图像数据需要在LSHD6_SetSingleCallBackMode 及LSHD6_SetshowUI 函数中进行设置以获取原始图像数据信息
C++: typedef void(_cdecl*pCallbackSingleProfile)(double* profileX, double* profileZ, uint32 count,BYTE* pImage, uint32 imgWidth ,uint32 imgHeight);
2、设置批处理轮廓回调函数
C++: LSHD6_SetBatchCallBack(const uint32 cameraIndex, pCallbackBatchProfile func);
设置批处理轮廓回调函数,适合LSHD6_InnerTriggerHighSpeedScan 和LSHD6_EncoderTriggerHighSpeedScan 时因采集频率较高,在所有设定数量的轮廓采集完毕后执行一次
回调函数格式说明:
@param profileZ 批量轮廓的Z 轴数据指针
@param profileX 批量轮廓的X 轴数据指针(每个单个轮廓都是一样的)
@param xcount 批量轮廓中单个轮廓的数据点数,一般为750~1000(每个单个轮廓都是
一样的)
@param ycount 批量轮廓的总数量,一般为20000 以下
C++: typedef void(_cdecl*pCallbackBatchProfile)(double** profileZ, double* profileX, int xcount,
int ycount);
3、查询获取
C++: LSHD6_GetProfileData(const uint32 cameraIndex, double profileX[], double profileZ[], int&profileCnt);
获取轮廓数据,此方法使用查询的方式,每次轮廓仪被触发25ms 后可以读取到当前的轮廓,适合labview 等不能使用回调机制的开发环境,,不适合高速场合
参数:序号+轮廓X数组+轮廓Z数组+轮廓点数
4、高速UDP获取
(1)创建UDP
C++:LSHD6_CreateUDPserver(const uint32 cameraIndex, BYTE LocalIp0, BYTE LocalIp1, BYTE LocalIp2, BYTE LocalIp3, uint32 LocalPortNumer,BYTE TargetIp0, BYTE TargetIp1, BYTE TargetIp2,BYTE TargetIp3, uint32 TargetPortNumber);
创建UDP 服务器
参数:序号+@param LocalIp0 本地ip 第1 段@param LocalIp1 本地ip 第2 段@param LocalIp2 本地ip 第3 段@param LocalIp3 本地ip 第4 段@param LocalPortNumer 本地端口号@param TargetIp0 目标ip 第1 段@param TargetIp1 目标ip 第2 段@param TargetIp2 目标ip 第3 段@param TargetIp3 目标ip 第4 段@param TargetPortNumber 目标端口号
(2)开启UDP
C++: LSHD6_UDPEnable(const uint32 cameraIndex, bool udpsendOrNot);
是否启用UDP 发送数据,必须在传感器停止状态下调用
ture:UDP发送数据,false:不发送数据
(3)销毁UDP
C++:LSHD6_UDPDestroy(const uint32 cameraIndex);
销毁UDP 服务器,释放内存,防止内存泄漏
(4)发送测试
C++: LSHD6_SendUDPbroadcast(const uint32 cameraIndex, char* UdpMessage, int length);
说明:UDP 发送数据
输入:
@param cameraIndex 轮廓仪编号,如果为连接的第一台轮廓仪则设置1,第二台设置为2,
以此类推,最大值6
@param UdpMessage 发送内容
@param length 发送字节数
七、状态查询
1、获取相机ROI
C++: LSHD6_GetCameraROI(const uint32 cameraIndex, int& ROIleft, int& ROItop, int&ROIWidthSize, int& ROIHeightSize);
获取相机取像区域
输入:@param cameraIndex 轮廓仪编号输出:@param ROIleft 轮廓仪取像区域左上列坐标(0~1200,16 的倍数)@param ROItop 轮廓仪取像区域左上行坐标(0~1024,1 的倍数)@param ROIWidthSize 轮廓仪取像区域宽度(64~1200,16 的倍数)@param ROIHeightSize 轮廓仪取像区域高度(1~1023,1 的倍数)返回值:成功返回true,失败返回false
2、获取相机曝光值
C++:LSHD6_GtExposureTime(const uint32 cameraIndex);
返回值:轮廓仪曝光值,单位:微秒,-99 代表获取失败
3、获取相机频率
C++:LSHD6_GetFrameRate(const uint32 cameraIndex);
获取帧速,必须在触发模式设置为软件触发时使用
返回值:轮廓仪帧速,-99 代表获取失败
4、获取相机最大采集范围
C++: LSHD6_GetProfileSize(const uint32 cameraIndex, double& profileXMax,double&profileZMax);
说明:获取轮廓仪最大采集范围
输入:
@param cameraIndex 序号
@param profileXMax 轮廓水平方向最大值
@param profileZMax 轮廓高度方向最大值
八、数据保存
1、保存当前单个轮廓(txt)
C++: LSHD6_SaveCurrentSingleProfile(const uint32 cameraIndex,char* fileName);
输入:@param cameraIndex 轮廓仪编号@param fileName 为文件名,不需要加文件扩展名。系统会在当前目录下或LSHD6_SetSysFilePath 指定目录下创建文件夹“MeasureData”并保存txt 文本文件
2、扫描轮廓保存(csv)
C++: LSHD6_SaveBatchProfile(const uint32 cameraIndex, char* fileName);
说明:保存批处理轮廓
输入:
@param cameraIndex 轮廓仪编号
@param fileName 为文件名,不需要加文件扩展名。系统会在当前目录下或
LSHD6_SetSysFilePath 指定目录下创建文件夹“MeasureData”并保存csv 文本文件
3、高度图保存(8 位bmp)
C++: LSHD6_SaveHeightPicture(const uint32 cameraIndex, char* fileName, double heightUpper,double heightLower);
说明:保存高度图
输入:@param cameraIndex 轮廓仪编号@param fileName 为文件名,不需要加文件扩展名。系统会在当前目录下或LSHD6_SetSysFilePath 指定目录下创建文件夹“ Picture”并保存bmp8 位灰度图@param heightUpper 高度上限,映射灰度255@param heightLower 高度下限,映射灰度0,中间高度等比例映射
九、运算
1、平均高度计算
C++: LSHD6_CalPlaneAverageHeight(const uint32 cameraIndex, double LineStart, double LineEnd);
说明:计算平均高度
输入:
@param cameraIndex 轮廓仪编号
以此类推,最大值6
@param LineStart 计算角度水平方向起始端
@param LineStart 计算角度水平方向结束端
2、角度计算
C++: LSHD6_CalDeviceAngle(const uint32 cameraIndex, double LineStart,double LineEnd);
说明:计算安装角度
输入:@param cameraIndex 轮廓仪编号@param LineStart 计算角度起始端@param LineStart 计算角度结束端
3、高度补偿
C++: LSHD6_SetDeviceHeightOffset(const uint32 cameraIndex, double heightOffset);
说明:设备安装高度补偿,一般在多台并用时使用
输入:
@param cameraIndex 轮廓仪编号
@param heightOffset 高度补偿,可通过CalPlaneAverageHeight 辅助计算
4、角度补偿
C++: LSHD6_SetDeviceAngle(const uint32 cameraIndex, double deviceAngle);
输入:@param cameraIndex 轮廓仪编号@param deviceAngle 安装角度,可通过CalDeviceAngle 辅助计算
5、原图转物理坐标
C++ :LSHD6_GetProfileFromRawImage(const uint32 cameraIndex, BYTE* ImageData, doubleprofileX[], double profileZ[], int& profileCnt);
原始图像转轮廓数据。适合特殊场合原始图像受到多重反射或镜面反射或其他干扰无法获取良好的轮廓,可以先获取原始图像数据,用户自行编写算法过滤干扰后再使用该函数获取轮廓数据,可以获取质量较好的轮廓
输入:
@param cameraIndex 轮廓仪编号
@param ImageData 图片数据指针
输出:
@param profileX 轮廓坐标X 数组
@param profileZ 轮廓坐标Z 数组
@param profileCnt 轮廓点数
6、像素坐标转物理坐标(像素数组)
C++: LSHD6_GetProfileFromPixelArray(const uint32 cameraIndex, double pixelX[], double pixelZ[],int pixelCnt, double profileX[], double profileZ[], int& profileCnt);
像素(数组)坐标转轮廓数据
输入:@param cameraIndex 轮廓仪编号@param pixelX 像素坐标X 数组@param pixelZ 像素坐标X 数组@param pixelCnt 像素点数输出:@param profileX 轮廓坐标X 数组@param profileZ 轮廓坐标Z 数组@param profileCnt 轮廓点数
7、像素坐标转物理坐标(单像素)
C++: LSHD6_GetProfileFromSinglePixel(const uint32 cameraIndex, double pixelX, double pixelZ,double& profileX, double& profileZ);
像素(单个)坐标转轮廓数据
输入:
@param cameraIndex 轮廓仪编号
@param pixelX 像素坐标X
@param pixelZ 像素坐标Z
输出:
@param profileX 轮廓坐标X
@param profileZ 轮廓坐标Z