Сравнение изображений и обозначение различийC#

Место общения программистов C#
Ответить
Anonymous
 Сравнение изображений и обозначение различий

Сообщение Anonymous »

У меня есть приложение .NET MAUI, для которого я хочу написать несколько тестов Appium. Раньше у меня были проблемы с изменениями, внесенными в новую версию .NET MAUI, когда макеты ломались и выходили за пределы доступного экрана, а кнопки обрезались и т. д. p>
Поэтому я решил, что мне также нужны тесты, которые захватывают снимок экрана с помощью AppiumDriver.GetScreenshot() и сравнивают его с эталонным снимком экрана в разных ориентациях и так далее.
различия должны быть обнаружены и помечены в выходном изображении (например, Differential.png) и показаны каждое различие в красном прямоугольнике или около того.
Я попробовал это с помощью OpenCvSharp с следующий код ниже.
Но мне все еще интересно, есть ли лучшие доступные библиотеки, которые по-прежнему бесплатны и выполняют эту работу. Я посмотрел GroupDocs.Comparison, который, по крайней мере, было легко реализовать, но тоже не бесплатно.
Во всяком случае, я попробовал следующее:

Код: Выделить всё

using OpenCvSharp;
using OpenQA.Selenium.Appium;

namespace UITests.Android
{
public class AndroidTests : AndroidTestBase
{
[Fact]
public void AndroidSampleTest()
{
CompareImages(App, "D:\\TestScreenshots\\ScreenshotReference.png", "D:\\TestScreenshots\\ScreenshotDifferences.png");
}

public void CompareImages(AppiumDriver driver, string referenceImagePath, string outputDifferencePath)
{
// 1. Take a Screenshot
string screenshotPath = CaptureScreenshot(driver, "D:\\TestScreenshots\\ScreenshotCurrent.png");

// 2. Load image
Mat referenceImage = Cv2.ImRead(referenceImagePath, ImreadModes.Color);
Mat currentImage = Cv2.ImRead(screenshotPath, ImreadModes.Color);

if (referenceImage.Empty() || currentImage.Empty())
{
throw new Exception("One of the Images could not be loaded.");
}

// 3. Scale images to same size if necessary
if (referenceImage.Size() != currentImage.Size())
{
Cv2.Resize(currentImage, currentImage, referenceImage.Size());
}

// 4. Calculate Differences
Mat diff = new Mat();
Cv2.Absdiff(referenceImage, currentImage, diff);

// 5. Bring out differences (detailled processing)
Mat diffGray = new Mat();
Cv2.CvtColor(diff, diffGray, ColorConversionCodes.BGR2GRAY);
Cv2.Threshold(diffGray, diffGray, 20, 255, ThresholdTypes.Binary);  // Threshold for differences
Cv2.Dilate(diffGray, diffGray, null, iterations: 2);                // Bring out the differences

// 6. Identify Rows that are in the Android Emulator blue to ignore this header
List blueStartingRows = new List();
for (int i = 0; i < currentImage.Rows; i++)
{
Vec3b firstPixel = currentImage.At(i, 0);

// Android Blue (R, G, B)
if (firstPixel.Item0 == 152 && firstPixel.Item1 == 11 && firstPixel.Item2 == 43)
{
blueStartingRows.Add(i);
}
else
{
break;
}
}

// 7. Ignore the Rows for the Android Emulator Header
for (int i = 0; i < blueStartingRows.Count; i++)
{
diffGray.Row(blueStartingRows[i]).SetTo(Scalar.All(0)); // Setze die obere Region auf Schwarz (ignoriert Unterschiede)
}

// 8. Find Contours
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(diffGray, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);

// 9. Red rectangle for the differences
foreach (var contour in contours)
{
Rect rect = Cv2.BoundingRect(contour);

// Only makr greatest differences
if (rect.Width > 10 && rect.Height > 10) // Mindestgröße
{
Cv2.Rectangle(currentImage, rect, Scalar.Red, 2); // Rote Rechtecke zeichnen
}
}

// 10.  Same image with differences
Cv2.ImWrite(outputDifferencePath, currentImage);
}

private string CaptureScreenshot(AppiumDriver driver, string screenshotPath)
{
Task.Delay(1000);

// Capture Screenshot with Appium
var screenshot = driver.GetScreenshot();

// Save Screenshot
File.WriteAllBytes(screenshotPath, screenshot.AsByteArray);

return screenshotPath;
}
}
}
Вопросы:
  • Существуют ли лучшие библиотеки ( все еще бесплатен), который можно настроить проще и прозрачнее.
  • Поскольку я также хочу обнаружить цветовые различия, действительно ли хорошей идеей будет выполнить преобразование в Cv2.CvtColor(diff, diffGray, ColorConversionCodes.BGR2GRAY);? (упоминалось, что для обнаружения контуров это будет лучше, но я не знаю, правильно ли это работает)
    Я до сих пор не могу сказать, правильно ли работает описанный выше метод, особенно когда Я хочу обнаружить множество различий внутри других (например, когда есть различия в цвете света во всех буквах «а», например, которые очень близки, поскольку Gray100 был изменен на Gray50 или другие различия в типах света)< /li>
В общем, вопрос в том, порекомендуете ли вы что-нибудь получше...
[img]https://i. sstatic.net/ZLtILmSb.png[/img]


Подробнее здесь: https://stackoverflow.com/questions/791 ... ifferences
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»