using System;
using System.Drawing;
using OpenCvSharp;
using OpenCvSharp.Extensions;
namespace LensAdjustmentTool.Processing
{
public static class FocusAnalyzer
{
public static double CalculateScore(Bitmap focusRoi)
{
if (focusRoi == null) throw new ArgumentNullException(nameof(focusRoi));
using (Mat src = BitmapConverter.ToMat(focusRoi))
using (Mat gray = new Mat())
using (Mat gx = new Mat())
using (Mat gy = new Mat())
using (Mat absX = new Mat())
using (Mat absY = new Mat())
using (Mat gradient = new Mat())
{
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
Cv2.Sobel(gray, gx, MatType.CV_32F, 1, 0, 3);
Cv2.Sobel(gray, gy, MatType.CV_32F, 0, 1, 3);
Cv2.Absdiff(gx, Scalar.All(0), absX);
Cv2.Absdiff(gy, Scalar.All(0), absY);
Cv2.AddWeighted(absX, 0.5, absY, 0.5, 0.0, gradient);
return Cv2.Mean(gradient).Val0;
}
}
}
}