系列文章目录

机器视觉系列(一)——概述
机器视觉系列(二)——机械部分
机器视觉系列(三)——电气部分

文章目录

  • 系列文章目录
  • 前言
  • 一、工业相机和其他数码相机的区别
    • 工业相机和普通数码相机的区别
    • 工业相机和单反相机的区别
  • 二、工业相机的主要性能参数
  • 三、面阵相机和线阵相机的区别
  • 四、CCD和CMOS相机的区别
    • CMOS相比于CCD的优势
    • CCD相比于CMOS的优势
  • 五、全局快门和滚动快门的区别
    • 全局快门与卷帘快门的优缺点
  • 六、高分辨率带来的问题
  • 七、工业相机的软件操作
    • 相机参数调整的步骤
      • ①带宽调节
      • ②亮度调节
      • ③颜色调节
      • ④明暗对比调节
  • 八、采集图像的连续精确获取
    • 软件触发
    • 硬件触发
  • 九、其他
  • 总结
  • 参考资料

前言

延续之前的机器视觉系列文章,这里从应用的角度,介绍工业相机部分的相关整理内容。

一、工业相机和其他数码相机的区别

工业相机和普通数码相机的区别

①工业相机是工业用品,需要连续长时间运行,所以在性能可靠性、稳定性、环境稳定、防水、连续运行时间上有明显的优势。工业相机不易损坏,连续工作时间长,可在较差的环境下使用,而一般的数码相机是做不到这些的。
工业相机的快门时间特别短,能够清晰地拍摄快速运动的物体。工业相机的最小快门时间可达十几μs。
工业相机的拍摄帧率远远高于数码相机,工业相机每秒可以拍摄十到几百张图像,而普通相机只能拍摄两到三张图像。
④工业相机的图像传感器是逐行扫描的,而数码相机是隔行甚至隔三行扫描的,所以工业相机的成像质量更高更真实
工业相机输出的是裸数据raw data,其光谱响应频率与人眼不同往往比较宽,成像质量较高,更适合精细化的图像处理要求。而普通相机的图像是经过压缩的,图像质量较差,不适合用于图像处理。
⑥工业相机由于拍摄图像多,图像质量高,所以自然要求要比普通相机具有更高的数据传输速率,也就对数据传输接口和传输协议都有特殊要求

工业相机和单反相机的区别

上面的第①、②、⑥依然存在。此外还有:
①工业相机由于要应用无物理环境受限的工业场景,所以其体积要明显小于单反相机
②工业相机配套SDK提供的软件功能,由于要满足专业的图像处理算法需要,所以要比用于拍摄生活场景的单反的软件功能更为强大

二、工业相机的主要性能参数

我们已经知道工业相机主要是用来检验和监控的,所以其主要性能参数就是能更好满足上述应用需求的,其包括:
芯片类型:彩色还是黑白、面阵还是线阵、CCD还是CMOS
分辨率:感光芯片上有多少格像元,就是多少分辨率的相机,常用的有30万、130万、200万、500万、1000万、2900万、7100万、1.2亿。
像元尺寸:像元是感光芯片上接受光信号的装置,每个图上的一个像素都对应像元,像元的物理尺寸就是像元尺寸,常见的有2.2μm、3.45μm、3.75μm、4.8μm、5.5μm、5.86μm、7.4μm。在同一时间单位的光照射到感光芯片上,像元尺寸越大,其能接受的光子数量越多,图像呈现的亮度越高。
像素格式:由于相机可以是彩色或黑白相机,所以就会有不同的像素格式,如Mono和RGB。再加上彩色相机还会有不同的数据压缩方式,又进一步增加了像素格式的类型,如Bayer和YUV等。
成像位深度:常见的工业相机一般使用8位来表示一个像素,也就是每个像素可以输出0~255共256个色阶。但还有更高级的工业相机,可使用12位或16位来表示一个像素,这样就会有更多的色阶,所拍摄出来图像的细节就更清晰。
噪点:指感光芯片把光信号变成电信号并输出的过程中产生的不属于物体的部分影像。
帧率/行率:面阵相机的帧率是指一秒钟能拍多少张图像,线阵相机的行频是指一秒钟相机能扫描多少行。
曝光时间:感光芯片接收光照射过来的时间,曝光时间设置的越长,图像越亮。但如果运动拍照的话,曝光时间长可能会产生拖影。曝光方式分逐行曝光和帧曝光。
快门方式:快门有全局快门Global Shutter和滚动快门Rolling Shutter两种。
触发方式:一般可设置由相机内置程序自动连续获取图像,或由外部软件或硬件信号对相机进行触发,每发出一次触发信号相机采集一帧图像。而由外部信号触发又可进一步分为获取时触发和帧开始时触发两种。通过触发方式来采集图像,可使相机的采集时间得到更精确的控制。
传输速率:一般有GigE、USB 3、CoaxPress等传输协议,传输速度从几Mbit/s到几Gbit/s都有。
传输信息:除传输相机拍摄图像的裸数据外,还可传输控制命令、相机参数等信息。
其中②和③决定了相机能够拍多大的区域,在该区域能够以多大的密度来提取信息;④、⑤和⑥决定了相机的每个像素能有多大的动态范围;⑦、⑧、⑨和⑩决定了相机能够以多快的速度进行拍摄;⑪和⑫则表明了在相机获取了相关信息后,能以多快的速度,将多详细的信息提供给你使用。

三、面阵相机和线阵相机的区别

①面阵相机:是同一个曝光时间周期,输出多行数据的采集设备。
②线阵相机:单行或多行进行采集的图像采集器。每次只能输出一行或多行图像数据。线阵系统一般需要编码器和触发器才能完成对一幅图像的采集,编码器输出行频,触发器输出帧频。
其优缺点对比为

如果你需要获取彩色图像,选择面阵相机;如果机械设计能力不足或现场机械设计受限,选择面阵相机;3D视觉应用,选择面阵相机;其他时候选择线阵相机

四、CCD和CMOS相机的区别

CCD芯片中像素使用完整的芯片表面以捕捉光线,并且无需在芯片表面上安装任何转换电子元件,这使表面拥有更多的像素空间,可以捕捉更多的光线。但正是由于这个特性,CCD读取数据没有CMOS快。因为势阱中的电子数目不受电压和电流波动的影响,完全电荷转移模式使CCD成为最适合于图像传感器应用的结构,其有极高的信噪比。
CMOS芯片中,将光能转化为电信号的电子元件直接集成在芯片表面,因此电子元件能够快速地读取成像数据。

CMOS相比于CCD的优势

性价比高。由于CMOS制造工艺属于通用工艺,而CCD制造属于专用工艺,所以CMOS制造成本更低;
成像速度快。由于其芯片AD转换直驱技术,再配合CMOS可以实现更灵活的区域信号读取技术,使得CMOS具有更高的成像速度;
③高分辨率。由于CMOS在经济上和适用范围上的优势,使得其获得了更多的研发投入,目前已经开发出比CCD更高的分辨率;
低功耗。CMOS电路可以工作在比CCD更低的电源电压下。此外,X-Y的寻址方案及片上功能实现都有助于降低系统功耗;
没有漏光smear现象。当长波光照射到硅基上并穿透时,CCD进入饱和区后,电荷存储势阱将填满电子,过剩的电子会向外溢出。溢出的电子将进入相邻像素以及垂直CCD转移通道中。垂直CCD中残留的漏光电荷使得垂直方向转移的正常信号电荷都加上了漏光电荷,导致漏光从上而下均匀出现。这种现象是CCD独有的,称为漏光smear。由于漏光量与电子快门速度无关,电子快门会导致漏光劣化。

CCD相比于CMOS的优势

更高的动态范围。与CMOS传感器相比,CCD传感器对光更加敏感,这是因为CCD有更大的填充因子,这就导致CCD在光电转换的精度方面更有优势,从而更适于高清晰成像或位深度大于8的成像应用。
更高的信噪比。因为势阱中的电子数目不受电压和电流波动的影响,完全电荷转移模式使CCD成为最适合于图像传感器应用的结构,可获得更高的信噪比。因此与CMOS传感器相比,CCD传感器更适合低对比度的场合。
更小的不均匀性。由于CMOS的每个像素都有放大器,因此有不同的增益和补偿,所以更难获得整体的均匀一致性。
如果需要超高分辨率,选用CMOS;如果需要高清晰度,选用CCD;如果需要对低对比度场景进行成像,选用CCD;其他场合都选用CMOS

五、全局快门和滚动快门的区别

全局快门Global Shutter和卷帘快门Rolling Shutter是常见的相机曝光方式。全局快门的方式比较简单,光圈打开后,整个图像芯片同时曝光,因此曝光时间与机械的开关速度有关,所以存在理论上的最小曝光时间。卷帘快门是当光圈打开后,还存在具有一定间隔的卷帘来控制传感器的曝光时间,如下图所示,卷帘方式是从左到右的。因此曝光时间的长短完全取决于卷帘的开口大小与卷帘的运动速度。也就是说,卷帘运动越快,卷帘间距越小,其曝光时间越小,因此卷帘快门能够具有更小的曝光时间。

全局快门与卷帘快门的优缺点

①全局快门的优点是所有的像素点同时曝光,其缺点是曝光时间存在物理极限;
②卷帘快门的优点是具有更小的曝光时间,其缺点是由于是逐行而不是同时曝光取像,如果图像是运动的,则存在明显的拖影,因此不适合拍摄运动的物体。
曝光时间短的应用(如<500μs)适合使用全局快门,而曝光时间长的应用,选择卷帘快门可以有更低的噪声和帧速。在实际应用中,一般只要是拍摄运动物体,都使用全局快门,只有在拍摄静止物体时,才使用滚动快门。CCD和CMOS相机都可配备全局快门

六、高分辨率带来的问题

像素的灵敏度和满阱容量随像素尺寸线性减小。一方面,小像素的分辨能力具有一定的衍射限制。因为衍射点随着F值的减少而增加,而低的F值会造成光入射到像素上的角度较大从而引起更多的阴影和串扰,因此,可以采取的F值的范围是相当有限的,且需要配合更强的照明和更短的曝光时间使用。另外,随着更小像素所带来的更大景深,还原小像素图像传感器得到的图像往往是泛焦的。而为了补偿由于像素减小而带来的一些畸变,对于透镜系统的设计要求也更为复杂。在减小像素尺寸的同时,为了保持图像的质量,需要弥补此前提到的小像素的负面影响,这将需要后端处理器发挥更大的作用。另外由于芯片面积的增加,导致每片晶圆上图像传感器芯片的数量下降,从而图像传感器的成本较高。每片晶圆上良好成像芯片的产量也可能受到影响,从另一方面也提高了传感器的成本。
所以在实际选用时,在成像分辨率满足要求的条件下,尽可能选择低分辨率、大像元尺寸的相机

七、工业相机的软件操作

由于我接触过的所有工业相机中,Basler提供的软件操作功能是最丰富的,这里使用Basler的acA1300-30gc + pylon Viewer 6.3.0来进行说明。
Basler把相机常用操作分为8类:
①优化图像质量
②保存相机设置以便将来使用
③在不断变化的光照条件下保持图像质量一致
④控制亮度
⑤控制帧速率
⑥更改分辨率
⑦检查相机是否丢失图像数据
⑧配置相机的触发行为
基于以上相机调节方式,我们参照《大恒相机图像质量调节说明书》给出的相机参数设置步骤来给出相机设置的具体示例。

相机参数调整的步骤

①带宽调节;
②亮度调节;
③颜色调节;
④明暗对比调节。

①带宽调节

通过设置最大可用带宽,以及最小的图像传输流量需求(不是必选的),来获得最优的图像传输效果。因为使用越少的Packet传输图像,图像出现丢帧的概率越低,花费在数据拼接的时间也越短
<1>将Bandwidth Reserve和Bandwidth Reserve Accumulation设置为10%(保留一定的带宽冗余,以更好适应现场的网速波动),Auto Packet Size设为true,使其自动探测并设置最大可用带宽。
<2>根据自己的实际视野需求调整AOI Controls栏的Width和Height来确定视野,并通过勾选Center X和Center Y使选定视野位于传感器正中间,以便于后续对由机械安装造成的误差进行微调补偿
实际需要视野由以下因素决定:
(1) 最大部件尺寸
(2) 部件在平移和方向上的最大变化
(3) 作为对部件尺寸的偏移量的边距
(4) 相机传感器的纵横比。
如下图所示,标有1的黑色部分显示最大零件尺寸。由于定位,零件可能超过灰色零件所示的最大变化,标记为2。框架3导致由最大零件尺寸加上最大定位公差确定的尺寸。标记4是由零件和图像之间的边距的额外需求定义的。对于图像处理,可能需要在零件和图像边缘之间提供空间。此外,为了维护和安装摄像机,在定位上允许一定的公差是很方便的。标记4是所需的视野。但是,计算出的视野需要根据相机的传感器分辨率进行调整。大多数区域相机提供4:3的纵横比。因此,对于每个方向,视野可以计算为
FOV = 最大零件尺寸 + 定位公差 + 余量 + 适应相机传感器的纵横比

根据实际需要的像素位深度(一般使用8bit即可,OpenCV好处理),设置Image Format Controls栏的Pixel Format参数为Mono或Bayer BG 8或12,从而获得最小的传输流量

②亮度调节

通过光圈、快门、增益的组合使用来调节亮度:
<1>在高亮环境下,优先使用光圈调节,较小的光圈可以提高锐利度、增加景深
<2>当光圈最大时,亮度仍然不够,则通过调节快门来控制亮度。在监控场景中,拍摄移动、特别是快速移动的被摄体时,通常需要比较快的快门速度才能冻结住画面,否则会有拖尾
<3>在较暗的环境中,光圈、快门已经调到极限,则需要通过增益来提升亮度。但提升增益的同时,噪声相应增加
亮度调节的流程如下图:

先将相关参数全部恢复到初始值,即Analog Controls栏的Gain(Raw)、Black Level(Raw)和Digital Shift参数设置为0,Gamma Enable设置为false,Color Improvements Control栏的LightSource Selector、Balance White Auto、Color Adjustment Enable设置为Off,Color Adjustment Hue(Raw)为0,Color Adjustment Saturation(Raw)为128。
然后将Acquistion Controls栏的Enable Acquisition Frame Rate设置为true,将Acquisition Frame Rate(Abs)设置为目标帧率;将Exposure Auto设置为false,将Exposure Time(Abs)设置为目标帧率对应的间隔时间。
打开图像直方图,查看目前设置的取图效果。然后根据上述流程图,判断是要调节曝光时间,还是调节增益。如果需要调节曝光时间,则调整Exposure Time(Abs)参数;如果需要调节增益,则调整Analog Controls栏的Gain(Raw)参数。
由于希望最终的亮度尽量与真实光通量呈线性关系,所以尽量不使用Gamma校正和查找表。
由于即使在理想情况下,感光芯片本身也在高亮度值处表现出非线性,所以一种亮度调节良好的评价标准是:充分利用每个像元的位深度来提高整幅图像的细节区分度,即亮度累积直方图的97~98%处为动态范围-1(对应8位深度即254)。另一种亮度调节良好的评价标准是:如果整体直方图近似呈高斯分布,则亮度累积直方图的50%处为动态范围/2(对应8位深度即128)

③颜色调节

颜色调节的流程如下图:

先调节白平衡,Image Format Controls栏的Processed Raw Enable参数设为true,Color Improvements Control栏的Balance White Auto参数设为true。如果上述调整后,感觉取图颜色与现实差别较大,可尝试通过修改LightSource Selector参数来进行修正。如果该操作后还不理想,建议将Auto Function Parameters栏的White Balance参数设为true,Analog Controls栏的Gain Auto设为Once或Continuous,让相机自己进行调节,一般就能获得较好的效果。还可通过将Gamma Enable参数设为true,Gamma Selector参数设为sRGB来进一步改善显示效果。
上述流程图中颜色转换步骤,由于涉及到手动Balance Ratio(Raw)或Color Transformation Value(Raw)参数的输入,其需要专业的色彩校正参考和手段,这里不建议使用
最后是饱和度调节等色彩微调,可通过Color Improvements Control栏的Color Adjustment Hue(Raw)和Color Adjustment Saturation(Raw)参数。如果要强调图像中的黑色部分,可调整Analog Controls栏的Black Level(Raw)参数进行调节。
颜色调节具有主观性,感觉取图颜色和真实颜色基本一致即可。

④明暗对比调节

由于在Basler该款相机中,没有对比度和锐化相关的调节参数。如果确定需要增强图像的明暗对比度,只能通过使用Gamma校正和查找表来进行调节。效果如下图:

八、采集图像的连续精确获取

在实际应用中,大多时候需要以等间隔时间,连续稳定的从相机获取图像。常用的有两种方式:软件触发和硬件触发。

软件触发

即使用Latest Image Only Grab Strategy策略。这个策略下只有最新到的图像保存在输出队列中,如果一份旧图像还没被读取新图像就又来了,那么旧图像就被舍弃,这样可以保证读取到图像永远都是读取时刻最新的。

参考Python代码如下:

camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
converter = pylon.ImageFormatConverter()
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
while camera.IsGrabbing():grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException) if grabResult.GrabSucceeded():image = converter.Convert(grabResult)img = image.GetArray()
...grabResult.Release()
camera.StopGrabbing()

使用Intel Core i5-8265U+8GB RAM+Win 10+pypylon,设置Basler相机参数为固定20FPS+20ms曝光时间+Bayer BG8。使用Python的time模块获取Windows系统时间,将连续的10000帧图像保存(前5000张)到硬盘,并统计相关时间,采样时间间隔均值为50.40ms,标准差为11.80ms。

使用相同的配置,通过回调函数方式连续获取图像的采样时间间隔均值为50.02ms,标准差为3.41ms。

参考Python代码如下:

time_sys = []
# 定义图像格式转换器
converter = pylon.ImageFormatConverter()
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
# 定义图像获取时的回调函数
class SampleImageEventHandler(pylon.ImageEventHandler):def OnImageGrabbed(self, camera, grabResult):# 获取系统时间time_sys.append(time.time())# 获取图像数据image = converter.Convert(grabResult) # 进行图像格式转转img = image.GetArray() ...
# 主程序
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())
# 注册回调函数
camera.RegisterImageEventHandler(SampleImageEventHandler(), pylon.RegistrationMode_Append, pylon.Cleanup_Delete)
camera.Open()
# 开始采图
camera.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
while camera.IsGrabbing():grabResult = camera.RetrieveResult(1000, pylon.TimeoutHandling_ThrowException)
# 关闭相机
camera.StopGrabbing()
camera.Close()

可以看到,由于主动使用辅助线程来进行相机数据获取,其时间间隔稳定性比不使用回调函数略好

硬件触发

可使用ms以下级精度的恒温晶振(但其每天会发生1sec的漂移),也可使用具有卫星授时的精确时钟(秒级时间同步)。

参考Python代码为(这里用软件触发模拟硬件触发):

time_sys = []
# 定义图像格式转换器
converter = pylon.ImageFormatConverter()
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
# 定义图像获取时的回调函数
class SampleImageEventHandler(pylon.ImageEventHandler):def OnImageGrabbed(self, camera, grabResult):# 获取系统时间time_sys.append(time.time())# 获取图像数据image = converter.Convert(grabResult) # 进行图像格式转转img = image.GetArray() ...
# 主程序
camera = pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice())
# 注册回调函数
camera.RegisterImageEventHandler(SampleImageEventHandler(), pylon.RegistrationMode_Append, pylon.Cleanup_Delete)
camera.Open()
# 配置相关参数
camera.AcquisitionMode.SetValue('Continuous')
camera.TriggerSelector.SetValue('FrameStart')
camera.TriggerMode.SetValue('On')
camera.AcquisitionFrameRateEnable.SetValue(False)
#camera.TriggerSource.SetValue('Line1')
camera.TriggerSource.SetValue('Software')
camera.ExposureMode.SetValue('Timed')
camera.ExposureTimeAbs.SetValue(20000.0)
# 开始采图
camera.StartGrabbing(pylon.GrabStrategy_OneByOne, pylon.GrabLoop_ProvidedByInstantCamera)
camera.AcquisitionStart.Execute(True)
# 手动定时触发
for k in range(50000):time.sleep(50/1000) # 睡眠50mscamera.ExecuteSoftwareTrigger() # 触发一次
# 关闭相机
camera.AcquisitionStop.Execute(True)
camera.StopGrabbing()
camera.Close()

九、其他

关于相机的供电,Basler推荐使用PoE供电。也就是说,如果需要同时连接多台相机,比较好的方式是使用能提供PoE供电的网络交互机。由于是多台相机连接到一台交换机,再通过一根网线与工控机连接。所以该交换机必须具有足够的缓冲容量,使其可以保存来自相机的输入数据。还要注意相机传输的Pixel Format设置。网络交换机需要能提供巨型帧,这样最大数据包可达到16 kB。Basler GigE相机和推荐的网络适配器都可以处理巨型帧。为了最大程度地提高网络效率,应将相机配置为所用网络可以处理的最大数据包大小。同时最好关闭防火墙,来最大化数据传输速率
Basler相机在使用过程中会逐渐升温,虽然一小时后,外壳温度趋于稳定并不再升高。但为了确保良好的图像质量,Basler建议不要在高温下操作相机,可以给相机配上风扇或散热片来缓解温升。Basler相机温度的最佳测量点如下图:

总结

以上就是关于工业相机要讲的内容,欢迎大家对本文章进行补充和指正。

参考资料

《Handbook of Machine and Computer Vision——The Guide for Developers and Users》,Alexander Hornberg,Wiley
《机器视觉算法与应用》,清华大学出版社
《数字光学测量技术和应用》,国防工业出版社
《数码相机中的图像传感器和信号处理》,清华大学出版社
《智能CMOS图像传感器与应用》,清华大学出版社
《海康机器视觉认证工程师官方资料》
《大恒相机图像质量调节说明书》
Basler官网文档,https://zh.docs.baslerweb.com/
https://blog.csdn.net/weixin_45023620/article/details/122289702
https://blog.csdn.net/qq_23107577/article/details/113258116

机器视觉系列(四)——相机部分(精简版)相关推荐

  1. 【不忘初心】Win11_21H2_22000.100_X64_四合一[纯净精简版][2.9G](2021.8.5)

    此版更新补丁未知,WIN11全新的UI界面出炉!可以说这一次Windows 11全新升级,无论是从Logo上还是UI界面设计,都有很大的变化,不过WIN11目前还不够稳定,小问题比较多!母版来自MSD ...

  2. 【不忘初心】Windows11 22000.318 X64 四合一[纯净精简版][2.62G](2021.11.10)

    此版可正常更新补丁,WIN11全新的UI界面出炉!可以说这一次Windows 11全新升级,无论是从Logo上还是UI界面设计,都有很大的变化,母版来自UUP WIN11_22000.318,为了保证 ...

  3. 微信跳一跳高分系列四:一个 JAVA 版开源的微信跳一跳辅助工具

    基于前三篇文章,我们一起来制作一个自动化工具,解放劳动力,通过机器自动完成跳一跳 wechat-jump-helper 一款JAVA版开源的微信跳一跳小程序辅助工具 传送门一:wechat-jump- ...

  4. NOSQL系列-Redis精简版安装与Ruby测试

    简介:Redis是一个NOSQL数据库,它是一款key-values存储型数据库,也叫"memcached改进版",它不同与memcached最大特点是它由内存+硬盘来存储数据的, ...

  5. 天敏T2四核精简版固件(安卓)_机顶盒使用指南(转载)

    天敏T2四核精简版固件(安卓) . 固件说明: 1.适用于天敏T2四核.LT390W云四核(4G\8G通用).T5四核版 2.需准备一条双公头USB线 安卓固件刷机方法 刷机需自备一条双公头USB线( ...

  6. Deepin XP V5系列完美精简版合集

    Deepin XP V5系列完美精简版合集(fs2you下载) 文件:618m  7e19229e7ed6260a4d608243b23eccbf  DeepinXP-V5.iso 下载:http:/ ...

  7. Java-单机版的书店管理系统(练习设计模块和思想_系列 四(2) )

    Java-单机版的书店管理系统(练习设计模块和思想_系列 四(1) ): http://blog.csdn.net/qq_26525215/article/details/51116429 Java- ...

  8. 机器视觉系列(五)——镜头部分

    系列文章目录 机器视觉系列(一)--概述 机器视觉系列(二)--机械部分 机器视觉系列(三)--电气部分 机器视觉系列(四)--相机部分 文章目录 系列文章目录 前言 一.什么是工业镜头 二.工业镜头 ...

  9. Photoshop 2021 22.4.3 精简版

    软件介绍 Adobe Photoshop(简称PS)是全球最流行的图像处理软件,知名图像及照片后期处理大型专业软件.Adobe Photoshop 是 Adobe Creative Cloud 创意云 ...

最新文章

  1. Dapper的基本使用 [转]
  2. Websocket总结
  3. 2018年11月份GitHub上最热门的开源项目
  4. 恢复mysql数据库详细图解_binlog恢复mysql数据库超详细步骤
  5. 表格状态列_不用软件也能做好多个项目跟进管理?我用一个协同表格就搞定
  6. Vijos P1097 合并果子【哈夫曼树+优先队列】
  7. [渝粤教育] 同济大学 线性代数学习指导 参考 资料
  8. pat A1032:sharing 题解(简单静态链表)
  9. HTML图片跟随鼠标移动代码,网页怎么实现图片跟随鼠标移动
  10. Python 人脸表情识别
  11. iOS经典讲解之Apple Pay开发
  12. 软件测试——界面测试
  13. 以下服务器系统运用呼吸,一种呼吸训练系统
  14. javascript 知识
  15. android购票日历,2017春运购票日历
  16. JavaScript :调用浏览器摄像头 API
  17. Abelssoft SSD Fresh Plus 2021 v10.06.31890 固态硬盘性能优化工具中文版
  18. sio.savemat得到空struct解决方法
  19. Matlab Tips: 高效实用的快捷命令
  20. 网络编程之listen函数

热门文章

  1. 东财《EXCEL在财务工作中的应用》综合作业
  2. 小米模式—互联网思维下的中国“智造”
  3. SC16IS752驱动编写与调试记录
  4. 计算机软件实习项目二 —— 贪吃蛇游戏 (实验准备)
  5. javascript时间戳转日期格式以及浏览器时区问题解决
  6. SSM框架专题-从零入门SpringMVC笔记
  7. php的db类库Eloquent单独使用系列(12)- 结果集模型转数组 - 2
  8. .aspx 通过ajax方式提交HTML富文本
  9. (一)基于Flink电商用户画像项目:项目概述
  10. 浅分析BIG-建筑展示系统