************************************************************************************************
************************************************************************************************ * 例程:detect_indent_fft.hdev * . 说明:这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行目标(缺陷)的检测,大致分为三步: * . 首先,我们用高斯滤波器构造一个合适的滤波器(将原图通过高斯滤波器滤波); * . 然后,将原图和构造的滤波器进行快速傅里叶变换; * . 最后,利用形态学算子将缺陷表示在滤波后的图片上(在缺陷上画圈)。 * 注:代码中绿色部分为个人理解和注释,其余为例程中原有代码 * 算法讲解:在实际的表面缺陷检测系统中,针对的检测表面很多是具有一定纹理的比如:布匹、皮革、塑料等,
* 针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的
* 纹理完全相同。因此,本例程的算法通过将图像变换到频域进行处理,提取缺陷分量后反变换到时域,
* 获得缺陷的具体位置。 * 高斯滤波器:在本算法中,在一开始就构造了两个高斯滤波器,高斯滤波器是一种线性平滑滤波器,适用于消除高斯噪声。
* 滤波器的实质是对信号进行滤波,滤除不需要的部分,得到想要的部分。一个低通的滤波器可以滤除高频信号,
* 对于图像来说,噪声和边缘往往集中在高频分量,因此低通能够降噪,但是也能造成图像的模糊。 * 本文关键:本文的关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。这就需要保证在实际
* 的待检测表面中缺陷所处的频率范围要和背景以及噪声有明显的差异,并且带阻的频率选择要合适。通过带阻滤
* 波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,进行傅里叶反变换后重构的图像就是
* 缺陷图像,经过简单的分割就能很容易得到缺陷了。 ***********************************************************************************************
*********************************************************************************************** ** Initialization(初始化) ********* dev_update_off(): 这一句包含如下三个算子:
* dev_updata_pc(‘off’) 关闭更新程序计数器
* dev_updata_var(‘off’) 关闭更新变量窗口
* dev_updata_window(‘off’) 关闭更新图像窗口(即通过命令来显示想要在图像窗口显示的图片)
dev_update_off() ********* dev_close_window(): 关闭活动的图像窗口
dev_close_window() * 参数说明:为读入图片命名(Image)
* 文件名(’plastics/plastics_01’)
read_image(Image,'plastics/plastics_01') * 参数说明:之前读入或生成的图片(Image)
* 图片的宽(Width)
* 图片的高(Height)
get_image_size(Image,Width,Height) //获取图片的长宽; * 打开一个新的图像窗口
* 参数说明:起始坐标(,)
* 大小(Width,Height)
* 背景颜色(’Black’)
* 窗口句柄(WindowHandle)
dev_open_window(, , Width, Height, 'black', WindowHandle) *设置不依赖操作系统的字体
*参数说明:窗口句柄(WindowHandle)
* 字体大小()
* 字体类型(’mono’)
* 是否黑体(’ture’)
* 是否倾斜(’false’)
set_display_font(WindowHandle, , 'mono', 'true', 'false') *定义区域填充模式
*参数说明:填充模式(’Margin'或者'Fill’)
dev_set_draw ('margin') *设置输出区域轮廓线的线宽
*可以修改参数来看最后缺陷区域标示的区别
dev_set_line_width() *设置一种或者多种输出颜色
dev_set_color('red') *Optimize the fft speed for the specific image size(根据指定图像大小进行fft速度最优化)
*参数说明:图片大小(Width,Height)
* 优化模式(’standard’)
optimize_rft_speed(Width,Height,'standard') //对指定大小的图片的fft速度进行优化 *Construct a suitable filter by combining two Gaussian filters(结合两个高斯滤波器构造一*个合适的滤波器)
Sigma1 := 20.0
Sigma2 := 3.0 //定义两个常量 * 如何知道缺陷的频率范围->选用适合的滤波器
* 、
* 、
* 、 *在频域生成两个高斯滤波器
*参数说明: 生成的高斯滤波器(GaussFilter)
* 空域中高斯在主方向上的标准差[Sigma1 >= ]
* 空域中高斯在正交于主方向的方向上的标准差[Sigma2 >= ]
* 滤波器主方向的角度[0.0]
* 滤波器的规范['n', 'none' ]
* 直流项在频域的位置['dc_center', 'dc_edge', 'rft' ]
* 图片的大小(Width,Height)
*高斯函数 高斯-平滑滤波器 无论在空间域还是在频率域都是十分有效的低通滤波器 高斯函数具有五个十分重要的性质,它们是:
* ()二维高斯函数具有旋转对称性 ,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,
* 因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测 中不会偏向任一方向.
* ()高斯函数是单值函数.这表明,高斯滤波器用像素邻域 的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.
* 这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子 中心很远的像素点仍然有很大作用,则平滑运算会使图像失真.
* ()高斯函数的付立叶变换频谱 是单瓣的.正如下面所示,这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.
* 图像常被不希望的高频信号 所污染(噪声和细纹理 ).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.
* 高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号.
* ()高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带 就越宽,
* 平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷.
* ()由于高斯函数的可分离性,大高斯滤波器可以得以有效地实现.二维高斯函数卷积 可以分两步来进行,
* 首先将图像与一维 高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性 增长而不是成平方增长. * 调节Sigma1和Sigma2,其中:
* 、调节Sigma1:
* 、调节Sigma1:
* 、调节Sigma1与调节Sigma2关系:
gen_gauss_filter(GaussFilter1,Sigma1,Sigma1,0.0,'none','rft',Width,Height)
gen_gauss_filter(GaussFilter2,Sigma2,Sigma2,0.0,'none','rft',Width,Height) *两图片相减(灰度)
*sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
*g' := (g1 - g2) * Mult + Add
*以上为函数原型以及运算公式
sub_image(GaussFilter1,GaussFilter2,Filter,,) *Process the images iteratively(对图像进行迭代运算)
NumImages := for Index := to NumImages by *Read an image and convert it to gray values
read_image(Image,'plastics/plastics_'+Index$'') *将原图转化为灰度图,第一个参数为原图
rgb1_to_gray(Image,Image) *Perform the convolution in the frequency domain
*对计算一幅图片实部进行快速傅里叶变换
*参数说明:输入的图片(Image)
* 傅里叶变换后输出的图片(ImageFFT)
* 变换方向(’to_freq'或'from_freq’)
* 变换因子的规范(’none’)
* 输出图片的数据类型(’complex’)
* 图片的宽(Width)
rft_generic(Image,ImageFFT,'to_freq','none','complex',Width) *参数说明:输入的图片(ImageFFT)
* 频域滤波器(Filter)
* 运算后输出的结果
*对图片用一个滤波器在频域进行卷积运算
convol_fft(ImageFFT,Filter,ImageConvol) *对滤波后的图片进行傅里叶反变换
rft_generic(ImageConvol,ImageFiltered,'from_freq','n','real',Width) *Process the filtered image
*参数说明:输入的图片(ImageFiltered)
* 输出的灰度范围图(ImageResult)
* 矩形掩膜大小(,)
gray_range_rect(ImageFiltered,ImageResult,,)//用一个矩形掩膜计算像素点的灰度范围 *判断区域内灰度值的最大和最小值
* ???? min_max_gray
*参数说明:
* 待分析图片区域(ImageResult)
* 图片(ImageResult)
* 被去除的直方图两边像素点所
* 占总像素数的百分比()
* 得到的最小值最大值及灰度值范围(Min,Max,Range)
min_max_gray(ImageResult,ImageResult,,Min,Max,Range) *利用全局阈值对图像进行分割
*参数说明:输入的图片(ImageResult)
* 分割后得到的区域(RegionDynThresh)
* 阈值(max([5.55,Max*0.8]),)
* 公式:MinGray <= g <= MaxGray
threshold(ImageResult,RegionDynThresh,max([5.55,Max*0.8]),) *计算区域内的连通部分
*参数说明:输入的图片(RegionDynThresh)
* 得到的连通区域(ConnectedRegions)
connection(RegionDynThresh,ConnectedRegions) *根据指定的形态特征选择区域
*参数说明:输入的图片(ConnectedRegions)
* 满足条件的区域(SelectedRegions)
* 将要计算的形态特征(’area’)
* 独立特征间的连接关系(’and’)
* 特征的最小限制()
* 特征的最大限制()
select_shape(ConnectedRegions,SelectedRegions,'area','and',,) *返回包含所有区域的集合
*参数说明:包含所有区域的待计算区域的图片(tedRegions)
* 所有输入区域合(RegionUnion)
union1(SelectedRegions,RegionUnion) *用一个圆圈来封闭一个区域
*参数说明:将要被封闭的区域(RegionUnion)
* 被封闭的区域(RegionClosing)
* 圆圈的半径()
closing_circle(RegionUnion,RegionClosing,) connection(RegionClosing,ConnectedRegions1) select_shape(ConnectedRegions1,SelectedRegions1,'area','and',,) * 计算区域的面积以及中心位置
*参数说明:待计算的区域(SelectedRegions1)
* 区域的面积(Area)
* 区域中心的行(Row)
* 区域中心的列(Column)
area_center(SelectedRegions1,Area,Row,Column) *Display the results
dev_display(Image) //显示原图
Number := |Area| //将区域面积赋给Number用于后面检查是否存在缺陷
if(Number) *构造一个与设定的圆弧或圆相一致的边界
*参数说明:生成的边界(ContCircle)
* 圆弧或圆的中心坐标(Row,Cloumn)
* 圆弧或圆的半径(gen_tuple_const(Number,))
* 圆弧或圆的起始角度(gen_tuple_const(Number,))
* 圆弧或圆的结束角度(gen_tuple_const(Number,rad()))
* 不明白是什么意思
* 相邻两点间的距离()
gen_circle_contour_xld(ContCircle,Row,Column,gen_tuple_const(Number,),gen_tuple_const(Number,), gen_tuple_const(Number,rad()),'positive',) ResultMessage := ['Not OK',Number + 'defect(s) found'] Color := ['red','black'] dev_display(ContCircle) else ResultMessage := 'OK' Color := 'forest green' endif disp_message(WindowHandle,ResultMessage,'window',,,Color,'true') if(Index#NumImages) disp_continue_message(WindowHandle,'black','true') stop() endif endfor
  1. ************************************************************************************************
  2. ************************************************************************************************
  3. *  例程:detect_indent_fft.hdev
  4. * 1. 说明:这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行目标(缺陷)的检测,大致分为三步:
  5. * 2. 首先,我们用高斯滤波器构造一个合适的滤波器(将原图通过高斯滤波器滤波);
  6. * 3. 然后,将原图和构造的滤波器进行快速傅里叶变换;
  7. * 4. 最后,利用形态学算子将缺陷表示在滤波后的图片上(在缺陷上画圈)。
  8. * 注:代码中绿色部分为个人理解和注释,其余为例程中原有代码
  9. * 算法讲解:在实际的表面缺陷检测系统中,针对的检测表面很多是具有一定纹理的比如:布匹、皮革、塑料等,
  10. *         针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的
  11. *         纹理完全相同。因此,本例程的算法通过将图像变换到频域进行处理,提取缺陷分量后反变换到时域,
  12. *         获得缺陷的具体位置。
  13. * 高斯滤波器:在本算法中,在一开始就构造了两个高斯滤波器,高斯滤波器是一种线性平滑滤波器,适用于消除高斯噪声。
  14. *          滤波器的实质是对信号进行滤波,滤除不需要的部分,得到想要的部分。一个低通的滤波器可以滤除高频信号,
  15. *          对于图像来说,噪声和边缘往往集中在高频分量,因此低通能够降噪,但是也能造成图像的模糊。
  16. * 本文关键:本文的关键就是使用两个低通滤波器,进行相减后构造了一个带阻滤波器来提取缺陷分量。这就需要保证在实际
  17. *         的待检测表面中缺陷所处的频率范围要和背景以及噪声有明显的差异,并且带阻的频率选择要合适。通过带阻滤
  18. *         波后获得的频率成分对背景中的纹理要有明显的抑制,并且突出缺陷成分,进行傅里叶反变换后重构的图像就是
  19. *         缺陷图像,经过简单的分割就能很容易得到缺陷了。
  20. ***********************************************************************************************
  21. ***********************************************************************************************
  22. ** Initialization(初始化)
  23. ********* dev_update_off():   这一句包含如下三个算子:
  24. * dev_updata_pc(‘off’)        关闭更新程序计数器
  25. * dev_updata_var(‘off’)       关闭更新变量窗口
  26. * dev_updata_window(‘off’)    关闭更新图像窗口(即通过命令来显示想要在图像窗口显示的图片)
  27. dev_update_off()
  28. ********* dev_close_window(): 关闭活动的图像窗口
  29. dev_close_window()
  30. * 参数说明:为读入图片命名(Image)
  31. *         文件名(’plastics/plastics_01’)
  32. read_image(Image,'plastics/plastics_01')
  33. * 参数说明:之前读入或生成的图片(Image)
  34. *         图片的宽(Width)
  35. *         图片的高(Height)
  36. get_image_size(Image,Width,Height)        //获取图片的长宽;
  37. * 打开一个新的图像窗口
  38. * 参数说明:起始坐标(0,0)
  39. *             大小(Width,Height)
  40. *             背景颜色(’Black’)
  41. *             窗口句柄(WindowHandle)
  42. dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
  43. *设置不依赖操作系统的字体
  44. *参数说明:窗口句柄(WindowHandle)
  45. *            字体大小(14)
  46. *            字体类型(’mono’)
  47. *            是否黑体(’ture’)
  48. *            是否倾斜(’false’)
  49. set_display_font(WindowHandle, 14, 'mono', 'true', 'false')
  50. *定义区域填充模式
  51. *参数说明:填充模式(’Margin'或者'Fill’)
  52. dev_set_draw ('margin')
  53. *设置输出区域轮廓线的线宽
  54. *可以修改参数来看最后缺陷区域标示的区别
  55. dev_set_line_width(3)
  56. *设置一种或者多种输出颜色
  57. dev_set_color('red')
  58. *Optimize the fft speed for the specific image size(根据指定图像大小进行fft速度最优化)
  59. *参数说明:图片大小(Width,Height)
  60. *        优化模式(’standard’)
  61. optimize_rft_speed(Width,Height,'standard')    //对指定大小的图片的fft速度进行优化
  62. *Construct a suitable filter by combining two Gaussian filters(结合两个高斯滤波器构造一*个合适的滤波器)
  63. Sigma1 := 20.0
  64. Sigma2 := 3.0        //定义两个常量
  65. * 如何知道缺陷的频率范围->选用适合的滤波器
  66. * 1、
  67. * 2、
  68. * 3、
  69. *在频域生成两个高斯滤波器
  70. *参数说明:    生成的高斯滤波器(GaussFilter)
  71. *            空域中高斯在主方向上的标准差[Sigma1 >= 0]
  72. *            空域中高斯在正交于主方向的方向上的标准差[Sigma2 >= 0]
  73. *            滤波器主方向的角度[0.0]
  74. *            滤波器的规范['n', 'none' ]
  75. *            直流项在频域的位置['dc_center', 'dc_edge', 'rft' ]
  76. *            图片的大小(Width,Height)
  77. *高斯函数 高斯-平滑滤波器 无论在空间域还是在频率域都是十分有效的低通滤波器 高斯函数具有五个十分重要的性质,它们是:
  78. * (1)二维高斯函数具有旋转对称性 ,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,
  79. *     因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测 中不会偏向任一方向.
  80. * (2)高斯函数是单值函数.这表明,高斯滤波器用像素邻域 的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.
  81. *     这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子 中心很远的像素点仍然有很大作用,则平滑运算会使图像失真.
  82. * (3)高斯函数的付立叶变换频谱 是单瓣的.正如下面所示,这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.
  83. *     图像常被不希望的高频信号 所污染(噪声和细纹理 ).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.
  84. *     高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号.
  85. * (4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带 就越宽,
  86. *     平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷.
  87. * (5)由于高斯函数的可分离性,大高斯滤波器可以得以有效地实现.二维高斯函数卷积 可以分两步来进行,
  88. *     首先将图像与一维 高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性 增长而不是成平方增长.
  89. * 调节Sigma1和Sigma2,其中:
  90. * 1、调节Sigma1:
  91. * 2、调节Sigma1:
  92. * 3、调节Sigma1与调节Sigma2关系:
  93. gen_gauss_filter(GaussFilter1,Sigma1,Sigma1,0.0,'none','rft',Width,Height)
  94. gen_gauss_filter(GaussFilter2,Sigma2,Sigma2,0.0,'none','rft',Width,Height)
  95. *两图片相减(灰度)
  96. *sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
  97. *g' := (g1 - g2) * Mult + Add
  98. *以上为函数原型以及运算公式
  99. sub_image(GaussFilter1,GaussFilter2,Filter,1,0)
  100. *Process the images iteratively(对图像进行迭代运算)
  101. NumImages := 11
  102. for Index := 1 to NumImages by 1
  103. *Read an image and convert it to gray values
  104. read_image(Image,'plastics/plastics_'+Index$'02')
  105. *将原图转化为灰度图,第一个参数为原图
  106. rgb1_to_gray(Image,Image)
  107. *Perform the convolution in the frequency domain
  108. *对计算一幅图片实部进行快速傅里叶变换
  109. *参数说明:输入的图片(Image)
  110. *            傅里叶变换后输出的图片(ImageFFT)
  111. *            变换方向(’to_freq'或'from_freq’)
  112. *            变换因子的规范(’none’)
  113. *            输出图片的数据类型(’complex’)
  114. *            图片的宽(Width)
  115. rft_generic(Image,ImageFFT,'to_freq','none','complex',Width)
  116. *参数说明:输入的图片(ImageFFT)
  117. *            频域滤波器(Filter)
  118. *            运算后输出的结果
  119. *对图片用一个滤波器在频域进行卷积运算
  120. convol_fft(ImageFFT,Filter,ImageConvol)
  121. *对滤波后的图片进行傅里叶反变换
  122. rft_generic(ImageConvol,ImageFiltered,'from_freq','n','real',Width)
  123. *Process the filtered image
  124. *参数说明:输入的图片(ImageFiltered)
  125. *            输出的灰度范围图(ImageResult)
  126. *            矩形掩膜大小(10,10)
  127. gray_range_rect(ImageFiltered,ImageResult,10,10)//用一个矩形掩膜计算像素点的灰度范围
  128. *判断区域内灰度值的最大和最小值
  129. *  ???? min_max_gray
  130. *参数说明:
  131. *            待分析图片区域(ImageResult)
  132. *            图片(ImageResult)
  133. *            被去除的直方图两边像素点所
  134. *            占总像素数的百分比(0)
  135. *            得到的最小值最大值及灰度值范围(Min,Max,Range)
  136. min_max_gray(ImageResult,ImageResult,0,Min,Max,Range)
  137. *利用全局阈值对图像进行分割
  138. *参数说明:输入的图片(ImageResult)
  139. *            分割后得到的区域(RegionDynThresh)
  140. *            阈值(max([5.55,Max*0.8]),255)
  141. *            公式:MinGray <= g <= MaxGray
  142. threshold(ImageResult,RegionDynThresh,max([5.55,Max*0.8]),255)
  143. *计算区域内的连通部分
  144. *参数说明:输入的图片(RegionDynThresh)
  145. *            得到的连通区域(ConnectedRegions)
  146. connection(RegionDynThresh,ConnectedRegions)
  147. *根据指定的形态特征选择区域
  148. *参数说明:输入的图片(ConnectedRegions)
  149. *            满足条件的区域(SelectedRegions)
  150. *            将要计算的形态特征(’area’)
  151. *           独立特征间的连接关系(’and’)
  152. *           特征的最小限制(4)
  153. *            特征的最大限制(99999)
  154. select_shape(ConnectedRegions,SelectedRegions,'area','and',4,99999)
  155. *返回包含所有区域的集合
  156. *参数说明:包含所有区域的待计算区域的图片(tedRegions)
  157. *           所有输入区域合(RegionUnion)
  158. union1(SelectedRegions,RegionUnion)
  159. *用一个圆圈来封闭一个区域
  160. *参数说明:将要被封闭的区域(RegionUnion)
  161. *            被封闭的区域(RegionClosing)
  162. *            圆圈的半径(10)
  163. closing_circle(RegionUnion,RegionClosing,10)
  164. connection(RegionClosing,ConnectedRegions1)
  165. select_shape(ConnectedRegions1,SelectedRegions1,'area','and',10,99999)
  166. * 计算区域的面积以及中心位置
  167. *参数说明:待计算的区域(SelectedRegions1)
  168. *            区域的面积(Area)
  169. *            区域中心的行(Row)
  170. *            区域中心的列(Column)
  171. area_center(SelectedRegions1,Area,Row,Column)
  172. *Display the results
  173. dev_display(Image)        //显示原图
  174. Number := |Area|          //将区域面积赋给Number用于后面检查是否存在缺陷
  175. if(Number)
  176. *构造一个与设定的圆弧或圆相一致的边界
  177. *参数说明:生成的边界(ContCircle)
  178. *           圆弧或圆的中心坐标(Row,Cloumn)
  179. *            圆弧或圆的半径(gen_tuple_const(Number,30))
  180. *            圆弧或圆的起始角度(gen_tuple_const(Number,0))
  181. *            圆弧或圆的结束角度(gen_tuple_const(Number,rad(360)))
  182. *           不明白是什么意思
  183. *           相邻两点间的距离(1)
  184. gen_circle_contour_xld(ContCircle,Row,Column,gen_tuple_const(Number,30),gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)),'positive',1)
  185. ResultMessage := ['Not OK',Number + 'defect(s) found']
  186. Color := ['red','black']
  187. dev_display(ContCircle)
  188. else
  189. ResultMessage := 'OK'
  190. Color := 'forest green'
  191. endif
  192. disp_message(WindowHandle,ResultMessage,'window',12,12,Color,'true')
  193. if(Index#NumImages)
  194. disp_continue_message(WindowHandle,'black','true')
  195. stop()
  196. endif
  197. endfor

Halcon例程detect_indent_fft学习的更多相关文章

  1. Android应用---基于NDK的samples例程hello-jni学习NDK开发

    Android应用---基于NDK的samples例程hello-jni学习NDK开发 NDK下载地址:http://developer.android.com/tools/sdk/ndk/index ...

  2. halcon,C# 学习

    Halcon学习之一:查询图像参数 1.get_grayval ( Image : : Row, Column : Grayval ) 计算Image图像中坐标为(Row,Column)的点的灰度值G ...

  3. 第2季:从官方例程深度学习海思SDK及API

    2.1.官方mppsample的总体分析2.1.sample的整体架构(1)sample其实是很多个例程,所以有很多个main(2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析 ...

  4. 没事别想不开做Halcon视觉工程师 halcon机器视觉如何学习?

    今天我们来听听看来自一个机器视觉工程师的唠叨和吐槽,在这之后,你还想学人工智能,还想学机器视觉?恭喜你,你对人工智能机器视觉是真爱了! 既然自己选择了这条路,那么无论前进路上有多坎坷,跪着也要走完. ...

  5. halcon视频教程如何学习?怎么样才能踏入机器视觉这个行业?

    本人是工作八年的视觉工程师,主要从事Halcon和Visionpro视觉开发,谈谈个人对视觉学习看法: 1.HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,它节约了产品成本,缩短 ...

  6. Halcon 映射校正例程注释(MapImage)

    *关闭窗口 dev_close_window () dev_close_window () *打开指定大小.颜色背景的窗口 dev_open_window (, , /, /, 'black', Wi ...

  7. Halcon学习网

    重码网是一个在线机器视觉学习网站,推出了Halcon,Visionpro机器视觉学习视频教程,视频内容通俗易懂,没有编程基础的同学,照着视频练习,也同样可以学会. 学机器视觉,拿高薪,成就技术大拿.重 ...

  8. Halcon的二维码解码步骤和解码技巧

    一.二维码简介 1 . 类型多样,常见的有QR Code二维码. Data Matrix二维码等. 2.高密度编码,信息容量大. 3.容错能力强,具有纠错功能:二维码因穿孔.污损等引起局部损坏时,照样 ...

  9. halcon——缺陷检测常用方法总结(模板匹配(定位)+差分)

    引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分 光度立体:halcon--缺陷检测常用方法总结(光度立体) - 唯有自己强大 - 博客园 (cnblogs.com) ...

随机推荐

  1. 简述synchronized和java.util.concurrent.locks.Lock的异同?

    主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...

  2. windows7命令行终端获取管理员模式随笔

    非常感谢http://wenku.baidu.com/view/d0e8d2d2240c844769eaee8a.html 背景: 安装了windows7系统后发现有很多命令在命令行模式下运行不了说没 ...

  3. 利用java编写的盲注脚本

    之前在网上见到一个盲注的题目,正好闲来无事,便用java写了个盲注脚本,并记录下过程中的坑 题目源码: <?php header("Content-Type: text/html;ch ...

  4. [DP地狱训练]Pascal山脉

    OJ题号:ZHOJ1055 思路:树状数组. 首先将数据离散化,然后用线段树维护小于当前高度的山峰已经出现过的数量. #include<cstdio> #include<cstrin ...

  5. ubuntu jdk 安装

    sudo add-apt-repository ppa:linuxuprising/java sudo apt-get update sudo apt-get install oracle-java1 ...

  6. Objective-C学习笔记(三)——用Objective-C编写第一个程序:Hello,World!

    不管是哪一个程序猿,或者是学习哪一门计算机语言.写的第一个程序基本上就是Hello World. 今天我们用OC来实现第一个程序:Hello World. 在Xcode中选择新建一个项目,在对话框中选 ...

  7. Voltage Translation for Analog to Digital Interface ADC

    Voltage Translation for Analog to Digital Interface 孕龙逻辑分析仪 ZeroPlus Logic Analyzer How to modify an ...

  8. HTML:Browser 对象

    ylbtech-HTML:Browser 对象 1.返回顶部 1. Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 ...

  9. [Java] Hashtable 源码简要分析

    Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...

  10. 关于select标签曾经踩过的几个坑!

      1.情景展示 select标签,是前端开发界面展示,经常需要用到一个标签,看看下面的坑,你中招了吗? 2.坑区展示 踩坑一:option标签没有声明value属性: 没有声明value属性 < ...