结构光传感器库函数(十七)

一、传感器初始化

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);

      相机初始化(不带UI功能)
      相机序列号:S+七位数字
      3、激光器开合
      (1)C++: LSHD6_SetLaserOn(const uint32 cameraIndex);
      开启激光
      (2)C++: LSHD6_SetLaserOff(const uint32 cameraIndex);
      关闭激光
      4、相机销毁
      C++: LSHD6_DestroyCamera(const uint32 cameraIndex);
      释放申请的系统内存,避免内存泄漏
      三、模式设置
      1、触发设置
      C++:LSHD6_SetTriggerMode(const uint32 cameraIndex, int value);
      传感器在停止状态下设置
      触发模式:0:软件触发,1:IO低频率触发,2:编码器高速触发。
      2、相机Binning 模式设置
      C++ :LSHD6_SetCameraBining(const uint32 cameraIndex, bool HBiningOpen,bool VBiningOpen);

      设置传感器Bining 模式(合并相机相邻的两个像素,可以降低精度提高速度),如需此功能,必须在LSHD6_SetCameraParameter 之前调用,使用过程中不可修改

      参数为序号+水平方向binning+垂直方向binning
      3、固定数量低速取像
      C++:LSHD6_Snap(const uint32 cameraIndex, uint32 snapNumber);
      内部软件触发方式进行固定帧数取像,每次执行前需要先执行LSHD6_Stop
      参数:序号+触发次数(至少为1)
      4、连续低速取像

      C++: LSHD6_LowSpeedGrab(const uint32 cameraIndex,double frequency);

      内部软件触发方式进行连续取像,在LSHD6_SetshowUI 设置显示UI 的情况下一般帧速50 以下,否则会造成系统卡顿,不显示UI 时则可以根据需要提高

      参数:编号+传感器低帧速(1~100帧/s)

      5、低速外部触发取像
      C++: LSHD6_LowSpeedGrabOutter(const uint32 cameraIndex);
      外部触发方式进行连续取像,外部每到来一个上升沿信号则触发取像一次
      6、扫描内存分配

      C++: LSHD6_SetBatchProfileBuffer(const uint32 cameraIndex, int ProfileCnt);

      申请批处理内存

      参数:序号+轮廓个数(最大20000)

      7、高速内部软件触发固定帧数扫描

      C++: LSHD6_InnerTriggerHighSpeedScan(const uint32 cameraIndex, int snapNumber);

      按照设定的内部采集频率和帧数执行高速扫描,扫描结束后执行一次数据回调
      参数:序号+轮廓个数(小于SetBatchProfileBuffer 申请内存的轮廓个数)
      8、编码器触发固定帧数扫描

      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);

      传感器停止工作,进入待机状态
      12、设置UI 显示模式

      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
                                            (0)

                                            相关推荐

                                            • C++数值类型与string的相互转换

                                              转自:https://www.cnblogs.com/johngu/p/7878029.html 1.数值类型转换为string 1.1使用函数模板+ostringstream 使用函数模板将基本数据 ...

                                            • 【从零学习OpenCV 4】直线拟合

                                              ‍‍ 重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版 ...

                                            • 结构光传感器编程(二十一)

                                              一.从VS2010移植到VS2013时,出现: vs2013 错误 1 error MSB8031: Building an MFC project for a non-Unicode charact ...

                                            • 结构光传感器上位机界面

                                              上位机监控软件界面 使用原始图像调节曝光时间 提取轮廓图像 滤波方式: 均值滤波:9个像素点做一个循环 中值滤波:取9个.11个等奇数点循环 点击参数保存,数据修改生效. 生成数据:X/Z轴方向,每一 ...

                                            • 张旭光二王行书42讲(十七):《王羲之圣教序》结构的穿插变化

                                              张旭光二王行书42讲(十七):《王羲之圣教序》结构的穿插变化

                                            • 《管理:责任篇》第六十七讲:创新的结构

                                              创新者的结构 以搜寻创新机会为目标的组织,应独立于现行管理型公司之外.创新型组织体认到,同一个组织,实无法同时兼顾创造新事业和照顾原有事业.对现职人员来说,维持现有事业的运作已是太重的任务,再无更多时 ...

                                            • 《作战概念探析》之二十七:杀伤链的结构

                                              杀伤链的结构 杀伤链的结构,可用锁链式结构和珠链式结构来描述.两种链式结构的共同特点均为"闭合",这也是杀伤过程闭合的必然要求. 所谓的"锁链式结构",作战行动 ...

                                            • 超细 ‘男’‘女’士衬衫结构制版图与推板教程!

                                              主编:俊美人台小银分享|超细 '男''女'士衬衫结构制版图与推板教程! 男士基本款衬衫制版和推板教程 男衬衫是男性的主要服装之一,本款为尖角翻立领,六粒扣,左前胸贴明袋一个,装双层过肩,后片两个褶裥, ...

                                            • 程序员必备的思维能力:结构化思维

                                              在日常工作中,我们时常会碰到这样的情况,有的人讲一件事情的时候逻辑非常混乱,说了很多事情的罗列,却说不到重点.有的人写代码,本身的业务逻辑并没有多复杂,但呈现出的代码却像一堆线团,混乱不堪,无法理解. ...

                                            • “郭明瑞老师聊民法”第七十七期:建设工程施工合同(第一篇)

                                              建设工程施工合同 今天我们聊的题目是建设工程施工合同的几个问题,不是就整个施工合同的内容来谈,而是谈几个问题.建设工程施工合同我们主要谈六个问题. 第   一   篇 -THE FIRST- 01 建 ...

                                            • 如何判断筹码结构的好坏(图解)(2)

                                              再讲重点,筹码的纯洁性. 这个比较难理解,我只能通过举例来说. 做短线或者超短打板,参与牛股的人主要是谁?激进的操作者,他们的操作是最极端的,买按涨停买,卖按跌停卖.那么反应到盘面就是,极端的走势. ...