B站 :道传科技上位机 观看教程
一、什么是传统机器视觉
传统机器视觉 是一种通过光学成像设备与计算机算法协同工作,模拟人类视觉感知的技术。其主要目的是实现对目标物体的自动化检测、识别、测量与分析。传统机器视觉系统通常包括四个核心环节:图像采集、图像处理、特征提取和决策执行
技术原理
一、图像采集:通过光源(如可见光、红外光或紫外光)照亮目标物体,使用光学镜头(如定焦镜头或远心镜头)聚焦目标区域,并利用图像传感器(如CCD或CMOS)将光学信号转换为电信号。成像模式可以是单摄像头获取二维平面图像,也可以通过双目视觉或多视角成像实现三维信息采集
二、图像处理:通过均值滤波、中值滤波等算法去除图像噪声,利用直方图均衡化提升目标与背景的对比度,采用边缘检测提取轮廓,通过阈值分割或区域生长算法分离目标与背景,还可以通过透视变换校正图像畸变
三、特征提取:从处理后的图像中提取关键信息,传统方法依赖手工设计特征,如几何特征、纹理特征和颜色特征;随着技术发展,机器学习方法逐渐普及,如HOG+SVM组合和卷积神经网络(CNN)自动提取层次化特征
四、决策执行:基于提取的特征进行逻辑判断并驱动外部设备,例如通过模板匹配对比目标与预存模板判断是否合格,利用尺寸测量功能计算孔径、长度等参数引导机械臂定位,或通过基准对比标记检测图像与良品的差异区域以识别缺陷
二、抓取图像
(方法一)
方法一:使用Halcon的图像获取库
Halcon提供了多种图像获取接口,例如从文件、摄像头、视频文件等。以下是几种常见的方法:
1. 从文件读取图像
read_image(Image, 'path_to_your_image.jpg’)
2. 从摄像头实时获取图像
Halcon支持多种摄像头,你可以使用open_framegrabber函数来打开摄像头。
open_framegrabber('GenICam', 1, 1, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', CameraSetup, FramegrabberHandle)
grab_image(Image, FramegrabberHandle)
close_framegrabber(FramegrabberHandle)
方法二:通过外部摄像头控制软件与Halcon结合使用
如果你使用的是非GenICam兼容的摄像头,或者你需要更复杂的控制(例如通过SDK),你可能需要使用外部的摄像头控制软件(如DirectShow、V4L2等)来获取图像数据,然后将这些数据传递给Halcon。这通常涉及到以下步骤:
使用外部软件获取图像:例如,使用C#或Python编写代码,通过相应的库(如OpenCV)从摄像头捕获图像。
将图像数据传递给Halcon:你可以将图像数据保存为文件(如JPEG或PNG格式),然后使用Halcon的read_image函数读取这些文件。或者,如果你使用的是C++或Python,你可以直接使用Halcon的接口函数(如halconcpp::HObject::ReadImage)来处理图像数据。
MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref stDevList);//扫描相机
item.Value.MV_CC_GetOneFrameTimeout_NET(pBufForDriver, nPayloadSize, ref FrameInfo, 1000);//抓取图像
三、图像预处理
1、图像去噪
使用滤波器(如高斯滤波、中值滤波、均值滤波)去除图像中的噪声。
2、增强对比度
通过直方图均衡化等方法增强图像的对比度,使缺陷更明显
3、二值化
将图像转换为黑白二值图像,便于后续处理。

四、边缘检测
使用边缘检测算法(如Canny、Sobel、Laplace)来识别图像中的边缘,从而定位缺陷。
一、Canny 算子:适用于对边缘检测精度要求较高,同时需要抑制噪声干扰的场景。例如,在工业零件检测中,需要准确地检测零件的轮廓,Canny 算子能够在保证边缘完整性的同时,有效减少噪声的影响。
二、Sobel 算子:对噪声有一定的鲁棒性,适用于一般的图像边缘检测任务,尤其是在需要快速检测边缘方向和强度的场景中。例如,在图像分割前的边缘预处理阶段,Sobel 算子可以快速提取出大致的边缘信息。
三、Laplace 算子:由于对噪声敏感,通常在经过平滑处理后的图像上使用,适用于检测图像中灰度变化剧烈的细节边缘。例如,在医学图像分析中,对于一些细微的组织结构边缘检测,经过适当平滑后使用 Laplace 算子可以检测到这些细节。
四、Roberts 算子:计算简单、速度快,适用于对实时性要求较高且对噪声不太敏感的场景。例如,在一些简单的图像监控系统中,需要快速检测运动物体的大致轮廓,Roberts 算子可以快速给出初步的边缘检测结果。
五、Zero Crossing 算子:基于拉普拉斯过零点检测,能够准确地检测出边缘的位置,适用于对边缘位置精度要求较高的场景,如在高精度的图像测量任务中
edges_sub_pix (GrayImage2, Edges3, 'canny', 2.5, 15, 40) //提取亚像素边缘,得到初始轮廓

五、模板匹配
将待检测图像与预先存储的模板图像进行比较,找出差异区域,识别缺陷。
Shape-Based(基于形状)
Component-Based(基于组件)
Correlation-Based(基于标签)
Deformable(基于可变模型)
create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
set_shape_model_param( : : ModelID, GenParamName, GenParamValue : )
create_aniso_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin, ScaleCMax, ScaleCStep, Optimization, Metric, Contrast, MinContrast : ModelID)
create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

六、特征提取
1.边缘特征 (提取轮廓或线)
定义:一般来说,两个具有不同灰度的均匀图像区域的边界称为边缘。
特征:沿边缘方向的灰度变换比较平缓,而沿边缘法线方向的灰度变换比较剧烈。
2 区域特征
机器视觉中的区域是指具有一定的界限,且内部表现出明显不的相似性和连续性,与外部具有显著的差异性的一块连通区域。
常见的区域特征有:圆度、矩形度、紧密度、面积、重心、几何矩、外接椭圆
3. 纹理特征
举例说明,输入的是一幅灰度图像,分别选取其中两个矩形区域的灰度图像,分析其灰度变化。首先选取灰度变化较为明显的矩形1,然后选取灰度变化比较平滑的矩形2,生成灰度共生矩阵,观察二者的参数。
4. 灰度直方图特征
概念:灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。
5.图像的颜色特征
机器视觉中常用的颜色模型有RGB(红,绿,蓝)模型、HIS(色调、亮度、饱和度)模型、HSV(色调、饱和度、亮度)模型等。
六、特征提取
下图的图一是边缘提取的案例 首先提取亚像素轮廓 edges_sub_pix 然后 select_shape 提取圆
中间提取螺丝帽 首先阈值分割 threshold 然后 select_shape
最后颜色提取 直接采用 threshold 进行颜色提取

七、形态学处理
在图像处理领域,形态学操作是一种基于形状的分析技术,广泛应用于图像分析、计算机视觉和图像预处理等领域。在 Halcon 中,形态学操作可以通过其提供的内置函数实现,这些操作包括膨胀(Dilation)、腐蚀(Erosion)、开运算(Opening)、闭运算(Closing)、顶帽变换(Top-hat)和黑帽变换(Black-hat)等。
1. 膨胀(Dilation)
膨胀操作通过将结构元素放置在图像的每个点上,并计算覆盖区域的最大值来增加图像的亮区域。这常用于填补小的黑洞或断开区域。
read_image(Image, 'path/to/your/image')
dilation_circle(Image, Region, 3, 'margin')
2. 腐蚀(Erosion)
腐蚀操作通过将结构元素放置在图像的每个点上,并计算覆盖区域的最小值来减小图像的亮区域。这常用于去除小的亮斑或断开区域。
read_image(Image, 'path/to/your/image')
erosion_circle(Image, Region, 3, 'margin')
3. 开运算(Opening)
开运算是先腐蚀后膨胀的操作,用于去除小的亮斑并断开狭窄的连接区域。
read_image(Image, 'path/to/your/image')
opening_circle(Image, Region, 3)
4. 闭运算(Closing)
闭运算是先膨胀后腐蚀的操作,用于填补小的黑洞和断开区域。
read_image(Image, 'path/to/your/image')
closing_circle(Image, Region, 3)
5. 顶帽变换(Top-hat)
顶帽变换是原图像减去开运算的结果,常用于突出比邻近亮的区域更亮的区域。
read_image(Image, 'path/to/your/image')
top_hat_trans(Image, Region, ImageTopHat, 3)
6. 黑帽变换(Black-hat)
黑帽变换是闭运算的结果减去原图像,常用于突出比邻近暗的区域更暗的区域。
read_image(Image, 'path/to/your/image')
black_hat_trans(Image, Region, ImageBlackHat, 3)
使用结构元素
在上述代码中,dilation_circle, erosion_circle, opening_circle, closing_circle 等函数中的 3 表示结构元素的大小(例如,一个半径为3的圆形)。你也可以使用其他形状的结构元素,如矩形、十字形等,只需将函数中的 circle 替换为相应的形状名称,并可能需要调整参数以适应不同的形状大小。例如:
dilation_rectangle1(Image, Region, 5, 2) // 使用一个长5、宽2的矩形结构元素

八、阈值分割
在图像处理领域,阈值分割是一种常用的技术,用于将图像分割成前景和背景。在Halcon中,阈值分割可以通过多种方式实现,包括使用全局阈值、局部阈值(如自适应阈值)和基于图像特征的阈值计算方法。以下是一些在Halcon中实现阈值分割的常见方法:
1. 使用全局阈值
全局阈值是最简单的阈值分割方法,它使用一个固定的阈值将图像分为前景和背景。在Halcon中,可以使用threshold操作符来实现。
read_image(Image, 'path_to_image')
threshold(Image, Region, 128) // 使用128作为全局阈值
dev_display(Region)
2. 使用局部阈值(自适应阈值)
自适应阈值方法根据图像的局部区域计算阈值,这有助于改善光照变化或纹理丰富的图像的分割效果。Halcon提供了otsu_threshold和dynamic_threshold等操作符来实现自适应阈值。
使用Otsu方法
read_image(Image, 'path_to_image')
otsu_threshold(Image, Region, 100, 'light') // 'light'表示亮区域使用Otsu方法
dev_display(Region)
使用动态阈值
read_image(Image, 'path_to_image')
dynamic_threshold(Image, Region, 25, 75, 'light') // 动态阈值,参数25和75控制窗口大小和亮度调整
dev_display(Region)
3. 基于图像特征选择阈值
有时,你可能需要根据图像的某些特征(如直方图、灰度分布等)来手动选择一个合适的阈值。这通常涉及到查看图像的灰度分布并选择一个能够最好地区分前景和背景的阈值。
read_image(Image, 'path_to_image')* 查看图像的灰度直方图以选择合适的阈值 *
threshold(Image, Region, 150) // 根据观察选择的阈值
dev_display(Region)
4. 使用形态学操作改善分割结果
有时,简单的阈值分割可能产生不连续或噪点较多的区域。通过应用形态学操作(如膨胀、腐蚀、开运算、闭运算等),可以改善这些区域。
read_image(Image, 'path_to_image')
threshold(Image, Region, 128)
dilation_circle(Region, RegionDilated, 2.5) // 使用圆盘结构元素进行膨胀操作
dev_display(RegionDilated)
这些方法可以帮助你在Halcon中实现有效的阈值分割。选择哪种方法取决于你的具体需求以及图像的特性

九、区域生长
区域生长法也称为区域生成法,其基本思想是将一幅图像分成许多小的区域,并将具有相似性质的像素集合起来构成区域。具体来说,就是先在需要分割的区域内找一个种子像素作为生长的起始点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判断)合并到种子像素所在的区域中;最后将这些新像素作为新的种子像素继续进行上述操作,直到没有满足条件的像素可被合并进来为止,图像分割随之完成。区域生长法的实质就是把具有某种相似性质的像素连通起来,从而构成最终的分割区域。该方法利用了图像的局部空间信息,可有效克服其他方法存在的图像分割空间不连续的缺点。
Mean-image 均值滤波 提取相似像素 regiongrowing 寻找颜色相似区域

十、Blob分析
Blob的定义:Blob是图像中具有相同或相似属性的连通区域(例如相同的灰度值、颜色或纹理)。
Blob分析的步骤
1、预处理:
去噪(如高斯滤波、中值滤波)。
增强对比度或调整光照不均。
2、二值化:
将图像转换为黑白二值图(例如通过阈值分割),使目标区域(Blob)与背景分离。
3、连通区域标记:
扫描图像,为每个连通区域分配唯一标签(如使用种子填充法或两次扫描算法)。
4、特征提取:
计算每个Blob的特征,例如:
几何特征:面积、周长、质心、外接矩形、长宽比、圆形度。
灰度/颜色特征:平均灰度、颜色分布。
高阶特征:方向(主轴)、矩(用于形状描述)。
5、筛选与分析:
根据特征过滤无关区域(例如排除面积过小的噪声点)。
分类或统计目标Blob的数量、位置、形状等。
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)

4万+

被折叠的 条评论
为什么被折叠?



