Halcon 光度立体 缺陷检测

一、概述

halcon——缺陷检测常用方法总结(光度立体) - 唯有自己强大 - 博客园 (cnblogs.com)

        上周去了康耐视的新品发布会,我真的感觉压力山大,因为VM可以实现现在项目中的80% 的功能,感觉自己的不久就要失业了。同时康耐视开始布局工业的每个方面,生成一个完整的生态链,国内很喜欢搞某某一条龙服务。相机方面出了很多尤其是3D的,还有2.5D的相机,精度方面不好说,他们说Z方向的重复性精度可以达到0.15u,我们没有使用过,我对此保持怀疑,因为我用过的精度最高的是基恩士的的0.2u的,我尊重日本企业的严谨性和专业性,今天我看了一下那个halcon 的光度立体法,是2.5D 的。

光度立体法主要是表面检测的,在检测缺口、凹痕,适用于检测金属物料。在采集图片的时候最好是使用灰度图,至少是3张 最好是4张图像

光度立体的局限性:

  • 一方面假定相机是无畸变成像,也就是说必须使用远心镜头或者长焦镜头。
  • 另一方面假定每一个光源发射的光束都是平行且均匀的,也就是说必须使用具有均匀强度的远心照明光源,或者使用远距离的点光源代替。

此外,物体必须具有朗伯反射特性,即它必须以漫反射的方式反射入射光。有镜面反射的物体或者区域(镜子或者光滑的表面)不能使用此方法,会得到一个错误的结果

光照方向说明

安装说明:

    1、远心镜头必须与被测试的物体表面垂直按照,在采集多张图片的时候一定要保证相机和物体不动,对于采集至少三张的灰度图像,其每次取像的照明方向必须改变(相对于相机)。

    2、在采集的多张图像中的每付图像照明方向必定是制定Slants和Tilts两个参数角度

Slants:

表示光束方向与相机中轴线的夹角,一般是30-60度之间

Tilts:

Tilt角度通常都是均匀分布在被测物体周围,比如3个方向打光,Tilt角度应该是[0,120,240]OR[0,120,-120],4个方向打光是[0,90,180,-90]。需要注意的是,打光方向不能相同,否则重构的图像结果达不到预期效果

二、算子解释

  •  photometric_stereo (根据光度立体技术重建曲面)

*参数列表:
*Images(in)//输入灰度图像(4张)
*HeightField(out)//返回重建高度信息图
*Gradient(out)//返回表面的梯度信息图
*Albedo(out)//返回表面的反射率信息图
*Slant//光源光线与摄像机光轴的夹角
*Tilt//光源光线投影与被测物主轴的夹角
*ResultType//请求结果类型(高度场/梯度场/反射率)
*ReconstructionMethod//重建方法类型
*GenParamName//一般参数名称
*GenParamValue// 一般参数设置*   重建高度信息图 表面的梯度信息图 表面的反射率信息图 光源光线与摄像机光轴的夹角  光源光线投影与被测物主轴的夹角  请求结果类型(高度场/梯度场/反射率)  重建方法类型(迫松重建)
photometric_stereo (Images, HeightField,    Gradient,      Albedo,          Slants,                  Tilts,                          ResultType,                     'poisson',          [],        [])
  • derivate_vector_field(处理photometric_stereo 函数输出的重建后的梯度、反射率、以及高度场信息图)

*derivate_vector_field    处理photometric_stereo 函数输出的重建后的梯度、反射率、以及高度场信息图  
*将向量场的分量与高斯函数的导数进行卷积,并计算由此得到的各种特征。
*在光度立体项目中,专门用于处理photometric_stereo 函数输出的重建后的梯度、反射率、以及高度场图像。
*参数列表:
*VectorField(in)// 梯度场图像
*Result(out)    // 返回平均曲率场图像
*Sigma(in)      // 高斯系数*如果在Sigma中传递一个值,那么在列和行方向上的平滑量是相同的。*如果在Sigma中传递两个值,第一个值指定列方向的平滑量,第二个值指定行方向的平滑量。
*Component(in)  //组件计算   *curl,向量场的旋度。旋度的一个应用是分析光流场。旋度是如果向量场是流体,小船会旋转多少。*divergence,向量场的散度。“divergence”的一个应用是分析光流场。打个比方,如果向量场是流体,散度就是源和汇的位置。*mean_curvature,当输入向量场 VectorField为梯度场时,下垫面的平均曲率H。用于处理photometric_stereo返回的向量场。*gauss_curvature,当输入向量场 VectorField 为梯度场时,下垫面的高斯曲率K。用于处理photometric_stereo返回的向量场。derivate_vector_field (Gradient, Curl, 1, 'curl')

 

三、缺陷检测

反射率信息图

思路

1、不同角度采集4张灰度图,设置不同的角度参数 Slants   Tilts
2、photometric_stereo  ,返回不同的图 重建高度信息图 表面的梯度信息图 表面的反射率信息图
3、得到反射率信息图 然后利用blob 分析进行缺陷检测


*思路:
* 1、不同角度采集4张灰度图,设置不同的角度参数 Slants   Tilts
* 2、photometric_stereo  ,返回不同的图 重建高度信息图 表面的梯度信息图 表面的反射率信息图
* 3、得到反射率信息图 然后利用blob 分析进行缺陷检测dev_close_window ()
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')* Part 1利用反射率图像检测皮革表面缺陷
read_image (Images, 'photometric_stereo/leather_1_0' + [1:4])
write_image (Images, 'tiff', 0, 'D:/1.tiff')
** 展示不同方向光源成像图像
for I := 1 to 4 by 1Message := 'Sample 1: Acquire image ' + I + ' of 4'select_obj (Images, ObjectSelected, I)dev_display (ObjectSelected)disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')* wait_seconds (0.5)
endfor
stop ()
* 应用光度立体法生成的反射率图进行缺陷检测
Tilts := [6.1,95.0,-176.1,-86.8]
Slants := [41.4,42.6,41.7,40.9]* 梯度场     反射率
ResultType := ['gradient','albedo']*参数列表:
*Images(in)//输入灰度图像(4张)
*HeightField(out)//返回重建高度信息图
*Gradient(out)//返回表面的梯度信息图
*Albedo(out)//返回表面的反射率信息图
*Slant//光源光线与摄像机光轴的夹角
*Tilt//光源光线投影与被测物主轴的夹角
*ResultType//请求结果类型(高度场/梯度场/反射率)
*ReconstructionMethod//重建方法类型
*GenParamName//一般参数名称
*GenParamValue// 一般参数设置*   重建高度信息图 表面的梯度信息图 表面的反射率信息图 光源光线与摄像机光轴的夹角  光源光线投影与被测物主轴的夹角  请求结果类型(高度场/梯度场/反射率)  重建方法类型(迫松重建)
photometric_stereo (Images, HeightField,    Gradient,      Albedo,          Slants,                  Tilts,                          ResultType,                     'poisson',          [],        [])* 显示反射率图
dev_display (Albedo)*检测缺陷   反射率的基础上进行缺陷检测
var_threshold (Albedo, Region, 15, 15, 0.4, 0.4, 'light')
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 99999)
union1 (SelectedRegions, RegionUnion)
closing_circle (RegionUnion, RegionClosing, 3.5)
connection (RegionClosing, Defects)
area_center (Defects, Area, Row, Column)
gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,sqrt(Area) + 30))
*显示缺陷
dev_display (Albedo)
dev_set_color ('red')
dev_set_draw ('margin')
dev_set_line_width (4)
dev_display (Circle)

梯度信息图

思路

1、不同角度采集4张灰度图,设置不同的角度参数 Slants   Tilts
2、photometric_stereo  ,返回不同的图 重建高度信息图 表面的梯度信息图 表面的反射率信息图
3、得到梯度信息图然后利用blob 分析进行缺陷检测


*思路:
* 1、不同角度采集4张灰度图,设置不同的角度参数 Slants   Tilts
* 2、photometric_stereo  ,返回不同的图 重建高度信息图 表面的梯度信息图 表面的反射率信息图
* 3、得到梯度信息图然后利用blob 分析进行缺陷检测* Part 2 利用梯度图像检测皮革表面缺陷
read_image (Images, 'photometric_stereo/leather_2_0' + [1:4])
for I := 1 to 4 by 1Message := 'Sample 2: Acquire image ' + I + ' of 4'select_obj (Images, ObjectSelected, I)dev_display (ObjectSelected)disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')*wait_seconds (0.5)stop()
endfor* 应用光度立体法生成的反射率图
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
*对反射率图二值化(发现无法二值化)
threshold (Albedo, Region1, 128, 255)
* 显示反射率图
dev_display (Albedo)*derivate_vector_field    处理photometric_stereo 函数输出的重建后的梯度、反射率、以及高度场信息图  
*将向量场的分量与高斯函数的导数进行卷积,并计算由此得到的各种特征。
*在光度立体项目中,专门用于处理photometric_stereo 函数输出的重建后的梯度、反射率、以及高度场图像。
*参数列表:
*VectorField(in)// 梯度场图像
*Result(out)    // 返回平均曲率场图像
*Sigma(in)      // 高斯系数*如果在Sigma中传递一个值,那么在列和行方向上的平滑量是相同的。*如果在Sigma中传递两个值,第一个值指定列方向的平滑量,第二个值指定行方向的平滑量。
*Component(in)  //组件计算   *curl,向量场的旋度。旋度的一个应用是分析光流场。旋度是如果向量场是流体,小船会旋转多少。*divergence,向量场的散度。“divergence”的一个应用是分析光流场。打个比方,如果向量场是流体,散度就是源和汇的位置。*mean_curvature,当输入向量场 VectorField为梯度场时,下垫面的平均曲率H。用于处理photometric_stereo返回的向量场。*gauss_curvature,当输入向量场 VectorField 为梯度场时,下垫面的高斯曲率K。用于处理photometric_stereo返回的向量场。derivate_vector_field (Gradient, Curl, 1, 'curl')*derivate_gauss.hdev
*derivate_gauss (Image, ImageGauss, 3, 'none')
* 将一个图像与高斯函数的导数进行卷积。  效果与FFT进行高斯滤波差不多。
*主要的区别是边界处理:FFT的定义假设信号是周期性的,因此边界处理是循环的延续。与此相反,derivate_gauss在图像边界使用灰度值的镜像。
*通过FFT进行过滤的速度已经快于在Sigma=3(排除创建过滤器的时间)中使用derivate_gauss。这种优势随着Simag的增大而变得更加明显。    
*'none' 仅使用平滑
*'x' 沿X的一阶导数
derivate_gauss (Curl, CurlGradient, 1, 'gradient')// 将一个图像与高斯函数的导数进行卷积。  效果与FFT进行高斯滤波差不多。
* 显示梯度图
dev_display (CurlGradient)
Message := 'Changes in the gradient curl'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 用梯度图寻找缺陷
threshold (CurlGradient, Region, 0, 0.01)
*
rank_region (Region, RegionCount, 10, 10, 30)//归类区域
connection (RegionCount, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999)
union1 (SelectedRegions, RegionUnion)
rank_region (RegionUnion, RegionCount1, 25, 25, 170)
connection (RegionCount1, NoTextured)* 显示
dev_display (Albedo)
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (3)
dev_display (NoTextured)
disp_message (WindowHandle, 'Non-textured areas on leather', 'window', 12, 12, 'black', 'true')
stop ()

四、洗发水表面检测 

思路:

梯度信息图来检测

 inspect_shampoo_label_photometric_stereo.hdev

*思路 :
* inspect_shampoo_label_photometric_stereo.hdev
dev_close_window ()
dev_update_off ()
dev_open_window (0, 0, 640, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
Message := 'Inspect the label of a shampoo bottle'
Message[1] := 'using photometric stereo. In this case four'
Message[2] := 'different light orientations were used.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Show input images with different illumination
read_image (Images, 'photometric_stereo/shampoo_label_0' + [1:4])
for I := 1 to 4 by 1Message := 'Acquire image ' + I + ' of 4'select_obj (Images, ObjectSelected, I)dev_display (ObjectSelected)disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')wait_seconds (0.5)
endfor
* 
* Apply photometric stereo to determine the albedo
* and the surface gradient.
Tilts := [6.1,95.0,-176.1,-86.8]
Slants := [41.4,42.6,41.7,40.9]
ResultType := ['gradient','albedo']
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
* 
* Display the albedo image
dev_display (Albedo)
disp_message (WindowHandle, 'Albedo image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Calculate the gaussian curvature of the surface
* using the gradient field as input for the operator
* derivate_vector_field.
* Defects are usually easy to detect in the curvature image.
derivate_vector_field (Gradient, MeanCurvature, 1.0, 'mean_curvature')
* 
* Detect defects
* 
* Segment the tablet areas in the curvature image
threshold (MeanCurvature, Region, -10, -0.07)
opening_circle (Region, RegionOpening, 1)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, Defects, 'area', 'and', 50, 99999)
shape_trans (Defects, Circle, 'outer_circle')
* Display the defects in curvature image
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (2)
dev_display (MeanCurvature)
dev_display (Circle)
Message := 'The defect can easily be detected'
Message[1] := 'in the surface curvature image'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
stop ()
* Display the defects in the albedo image
dev_set_draw ('margin')
dev_set_color ('red')
dev_display (Albedo)
dev_display (Circle)
disp_message (WindowHandle, 'Defect in albedo image', 'window', 12, 12, 'black', 'true')

我用反射率的图做了,是达不到这个效果的

五、药片缺陷检测

* Initialization
dev_close_window ()
dev_update_off ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
Message := 'Inspect the backside of a blister'
Message[1] := 'using photometric stereo. In this case four'
Message[2] := 'different light orientations were used.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Show input images with different illumination
read_image (Images, 'photometric_stereo/blister_back_0' + [1:4])
for I := 1 to 4 by 1Message := 'Acquire image ' + I + ' of 4'select_obj (Images, ObjectSelected, I)dev_display (ObjectSelected)disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')wait_seconds (0.5)
endfor
stop ()
* 
* Apply photometric stereo to determine the albedo
* and the surface gradient.
Tilts := [6.1,95.0,-176.1,-86.8]
Slants := [41.4,42.6,41.7,40.9]
ResultType := ['gradient','albedo']
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
* 
* Display the albedo image
dev_display (Albedo)
disp_message (WindowHandle, 'Albedo image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Calculate the gaussian curvature of the surface
* using the gradient field as input for the operator
* derivate_vector_field.
* Defects are usually easy to detect in the curvature image.
derivate_vector_field (Gradient, GaussCurvature, 1, 'gauss_curvature')
* 
* Detect defects
* 
* Segment the tablet areas in the curvature image
regiongrowing (GaussCurvature, Regions, 1, 1, 0.001, 250)
select_shape (Regions, TabletRegions, ['width','height'], 'and', [150,150], [200,200])
shape_trans (TabletRegions, TabletRegions, 'convex')
union1 (TabletRegions, TabletRegions)
erosion_circle (TabletRegions, TabletRegions, 3.5)
* Search for defects inside the tablet areas
reduce_domain (GaussCurvature, TabletRegions, ImageReduced)
abs_image (ImageReduced, ImageAbs)
threshold (ImageAbs, Region, 0.03, 255)
closing_circle (Region, RegionClosing, 10.5)
connection (RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, Defects, 'area', 'and', 10, 99999)
area_center (Defects, Area, Row, Column)
gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,20.5))
* Display the defects in curvature image
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (2)
dev_display (GaussCurvature)
dev_display (Circle)
Message := 'The defect can easily be detected'
Message[1] := 'in the surface curvature image'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
stop ()
* Display the defects in the albedo image
dev_set_draw ('margin')
dev_set_color ('red')
dev_display (Albedo)
dev_display (Circle)
disp_message (WindowHandle, 'Defect in albedo image', 'window', 12, 12, 'black', 'true')

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

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

相关文章

XAMPP Apache配置SSL证书,支持HTTPS访问

文章目录 第1步:购买SSL证书第2步:确保443端口没有被占用第2步:httpd.conf启用SSL第3步:httpd-ssl.conf配置一些解释 本文的测试结果基于XAMPP 5.6.28软件,相关的版本信息如下: Windows Version: Home 6…

[集群聊天服务器]----(十一) 使用Redis实现发布订阅功能

接着上文,[集群聊天服务器]----(十)Nginx的tcp负载均衡配置–附带截图,我们配置nginx,使用了多台服务端来提高单机的并发量,接下来我们回到项目中,思考一下,各个服务端之间怎么进行通信呢? 配置…

Reactor模式Proactor模式

1.Reactor/Dispatcher模式 1.1 概述 Reactor模式下,服务端的构成为Reactor 处理资源池。其中,Reactor负责监听和分发事件,而处理资源池则负责处理事件。 该模式下的组合方案有下面几种(第三种几乎没有被实际应用): 1 * Reacto…

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞,这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说,开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…

APM2.8下载固件的方法(两种办法详解)

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口,不要选择auto,如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意:烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

【软件设计师】网络安全

1.网络安全基础信息 网络安全的五个基本要素: 机密性:确保信息不暴露给未授权的实体或进程 完整性:只有得到允许的人才能修改数据,并且能判断出数据是否已被修改 可用性:得到授权的实体在需要时可以访问数据&#xff0…

Laravel和ThinkPHP框架比较

一、开发体验与易用性比较 1. 代码可读性: - Laravel以其优雅的语法和良好的代码结构著称,使得代码更加易读易懂。 - 相比之下,ThinkPHP的代码可读性较为一般,在一些复杂业务场景下,可能会稍显混乱。 让您能够一站式…

【动手学PaddleX】谁都能学会的基于迁移学习的老人摔倒目标检测

本项目使用PaddleX搭建目标检测模块,在一个精选的数据集上进行初步训练,并在另一个老年人跌倒检测的数据集上进行参数微调,实现了迁移学习的目标检测项目。 1.项目介绍 迁移学习是非常有用的方法,在实际生活中由于场景多样&…

Brewer Science将在CS Mantech进行展示

在风景如画的亚利桑那州图森市举办的CS Mantech盛会上(2024年5月20日至23日),杰出化合物半导体材料企业Brewer Science,将带来一场名为“化合物半导体制造的创新材料解决方案”的演讲盛宴。这一演讲,定于五月二十一日星…

【Java面试】五、MySQL篇(下)

文章目录 1、事务的特性2、并发事务问题3、事务的隔离级别4、undo log 和 redo log4.1 底层结构4.2 redo log4.3 undo log 5、MVCC5.1 隐式字段5.2 undo log 版本链5.3 ReadView5.4 ReadView的匹配规则实现事务隔离 6、MySQL的主从同步原理7、分库分表7.1 垂直分库7.2 垂直分表…

stm32启动文件

启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作: 初始化堆栈指针SP_initial_sp 初始化PC指针Reset_Handler 初始化中断向量表 配置系统时钟 调用C库函数_main初始化用户堆栈,从而最终调用main函数去到C的世界 …

linux下使用cmake-gui编译WXQT

一.编译环境 操作系统:Ubuntu 22.04.3 LTS wxWidgets源码:wxWidgets-3.1.5 编译工具:CMake-gui qt版本:5.13.2 二.编译步骤 1.将源码解压。 2.打开CMake-gui,并设置好源码目录和构建目录 3.点击configure 会弹出…

C++模板使用

文章目录 目录 文章目录 前言 一、交换函数(泛型编程) 二、函数模板 2.1 函数模板概念 2.2函数模板格式 2.3使用方法 2.4 函数模板的原理 2.4.1库中的swap 2.5 函数模板的实例化 2.6 模板参数的匹配原则 三、类模板 3.1 类模板的定义格式 3.2类模板声明和定义分离 前言 C语言阶…

数据仓库——分层原理

目录 一、什么是数据仓库 二、数仓建模的意义,为什么要对数据仓库分层? 三、ETL 四、技术架构 五、数仓分层架构 数仓逻辑分层 1、数据引入层(ODS,Operational Data Store,又称数据基础层)&#xff…

解决 WooCommerce 的分析报表失效问题

今天明月的一个境外电商客户反应网站的 WooCommerce 分析报表已经十多天没有更新了,明明每天都有订单交易可分析报表里的数据依旧是十多天前的,好像更新完全停滞了似的。明月也及时的查看了后台的所有设置,确认没有任何问题,WooCo…

Android刮刮卡自定义控件

效果图 刮刮卡自定义控件 import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import …

类和对象03

六、继承 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。 这个时候我们就可以考虑利用继承的技术,减少重复代码 6.1 继承的基础语法 例如我们看到很多网站中, 都有公共的头部,公共的底…

乡村振兴的乡村人才引进与培养:引进和培养乡村人才,激发乡村发展活力,为乡村振兴提供人才保障

目录 一、引言 二、乡村人才引进与培养的重要性 (一)人才是乡村振兴的核心动力 (二)人才是乡村文化传承的载体 (三)人才是乡村社会治理的基石 三、乡村人才引进与培养的现状 (一&#xf…

备战秋招c++ 【持续更新】

T1 牛牛的快递 原题链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目类型:模拟 审题&确定思路: 1、超过1kg和不足1kg有两种不同收费方案 ---- 起步价问题 2、超出部分不足1kg的按1kg计算 ----- 向上取整 3、向上取整的实现思路…

移动端应用订阅SDK接入攻略

本文档介绍了联想应用联运移动端订阅SDK接入操作指南,您可在了解文档内容后,自行接入应用联运移动端订阅SDK。 接入前准备 1请先与联想商务达成合作意向。 2.联系联想运营,提供应用和公司信息,并获取商户id、app id、key&#…