我是靠谱客的博主 不安毛豆,这篇文章主要介绍自动对焦算法(OpenCV实现),现在分享给大家,希望可以做个参考。

看了一篇用halcon实现自动对焦算法的文章,

自动对焦算法_thisiszdy的博客-CSDN博客_自动对焦算法

文中提到了五个评价函数,评价值越高,图像即越清晰,配合控制电机或其他,通过拍摄多张照片,分析其评价值,可实现自动对焦。

我这边用opencv实现下这篇文章提到的几个方法。

C++代码如下:

①、Tenegrad函数

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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; }

②、方差函数

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
case 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
11
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函数

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
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函数

在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
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!

最后

以上就是不安毛豆最近收集整理的关于自动对焦算法(OpenCV实现)的全部内容,更多相关自动对焦算法(OpenCV实现)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(86)

评论列表共有 0 条评论

立即
投稿
返回
顶部