1
0
Fork 0
mirror of https://github.com/hawkeye-stan/msfs-popout-panel-manager.git synced 2024-11-22 13:50:14 +00:00
msfs-popout-panel-manager/Modules/ImageAnalysis.cs
2021-12-02 11:28:01 -05:00

61 lines
2.5 KiB
C#

using AForge.Imaging;
using System;
using System.Drawing;
using System.Linq;
namespace MSFSPopoutPanelManager
{
public class ImageAnalysis
{
public static Point ExhaustiveTemplateMatchAnalysisAsync(Bitmap sourceImage, Bitmap templateImage, float similarityThreshHold, int panelStartingTop, int panelStartingLeft)
{
var x = panelStartingLeft - Convert.ToInt32(templateImage.Width * 1.5);
var y = 0;
var width = Convert.ToInt32(templateImage.Width * 1.5);
var height = sourceImage.Height;
var searchZone = new Rectangle(x, y, width, height);
var point = AnalyzeExpandImageBitmap(sourceImage, templateImage, similarityThreshHold, searchZone);
if (point != Point.Empty)
point.Y += panelStartingTop;
return point;
}
public static Point AnalyzeExpandImageBitmap(Bitmap sourceImage, Bitmap templateImage, float similarityThreshHold, Rectangle searchZone)
{
// Full image pixel to pixel matching algorithm
ExhaustiveTemplateMatching etm = new ExhaustiveTemplateMatching(similarityThreshHold);
TemplateMatch[] templateMatches = etm.ProcessImage(sourceImage, templateImage, searchZone);
if (templateMatches != null && templateMatches.Length > 0)
{
var match = templateMatches.OrderByDescending(x => x.Similarity).First(); // Just look at the first match
var xCoor = match.Rectangle.X + templateImage.Width / 12;
var yCoor = match.Rectangle.Y + templateImage.Height / 4;
return new Point(Convert.ToInt32(xCoor), Convert.ToInt32(yCoor));
}
return Point.Empty;
}
public static float ExhaustiveTemplateMatchAnalysisScore(Bitmap sourceImage, Bitmap templateImage, float similarityThreshHold)
{
// SUSAN corner block matching algorithm
SusanCornersDetector scd = new SusanCornersDetector(50, 8);
var points = scd.ProcessImage(sourceImage);
// process images searching for block matchings
ExhaustiveBlockMatching bm = new ExhaustiveBlockMatching(4, 8);
sourceImage = ImageOperation.ResizeImage(sourceImage, 800, 600);
templateImage = ImageOperation.ResizeImage(templateImage, 800, 600);
var templateMatches = bm.ProcessImage(sourceImage, points, templateImage);
return templateMatches.Count;
}
}
}