可用于实现自动对焦

open_framegrabber ('Sentech', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'default', -1, 'false', 'default', '0', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
dev_update_off()
dev_close_window()
get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_set_color('red')
Method:='Tenegrad'
while (true)grab_image_async (Image, AcqHandle, -1)dev_display(Image)scale_image_max(Image, Image)if(Method='Deviation')region_to_mean(Image, Image, ImageMean)convert_image_type(ImageMean, ImageMean, 'real')convert_image_type(Image, Image, 'real')sub_image(Image, ImageMean, ImageSub, 1, 0)mult_image(ImageSub, ImageSub, ImageResult, 1, 0)intensity(Image, ImageResult, Value, Deviation)set_tposition(WindowHandle, 24, 12)write_string(WindowHandle, Deviation)elseif(Method='energy')crop_part(Image, ImagePart00,0, 0, Width-1, Height-1)crop_part(Image, ImagePart01,0, 1, Width-1, Height-1)crop_part(Image, ImagePart10,1, 0, Width-1, Height-1)convert_image_type(ImagePart00, ImagePart00, 'real')convert_image_type(ImagePart01, ImagePart01, 'real')convert_image_type(ImagePart10, ImagePart10, 'real')sub_image(ImagePart10, ImagePart00, ImageSub1, 1, 0)mult_image(ImageSub1, ImageSub1, ImageResult1,1, 0)sub_image(ImagePart01, ImagePart00, ImageSub2, 1, 0)mult_image(ImageSub2, ImageSub2, ImageResult2,1, 0)add_image(ImageResult1, ImageResult2, ImageResult, 1, 0)intensity(ImageResult, ImageResult2, Value, Deviation)set_tposition(WindowHandle, 24, 12)write_string(WindowHandle, Deviation)elseif(Method='Tenegrad')sobel_amp(Image, EdgeAmplitude, 'sum_sqrt', 3)min_max_gray(EdgeAmplitude, EdgeAmplitude, 0, Min, Max, Range)threshold(EdgeAmplitude, Region, 50, 255)region_to_bin(Region, BinImage, 1, 0, Width, Height)mult_image(BinImage, BinImage, ImageResult3, 1, 0)mult_image(ImageResult3, ImageResult3, ImageResult4, 1, 0)intensity(ImageResult4, ImageResult4, Value, Deviation)set_tposition(WindowHandle, 24, 12)write_string(WindowHandle, Deviation)endif* Do something
endwhile
close_framegrabber (AcqHandle)
可以用于自动对焦

资料

图像清晰度是衡量图像质量的一个重要指标,对于相机来说,其一般工作在无参考图像的模式下,所以在拍照时需要进行对焦的控制。对焦不准确,图像就会变得比较模糊不清晰。相机对焦时通过一些清晰度评判指标,控制镜头与CCD的距离,使图像成像清晰。一般对焦时有一个调整的过程,图像从模糊到清晰,再到模糊,确定清晰度峰值,再最终到达最清晰的位置。

常见的图像清晰度评价一般都是基于梯度的方法,本文将介绍五种简单的评价指标,分别是Brenner梯度法、Tenegrad梯度法、laplace梯度法、方差法、能量梯度法。

Brenner梯度法

计算相差两个单元的两个像素点的灰度差:

FBrenner=∑M∑N(f(x+2,y)−f(x,y))2
式中 (f(x+2,y)−f(x,y))2>Threshold

算法准确性取决于阈值的选取。

Tenegrad梯度法

采用sobel算子分别提取水平和竖直方向的梯度:

FTenegrad=∑M∑N|G(x,y)|

G(x,y)>Threshold

G(x,y)=Gx(x,y)2+Gy(x,y)2−−−−−−−−−−−−−−−−−√

sobel算子模板如下:

Gx=14⎡⎣⎢−1−2−1000121⎤⎦⎥∗I

Gy=14⎡⎣⎢−101−202−101⎤⎦⎥∗I

Laplace梯度法

laplace梯度函数与Tenegrad基本一致,只需要用Laplace算子替代sobel算子即可:

              L=16⎡⎣⎢1414204141⎤⎦⎥∗I

方差法

聚焦清晰的图像比模糊图像有更大的灰度差异,可用方差函数作为评价:

Fvariance=∑M∑N(f(x,y)−E2)
式中E为整幅图像的平均灰度值,该函数对噪声敏感。

能量梯度法

能量梯度函数适合实时评价图像清晰度:

FBrenner=∑M∑N((f(x+1,y)−f(x,y))2+(f(x,y+1)−f(x,y))2)

实例代码

采用halcon实现:

//方差法

region_to_mean(ImageReduced, Image, ImageMean)

convert_image_type(ImageMean, ImageMean, ‘real’)

convert_image_type(Image, Image, ‘real’)

sub_image(Image, ImageMean, ImageSub, 1, 0)

mult_image(ImageSub, ImageSub, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

//拉普拉斯梯度函数

laplace(Image, ImageLaplace4, ‘signed’, 3, ‘n_4’)

laplace(Image, ImageLaplace8, ‘signed’, 3, ‘n_8’)

add_image(ImageLaplace4, ImageLaplace4, ImageResult1, 1, 0)

add_image(ImageLaplace4, ImageResult1, ImageResult1, 1, 0)

add_image(ImageLaplace8, ImageResult1, ImageResult1, 1, 0)

mult_image(ImageResult1, ImageResult1, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

//能量梯度函数

crop_part(Image, ImagePart00, 0, 0, Width-1, Height-1)

crop_part(Image, ImagePart01, 0, 1, Width-1, Height-1)

crop_part(Image, ImagePart10, 1, 0, Width-1, Height-1)

convert_image_type(ImagePart00, ImagePart00, ‘real’)

convert_image_type(ImagePart10, ImagePart10, ‘real’)

convert_image_type(ImagePart01, ImagePart01, ‘real’)

sub_image(ImagePart10, ImagePart00, ImageSub1, 1, 0)

mult_image(ImageSub1, ImageSub1, ImageResult1, 1, 0)

sub_image(ImagePart01, ImagePart00, ImageSub2, 1, 0)

mult_image(ImageSub2, ImageSub2, ImageResult2, 1, 0)

add_image(ImageResult1, ImageResult2, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

//Brenner梯度法

crop_part(Image, ImagePart00, 0, 0, Width, Height-2)

convert_image_type(ImagePart00, ImagePart00, ‘real’)

crop_part(Image, ImagePart20, 2, 0, Width, Height-2)

convert_image_type(ImagePart20, ImagePart20, ‘real’)

sub_image(ImagePart20, ImagePart00, ImageSub, 1, 0)

mult_image(ImageSub, ImageSub, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

//Tenegrad梯度法

sobel_amp(Image, EdgeAmplitude, ‘sum_sqrt’, 3)

min_max_gray(EdgeAmplitude, EdgeAmplitude, 0, Min, Max, Range)

threshold(EdgeAmplitude, Region1, 20, 255)

region_to_bin(Region1, BinImage, 1, 0, Width, Height)

mult_image(EdgeAmplitude, BinImage, ImageResult4, 1, 0)

mult_image(ImageResult4, ImageResult4, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

结果分析

处理图像为一组对焦从模糊到清晰再到模糊的标定板图像,如下为其中三幅图像:

点击查看原图
中间为最清晰的图像。

采用五种评价函数,对一百多幅图像进行计算,并将结果进行归一化,得到如图所示结果:

点击查看原图
一个好的评价函数需要具有单峰性,无偏性,灵敏性,在本实例中,采用Laplace、能量梯度和Brenner梯度法较好,而方差法效果较差,Tenegrad梯度法反向了。

halcon自动对焦相关推荐

  1. halcon自动对焦算法

    1.介绍 图像清晰度是衡量图像质量的一个重要指标,对于相机来说,其一般工作在无参考图像的模式下,所以在拍照时需要进行对焦的控制.对焦不准确,图像就会变得比较模糊不清晰.相机对焦时通过一些清晰度评判指标 ...

  2. Halcon 自动对焦算法

    1.介绍 图像清晰度是衡量图像质量的一个重要指标,对于相机来说,其一般工作在无参考图像的模式下,所以在拍照时需要进行对焦的控制.对焦不准确,图像就会变得比较模糊不清晰.相机对焦时通过一些清晰度评判指标 ...

  3. 相机自动对焦AF原理

    相机自动对焦AF原理 AF性能是判断相机好坏的重要指标,主要从准确度和速度两个方面来进行考察,本文将介绍自动对焦的几种方式. 一.凸透镜成像原理 二.三种对焦方法 有公式在手,只要给相机安个测距仪就好 ...

  4. halcon与QT联合:(5.3)瓶盖检测以及QT界面搭建

    接着上篇博客的添加资源之后,本次要实现的是鼠标的滚轮功能图片的缩放. 在QT代码中中文乱码的处理方法: qDebuge()<<QString::fromLocal8Bit("这个 ...

  5. halcon与QT联合:(5.2)瓶盖检测以及QT界面搭建

    目录 1.添加按钮.添加资源 1.1添加那妞 1.2.添加资源 1.2.1.准备资源文件 1.2.2.添加资源文件 1.2.3.添加对应的资源代码 在上一个博客5.1中只是做了一个简单的界面,下面我们 ...

  6. halcon与QT联合:(5.1)瓶盖检测以及QT界面搭建

    halcon实现瓶盖检测与定位代码: dev_close_window() dev_open_window(0, 0, 1024, 1024, 'black', WindowHandle) list_ ...

  7. Halcon与QT的联合编程(2)

    在(1)的基础上继续对halcon与QT的联合编程项目进行扩展. 1.添加类的两种方法: 1.1.添加C++类 1.2.添加设计师界面类 QT的设计类他是有界面的.如果有些参数需要修改的话可以在这个界 ...

  8. Halcon与QT的联合编程(1)

    目录 1.halcon代码的封装 2.halcon代码的导出 3.halcon与QT联合编程 3.1.QT工程建立 3.2.qt与halcon联合 1.halcon代码的封装 在对代码进行封装的时候, ...

  9. halcon:(4)halcon中XLD的概念与应用----汽车引擎盖圆孔检测

    xld(extended Line Descriptions):扩展线的描述. 在halcon中经常会用到的两个概念: 1.region简单的理解区域region,就是某种具有结构体性质的二值图,正常 ...

  10. Halcon 点云拟合平面并获取单位法向量及位姿

    确实因为halcon的文档写的太好了,所以网上关于halcon的博客就很少,点云拟合平面的文档上介绍的比较详细,但是如何从平面模型中读取法向量可确实是难到了,找了三个小时人傻了,然后发现还是一行函数. ...

最新文章

  1. vs2019快捷键设置
  2. mysql行锁和表锁
  3. 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块
  4. TreeView数据绑定的方法
  5. luogu3093 牛奶调度
  6. photoshop最全快捷键列表
  7. 用3种方式解决复杂报表
  8. pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
  9. iOS开发之错误码国际化
  10. python3读取pdf文档;pdfminer3k
  11. java发送http请求 utf8_Java 发送http请求(get、post)的示例
  12. 计算机广告设计好不好找工作,大专学广告设计好就业吗 前景怎么样
  13. 一般人不会告诉你的跨境电商货源渠道大全
  14. 《Hadoop系列》脚本开发自动化配置伪分布式Hadoop
  15. C++ 时间函数整理详解
  16. WebView获取当前网页的页面元素
  17. HA状态下防火墙损坏处理
  18. HTML网页一键变黑白色调
  19. FineBI 取日期的最大max、最小值min
  20. 原来你是这样的编辑器|CSDN编辑器测评

热门文章

  1. java dead store_jcip Java并发编程实战源码,这本书名为《 践》有些抹杀了它的价值,其中 Develop 238万源代码下载- www.pudn.com...
  2. Windows U盘插入出现位置不可用 无法访问 拒绝访问
  3. Battleship!
  4. 当上领导以后才明白的事情
  5. 2020年回顾,这一年,不容易
  6. 车架号校验 php代码,VIN车辆识别代码查询
  7. edm java_EDM推送
  8. JS显示当前时间(包含农历时间)
  9. “CSIG 计算机视觉前沿 · 研讨会”于6月28日在百度举行
  10. KGB知识图谱技术能够解决哪些行业痛点?