做网站怎么那么难,网站的建设与管理的心得体会,wordpress手机版主题无效,镇江怎么样目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍
在机器视觉的开发中#xff0c;现在有很多通过电机去做相机的聚焦调节#xff0c;对比手工调节#xff0c;自动调节效果更好#xff0c;而且其也能满足设备自动的需求#xff0c;尤… 目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍
在机器视觉的开发中现在有很多通过电机去做相机的聚焦调节对比手工调节自动调节效果更好而且其也能满足设备自动的需求尤其在一些高倍成像的环境下应用场景更广泛图像清晰度是衡量图像质量的一个重要的指标手动调焦的过程是通过人为去判定图像的清晰度调节镜头的焦距使得图像从模糊到清洗再到模糊的过程确定清洗度的峰值自动调焦就是通过算法对采集的每一张图像的清晰度进行评价最终给出图像清晰的峰值从而确定调焦获取的焦距最佳。 常见的图像清晰度评价一般都是基于梯度的方法本文主要介绍Brenner梯度法。 本节使用了30张不同清晰度的图像来模拟相机采图时从对焦模糊到清晰再到模糊的过程。
2、实现方法
2.1 算法实现过程
void MainWindow::AutoFocus(HObject ho_Image)
{HObject ho_ImagePart00, ho_ImagePart20;HObject ho_ImageSub, ho_ImageResult, ho_ImagePart01, ho_ImagePart10;HObject ho_ImageSub1, ho_ImageResult1, ho_ImageSub2, ho_ImageResult2;HTuple hv_I, hv_Width, hv_Height, hv_WindowID;HTuple hv_Value, hv_Deviation;try{GetImageSize(ho_Image,hv_Width,hv_Height);CropPart(ho_Image, ho_ImagePart00, 0, 0, hv_Width, hv_Height-2);ConvertImageType(ho_ImagePart00, ho_ImagePart00, real);CropPart(ho_Image, ho_ImagePart20, 2, 0, hv_Width, hv_Height-2);ConvertImageType(ho_ImagePart20, ho_ImagePart20, real);SubImage(ho_ImagePart20, ho_ImagePart00, ho_ImageSub, 1, 0);MultImage(ho_ImageSub, ho_ImageSub, ho_ImageResult, 1, 0);Intensity(ho_ImageResult, ho_ImageResult, hv_Value, hv_Deviation);double dhv_Deviation.D();QString strDevQString::number(d,f,3);ui-labDev-setText(strDev);//记录最大偏差值if(hv_PreDeviationhv_Deviation){hv_PreDeviationhv_Deviation;}}catch(HalconCpp::HException except){qDebug()except.ProcName().Text()endl;qDebug()except.ErrorMessage().Text()endl;qDebug()except.ErrorCode()endl;}
}如Brenner算法的公式所示首先将图像转换成real类型然后对图像进行图像差处理然后进行图像乘积最后获得平均值及偏差把偏差作为清晰度的评价参数
2.2 模拟采集流程
这里创建一个线程然后使用延时的定时器从文件夹中依次读取30张图像每张图像进行Brenner算法处理。 线程定义如下 camera new CameraCtrl();liveThread new QThread();camera-moveToThread(liveThread);connect(liveThread,QThread::finished,camera,QObject::deleteLater);connect(this,MainWindow::ContinuousGrab,camera,CameraCtrl::HandleContinuousGrab);liveThread-start();然后线程开始后进行连续读取图像处理流程
//读取图像并调用Brenner算法函数
void CameraCtrl::HandleContinuousGrab()
{ HTuple hv_I;HObject ho_Image; for (hv_I1; hv_I30; hv_I1){ReadImage(ho_Image, (E:/Qt_Test/AutoFacus/Buddha/hv_I).png);Delay_MSec(tInter);emit hobjectReady(ho_Image);if(isFocustrue){emit hobjectFocus(ho_Image);}}
}其中定义延时定时器
void CameraCtrl::Delay_MSec(unsigned int msec)
{QEventLoop loop;//定义一个新的事件循环QTimer::singleShot(msec, loop, SLOT(quit()));//创建单次定时器槽函数为事件循环的退出函数loop.exec();//事件循环开始执行程序会卡在这里直到定时时间到本循环被退出
}3、总结
一个好的评价函数需要具有单峰性无偏性灵敏性常见的图像清晰度评价的算法有多种比如Brenner梯度法、Tenegrad梯度法、laplace梯度法、方差法、能量梯度法等等本节只介绍了Brenner梯度法目前反馈的Brenner梯度法效果较好以后有机会会介绍一下其他的方法。
4、代码展示
本小例程的代码放到我的开源gitte项目里欢迎一起学习也希望能收获你的小星星。 AutoFacus源码