На C# нужно реализовать метод(ChangePrice) в классе ChangePriceToUp который вызывается нажатием кнопки на форме MainMenu
Поиск числа и проверка пикселя будет происходит в координате 1335, 325 (это верхняя левая точка) размер прямоугольника 100 на 20. Проверка пикселя в этом прямоугольнике на координате 98, 18
Метод должен выполнять следующее:
1. Проверить максимальная ли наша цена цвет пикселя нашей (A, R, G, B): (255, 179, 150, 125), если не наша, то (A, R, G, B): (255, 219, 186, 151), к цвету пикселя нужно дабавить доверительный интервал +- 2. Если цена не наша, то через Emgu.CV и Tesseract нужно распознать число, но перед этим эту часть изображения обработать, увеличить в 3 раза и увеличить контрастность, потому-что окно, в котором распознается число имеет разрешение 100 на 20. Это нужно для правильного распознавания числа. Tesseract нужно настроить чтобы распознавал только числа
2. Используя метод SmoothMove(уже написан) переместить курсор в точку 560, 655 произвести нажатие, и ввод полученного числа к которому прибавляем еще 1
3. Также используя метод SmoothMove переместить курсор в точку 865, 785 и произвести нажатие

Реши эту задачу по порядку. Давай начнем с первого пункта

    public class ChangePricesToUp
    {
        // 
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SetCursorPos(int X, int Y);
        [DllImport("user32.dll", SetLastError = true)]
        static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);
        private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
        private const uint MOUSEEVENTF_LEFTUP = 0x04;
        private const uint MOUSEEVENTF_WHEEL = 0x0800;
        static readonly Random random = new Random();

        
        // x 1340 y 325
        // 
        // Блок распознования цены

        // Блок поправки цен
        public void ChangePrice()
        {
            List<Point> pointsToMove = new List<Point>
        {
            new Point(560, 655), // клик на цену
            new Point(865, 785), // кнопка публиковать
        };

            for (int i = 0; i < pointsToMove.Count; i++)
            {
                Point endPoint = pointsToMove[i];
                SmoothMove(Cursor.Position, endPoint); // Используйте текущую позицию курсора как начальную точку

                // Если это первая точка, произведите клик и введите число
                if (i == 0)
                {
                    Click(); // Симулируем клик ЛКМ
                    Thread.Sleep(300);
                    SendKeys.SendWait("123"); // Введите число 123
                }
                // Если это вторая точка, просто произведите клик
                else if (i == 1)
                {
                    Click(); // Симулируем клик ЛКМ
                }
            }
        }
        private void SmoothMove(Point start, Point end)
        {
            int startX = start.X;
            int startY = start.Y;
            int endX = end.X;
            int endY = end.Y;
            int steps = 25; // Чем больше шагов, тем плавнее кривая

            // Контрольная точка для кривой Безье
            int ctrlX = random.Next(Math.Min(startX, endX), Math.Max(startX, endX));
            int ctrlY = random.Next(Math.Min(startY, endY), Math.Max(startY, endY));

            // Плавное перемещение курсора от начала до конца
            for (int i = 0; i <= steps; i++)
            {
                double t = (double)i / steps;
                double xt = (1 - t) * (1 - t) * startX + 2 * (1 - t) * t * ctrlX + t * t * endX;
                double yt = (1 - t) * (1 - t) * startY + 2 * (1 - t) * t * ctrlY + t * t * endY;
                SetCursorPos((int)xt, (int)yt);
                Thread.Sleep(1);
            }
        }
        private void Click()
        {
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
        }
        public int? CheckPrice()
        {
            using (Bitmap bmpScreenshot = new Bitmap(100, 20, PixelFormat.Format32bppArgb))
            using (Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot))
            {
                gfxScreenshot.CopyFromScreen(1335, 325, 0, 0, new Size(100, 20), CopyPixelOperation.SourceCopy);

                // Тут должен быть ваш метод IsOurNumber (предполагается, что он принимает Bitmap)
                if (IsOurNumber(bmpScreenshot))
                {
                    // Если число наше, то мы не делаем ничего или возвращаем null или специфичное значение
                    return null;
                }
                else
                {
                    // Если число не наше, распознаем его и прибавляем 1
                    try
                    {
                        return RecognizeNumberAndAddOne(bmpScreenshot);
                    }
                    catch (Exception ex)
                    {
                        // Обработка ошибки
                        Console.WriteLine(ex.Message);
                        return null;
                    }
                }
            }
        }

        public bool IsColorSimilar(Color color1, Color color2, int tolerance)
        {
            return Math.Abs(color1.R - color2.R) <= tolerance &&
                   Math.Abs(color1.G - color2.G) <= tolerance &&
                   Math.Abs(color1.B - color2.B) <= tolerance;
        }
        public bool IsOurNumber(Bitmap bmp)
        {
            // Цвет числа, когда оно является "нашим"
            Color ourNumberColor = Color.FromArgb(255, 176, 148, 124);
            // Допуск по каждому из цветовых компонентов
            int tolerance = 2;

            // Проверяем цвет пикселя в нижнем правом углу (чуть внутри от края)
            // Учитывая, что координаты начинаются с 0, (98, 18) находится в краю
            Color pixelColor = bmp.GetPixel(98, 18);

            return IsColorSimilar(ourNumberColor, pixelColor, tolerance);
        }
        public static int? RecognizeNumberAndAddOne(Bitmap bitmapImage)
        {
            try
            {
                // Создаем изображение Emgu.CV из Bitmap
                using (Image<Bgr, byte> img = new Image<Bgr, byte>(bitmapImage))
                {
                    using (Tesseract tesseract = new Tesseract(@"MainMenu/tessdata", "eng", OcrEngineMode.TesseractOnly))
                    {
                        // Устанавливаем режим распознавания только для цифр
                        tesseract.SetVariable("tessedit_char_whitelist", "0123456789");

                        // Применяем OCR на изображение
                        tesseract.SetImage(img);
                        tesseract.Recognize();

                        // Получаем распознанный текст
                        string recognizedText = tesseract.GetUTF8Text().Trim();

                        // Пытаемся преобразовать текст в число
                        if (int.TryParse(recognizedText, out int number))
                        {
                            // Прибавляем 1 к числу
                            return number + 1;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Обработка исключений
                MessageBox.Show("An error occurred: " + ex.Message);
            }

            // Возвращаем null, если число не было распознано
            return null;
        }
    }