Halcon光度立体技术

 在工业领域,表面检测是一个非常广泛的应用领域。在halcon中使用增强的光度立体视觉方法,三维表面检测被加强。利用阴影可方便快速的检测物体表面的缺口或凹痕。 使用光度立体视觉方法可在复杂图像中轻松找到表面缺陷 。

1 光度立体

    典型应用:

    光度立体的典型应用是检测表面中代表缺陷的微小不一致,或者从使用的图像中排除光的方向的影响,例如,用于非平面字符的打印检查。请注意,光度立体不适合绝对高度的重建,即它不能替代典型的3D重建算法,如焦点深度或光片。

    局限性:

    hanlcon的光度立体它基于Woodham的算法,因此一方面假设相机执行正交投影。也就是说,必须使用远心镜头或具有长焦距的镜头。另一方面,它假设每个光源都提供平行且均匀的光束。也就是说,必须使用强度均匀的远心照明光源,或者作为替代的远距离点光源。此外,物体必须具有朗伯反射率特性,即它必须以漫射方式反射入射光。具有镜面反射特性(即镜面或光面)的对象或对象区域无法正确处理,从而导致错误的结果。

    采集:

    带有远心镜头的相机必须正交放置,即垂直于应重建的场景。在采集图像期间,相机相对于场景的方向不得改变。相反,对于至少三个灰度值图像,照明相对于相机的方向必须改变。

    照明方向:

    对于每个图像,照明方向必须指定为参数内的角度Slants和Tilts,它描述了照明相对于场景的方向。

    Slants是相机的光轴与照明方向之间的角度,如下:

    Tilts是在对象平面或任何平行于它的平面内测量的,例如,图像平面。特别是,它描述了从图像中心指向右侧的方向与投射到平面中的光的方向之间的角度。也就是说,在查看图像(或相应的场景)时,倾斜角度为0表示光线来自右侧,倾斜角度为90表示光线来自顶部,倾斜角度为180表示光线来自左侧,依此类推。如下:

    光度立体至少需要三个具有不同照明方向的图像,太多照明方向会导致处理时间增加,最好是4~6个方向,Slants角度在30°~60°之间,Tilts角度均匀分布在物体周围,实际应用中可以如下架设光源:

    用到的算子:


//使用光度立体法重建表面
void PhotometricStereo(const HObject& Images, //输入图像
  HObject* HeightField,               //重建的高度字段
  HObject* Gradient,                  //曲面的梯度场
  HObject* Albedo,                    //表面的反照率
  const HTuple& Slants,               //相机与照明方向之间的角度
  const HTuple& Tilts,                //对象平面内照明方向的角度
  const HTuple& ResultType,           //请求结果的类型
  const HTuple& ReconstructionMethod, //重建方法
  const HTuple& GenParamName,         //一般参数名称
  const HTuple& GenParamValue)        //一般参数设置
//梯度场转平均曲率场
void DerivateVectorField(
  const HObject& VectorField,  //梯度场图像
  HObject* Result,             //返回平均曲率场图像
  const HTuple& Sigma,         //高斯系数
  const HTuple& Component)     //组件计算

2 识别字符

    有的银行卡背面的数字,如果采用常规的Blob分析或者频域等方法,是很难达到目的的,但是采用光度立体就能比较容易的将前景和背景分离。

    测试代码:


dev_update_off ()
ImageFiles := []
ImageFiles[0] := './1.png'
ImageFiles[1] := './2.png'
ImageFiles[2] := './3.png'
ImageFiles[3] := './4.png'
gen_empty_obj (Images)
for Index := 0 to |ImageFiles| - 1 by 1
       read_image (Image, ImageFiles[Index])      
       concat_obj (Images, Image, Images)  
       wait_seconds (0.3)
       *dev_display (Image)
endfor
Slants:=[45,45,45,45]
Tilts:=[0,90,180,270]
* 光度立体法
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, 'all', 'poisson', [], [])
* 梯度场转平均曲率场
derivate_vector_field (Gradient, Result, 1, 'mean_curvature')
* 镜像
mirror_image (Result, Image, 'row')
mirror_image (Image, ImageMirror, 'column')
* 将灰度值分布在0到255之间
scale_image_max (ImageMirror, ImageScaleMax)
* 尝试在频域中继续处理
fft_generic (ImageScaleMax, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
* 得到背景
get_image_size (ImageFFT, Width, Height)
gen_gauss_filter (ImageGauss, 10, 10, 0, 'none', 'dc_center', Width, Height)
gen_lowpass (ImageLowpass, 0.05, 'none', 'dc_center', Width, Height)
convol_fft (ImageFFT, ImageGauss, ImageConvol)
fft_generic (ImageConvol, ImageBackground, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')
* 差分,去掉背景
sub_image (ImageScaleMax, ImageBackground, ImageSub, 1, 128)
median_image (ImageSub, ImageMedian, 'circle', 3, 'mirrored')

***字符识别
gen_rectangle1 (ROI_0, 629.385, 382.235, 852.788, 1515)
reduce_domain (ImageMedian, ROI_0, ImageReduced)
threshold (ImageReduced, Regions, 132, 205)

closing_circle (Regions, RegionClosing, 1.5)
connection (RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','width'], 'and', [850.44,14.96], [2000.01,53.38])
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')

reduce_domain (ImageReduced, SelectedRegions, ImageReduced1)

paint_region (ImageReduced, ImageReduced, WihteBackground, 255, 'fill')
paint_region (SortedRegions, WihteBackground, ImageResult, 0, 'fill')

read_ocr_class_mlp ('Industrial_0-9_NoRej.omc', OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageResult, OCRHandle, Class, Confidence)

dev_display (ImageResult)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
disp_message (WindowHandle, '由光度立体法求得:', 'image', 12, 12, 'black', 'true')
disp_message (WindowHandle, '卡号:'+sum(Class), 'image', 162, 12, 'black', 'true')
dev_update_on ()

结果如下:

3 缺陷检测

    有的表面缺陷检测可以用光度立体法去解决

    测试代码:


*用于检查药物泡罩背面。
*输入4张从药泡背面拍摄的图像
dev_close_window ()
dev_update_off ()
*创建窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*设置字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

* 读取不同角度拍摄的图像
read_image (Images, 'photometric_stereo/blister_back_0' + [1:4])
for I := 1 to 4 by 1
    Message := '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

* 
*应用光度立体仪测定反照率和表面梯度。
*Tilts参数是俯视图看光源的角度
Tilts := [6.1,95.0,-176.1,-86.8]
*Slants参数是主视图看光源的角度
Slants := [41.4,42.6,41.7,40.9]
*请求结果的类型。“梯度”,“反照率”
ResultType := ['gradient','albedo']

*核心算子
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
* 
*显示反照率图像
dev_display (Albedo)
disp_message (WindowHandle, 'Albedo image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
*显示这张图片之后,有很多种方式去检测这张图片

* 计算曲面的高斯曲率
*使用梯度场作为操作符的输入
* derivate_vector_field。
*缺陷通常很容易在曲率图像中检测出来。
derivate_vector_field (Gradient, GaussCurvature, 1, 'gauss_curvature')
*使用区域分割的图像。
regiongrowing (GaussCurvature, Regions, 1, 1, 0.001, 250)
*选择宽度和高度都在150-200之间的图像
select_shape (Regions, TabletRegions, ['width','height'], 'and', [150,150], [200,200])
*形成一个凸形区域
shape_trans (TabletRegions, TabletRegions, 'convex')
*区域进行联合
union1 (TabletRegions, TabletRegions)
*以3.5的圆形进行腐蚀区域(减小region)
erosion_circle (TabletRegions, TabletRegions, 3.5)
*减少图像区域
reduce_domain (GaussCurvature, TabletRegions, ImageReduced)
*计算图像的绝对值(模数)。
abs_image (ImageReduced, ImageAbs)
*阈值分割
threshold (ImageAbs, Region, 0.03, 255)
*圆的闭运算
closing_circle (Region, RegionClosing, 10.5)
*将检测区域进行分离
connection (RegionClosing, ConnectedRegions)
*选择其中像素大小在10-99999之间的区域,就是error区域
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))

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

    结果如下:

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Halcon光度立体是一种基于计算机视觉技术实现三维图像重建的方,其原理是通过基于投影的光度测量技术获取目标场景中的多幅图像,再利用计算机算将这些图像中的信息与物体的几何形状等参数进行匹配和计算,从而得到物体的三维结构图像。 在Halcon光度立体中,首先需要使用光源对目标物体进行照明,然后再利用相机对物体进行拍摄,随后根据拍摄到的物体表面光强度信息进行图像重建。 具体来说,Halcon光度立体利用了物体表面反射光强度与物体深度之间的关系,即反射光强度与光源、物体和相机之间的几何关系有关。使用多个光源和相机可以获得更多的信息,通过对这些信息进行处理和计算可以获得更准确的三维结构信息。 总之,Halcon光度立体基于光度测量技术和计算机算实现三维图像重建,可以应用于工业自动化、机器视觉、医学图像处理等领域,具有很高的实用价值和发展前景。 ### 回答2: Halcon光度立体是一种三维数字影像处理技术,利用多张二维影像和光度信息进行三维重建和计算。该方的原理是将多张拍摄同一场景或物体的影像进行处理,使用不同的光源角度和强度来获得不同的光度信息。然后利用相机标定和三角测量技术,将这些光度信息转换为三维坐标,重建出物体的形状和轮廓。这种方可以用于机器人视觉导航、医学影像分析和制造业质量控制等领域,可以提高三维建模的准确性和效率,从而更好地应用于实际生产和应用。该技术的不足之处是需要特殊的影像采集设备和处理软件,使用成本较高,且对影像采集的要求较严格,需要保证影像间具备良好的匹配性和精度,同时需要考虑到光线和影像色彩等因素的干扰。因此,在实际应用中需要综合考虑各种因素,将该技术与其他三维建模方相结合,以实现更全面的三维建模应用。 ### 回答3: Halcon光度立体是一种基于灰度图像处理技术的三维立体测量方。其原理是通过获取拍摄物体的两幅不同位置或角度的灰度图像,利用两幅图像之间的像素点光强度差异,构建出深度信息。具体步骤如下: 1.获取两幅不同角度或位置的灰度图像。 2.对两幅图像进行预处理,去除噪点和干扰,确保图像质量。 3.在两幅图像中找到对应的像素点,构建出像素点之间的对应关系。 4.计算每个像素点在两幅图像中的光强度差异,用差异值作为该像素点的深度信息。 5.通过对深度信息进行处理和重建,可以得到物体的三维模型。 Halcon光度立体适用于多种应用场景,如机器人视觉导航、自动化生产线控制、工业检测和医学成像等领域。相比于基于激光和结构光的三维测量方Halcon光度立体不需要使用特殊设备,成本较低,实现相对容易,因此被广泛应用和研究。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值