配合机台自动对焦
一 原理
图像清晰度是通过边缘锐度来表现,边缘越清晰则图片越清晰,边缘越是模糊则图片便模糊。因此可以计算ROI区域的边缘来判断。一般通用的办法就是上相机从起始位置移动到终止位置,就算每个位置上的ROI梯度值,然后比较出最大梯度值,以最大梯度值的位置作为最佳焦距位置。
计算边缘梯度值代码如下,Matri是自定义存放像素值的二维矩阵
int ImgResolution::brenner(Matrix * src)
{
if (src == nullptr)
return -1;
int ret = 0;
int temp = 0;
unsigned char* data = nullptr;
for (int row = 0; row < src->Height(); row++)
{
data = src->Data() + row * src->Width();
for (int col = 0; col < src->Width() - 2; col++)
{
temp = (*data) - *(data + 2);
ret += temp * temp;
data++;
}
}
return ret;
}
二 具体操作
如果结合机台硬件参数,其实可以不用从起点走到终点,因为镜头工作距离是确点的,最佳焦距位置肯定在这个位置附件,以这个参数做为起点,会更加省时间。
step1.指定计算边缘梯度的ROI区域, 红色线为参考线,一般根据镜头工作距离来确定,。根据参考线生成左右两条直线(两个位置的意思)。由这左右两条直线所在位置的“聚焦值”判断爬坡方向。
step2.如下图这个情况,可以知道此时需要往右边走。而且绿色直线所在的聚焦值会比红色线所在的聚焦值大
step3.直到绿色直线所在的聚焦值比红色线所在的聚焦值小时,便停止爬坡,如下图。此时就可以判定峰值在蓝色、绿色线之间。
step4.但是不能说明峰值在红色、绿色之间,可能会出现以下这种情,这种情况峰值不在红、绿之间。
step5.同理,当出现下面这种情况时,方向向左移动爬坡,直到蓝色线条的值小于红色线条的值时,才停止运动,最终峰值也是在蓝色、绿色之间。
step6.最后区间收敛。可以把这个间距分为若干等份,然后计算每一份位置上的聚焦值,找出最大的那个值的位置。理想情况下,峰值就等于等份中的最大值,可能性比较小。不理想的情况下,峰值落在等份间隔之中,不过此时等份最大值也是比较靠近峰值,肉眼上已经很难分出这种微小的差距。
最后:
原理很简单,根据以上步骤就可以实现相机自动对焦啦