看了一篇用halcon实现自动对焦算法的文章,
自动对焦算法_thisiszdy的博客-CSDN博客_自动对焦算法
文中提到了五个评价函数,评价值越高,图像即越清晰,配合控制电机或其他,通过拍摄多张照片,分析其评价值,可实现自动对焦。
我这边用opencv实现下这篇文章提到的几个方法。
C++代码如下:
①、Tenegrad函数
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15case 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; }
②、方差函数
复制代码
1
2
3
4
5
6
7case 1: //方差 { Mat meanImg, stdImg; meanStdDev(grayImg, meanImg, stdImg); OutValue = stdImg.at<double>(0, 0); break; }
③、能量函数
复制代码
1
2
3
4
5
6
7
8
9
10
11case 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函数
复制代码
1
2
3
4
5
6
7
8
9case 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函数
复制代码
1
2
3
4
5
6
7
8
9case 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!
最后
以上就是不安毛豆最近收集整理的关于自动对焦算法(OpenCV实现)的全部内容,更多相关自动对焦算法(OpenCV实现)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复