У меня есть утилита, которую я тестирую с несколькими другими людьми, которая делает снимки экрана другого окна, а затем использует OpenCV для поиска меньших изображений на этом снимке экрана.
Это работает без проблем, однако яЯ пытаюсь сделать его более эффективным, и мне было интересно, а не делать снимок экрана окна каждые X миллисекунд, если бы был способ, которым я мог бы «передать» экран в мое приложение, а затем запустить функцию для каждого нового кадра
Это мой текущий код:
public static bool ContainsImage(Detection p_Detection, out long elapsed)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Image<Gray, byte> imgHaystack = new Image<Gray, byte>(CaptureApplication(p_Detection.WindowTitle));
Image<Gray, byte> imgNeedle = new Image<Gray, byte>(p_Detection.Needle);
if (imgHaystack.Width >= p_Detection.Settings.Resolution || imgHaystack.Height >= p_Detection.Settings.Resolution)
{
imgHaystack = imgHaystack.Resize(imgHaystack.Width / p_Detection.Settings.Scale, imgHaystack.Height / p_Detection.Settings.Scale, Emgu.CV.CvEnum.Inter.Area);
imgNeedle = imgNeedle.Resize(imgNeedle.Width / p_Detection.Settings.Scale, imgNeedle.Height / p_Detection.Settings.Scale, Emgu.CV.CvEnum.Inter.Area);
}
if (imgNeedle.Height < imgHaystack.Height && imgNeedle.Width < imgHaystack.Width)
{
using (Image<Gray, float> result = imgHaystack.MatchTemplate(imgNeedle, Emgu.CV.CvEnum.TemplateMatchingType.CcoeffNormed))
{
result.MinMax(out double[] minValues, out double[] maxValues, out Point[] minLocations, out Point[] maxLocations);
if (maxValues[0] > p_Detection.Settings.MatchThreshold)
{
stopWatch.Stop();
elapsed = stopWatch.ElapsedMilliseconds;
imgHaystack.Dispose();
imgNeedle.Dispose();
return true;
}
}
}
stopWatch.Stop();
elapsed = stopWatch.ElapsedMilliseconds;
imgHaystack.Dispose();
imgNeedle.Dispose();
return false;
}
Я не совсем уверен, что это самый эффективный способ выполнить то, что я пытаюсь, любая помощь будетблестящий.
Спасибо.