看了一篇用halcon实现自动对焦算法的文章,
自动对焦算法_thisiszdy的博客-CSDN博客_自动对焦算法
文中提到了五个评价函数,评价值越高,图像即越清晰,配合控制电机或其他,通过拍摄多张照片,分析其评价值,可实现自动对焦。
我这边用opencv实现下这篇文章提到的几个方法。
C++代码如下:
①、Tenegrad函数
case 0: //Tenegrad函数
{
Mat xgrad;
Mat ygrad;
Sobel(grayImg, xgrad, CV_32F, 1, 0);
Sobel(grayImg, ygrad, CV_32F, 0, 1);
Mat xygrad = xgrad.mul(xgrad) + ygrad.mul(ygrad);
sqrt(xygrad, xygrad);
Mat thMat;
threshold(xygrad, thMat, th, 1, ThresholdTypes::THRESH_BINARY);
Mat resMat = xygrad.mul(thMat);
pow(resMat, 2, resMat);
OutValue = mean(resMat)[0];
break;
}
②、方差函数
case 1: //方差
{
Mat meanImg, stdImg;
meanStdDev(grayImg, meanImg, stdImg);
OutValue = stdImg.at<double>(0, 0);
break;
}
?③、能量函数
case 2: //能量函数
{
Mat kern1 = (Mat_<char>(2, 1) << -1, 1);
Mat kern2 = (Mat_<char>(1, 2) << -1, 1);
Mat engImg1, engImg2;
filter2D(grayImg, engImg1, CV_32F, kern1);
filter2D(grayImg, engImg2, CV_32F, kern2);
Mat resImg = engImg1.mul(engImg1) + engImg2.mul(engImg2);
OutValue = mean(resImg)[0];
break;
}
④、Brenner函数
case 3: //Brenner函数
{
Mat kernBre = (Mat_<char>(3, 1) << -1, 0, 1);
Mat BreImg;
filter2D(grayImg, BreImg, CV_32F, kernBre);
pow(BreImg, 2, BreImg);
OutValue = mean(BreImg)[0];
break;
}
⑤、Laplace函数
case 4: //Laplace函数
{
Mat kernLap = (Mat_<char>(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1);
Mat LapImg;
filter2D(grayImg, LapImg, CV_32F, kernLap);
pow(LapImg, 2, LapImg);
OutValue = mean(LapImg)[0];
break;
}
?OK!
|