Правильно ли здесь передается улучшенное изображение в RecognizeNumberAndAddOne. Потому что изображение с цифрой 3 распознается как 5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.OCR;
using Emgu.CV.Structure;

namespace Albion_Helper
{
    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
        // 
        // Блок распознования цены

        // Блок поправки цен
        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);
            }
        }

        public long? 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);

                if (IsOurNumber(bmpScreenshot))
                {
                    // Если число наше, мы не делаем ничего и возвращаем null
                    return null;
                }
                else
                {
                    // Если число не наше, распознаем его и прибавляем 1
                    return RecognizeNumberAndAddOne(bmpScreenshot);
                }
            }
        }

        // Доверительный интервал для проверки пикселя
        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, 182, 153, 127);
            // Допуск по каждому из цветовых компонентов
            int tolerance = 3;


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

            return IsColorSimilar(ourNumberColor, pixelColor, tolerance);
        }

        public long? RecognizeNumberAndAddOne(Bitmap bitmapImage)
        {
            try
            {
                // Увеличиваем и улучшаем контраст перед OCR
                using (Bitmap enhancedBmp = EnhanceImage(bitmapImage))
                {
                    // Создаем изображение Emgu.CV из Bitmap
                    using (Image<Bgr, byte> img = new Image<Bgr, byte>(enhancedBmp))
                    {
                        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 (long.TryParse(recognizedText, out long number))
                            {
                                img.Dispose();
                                bitmapImage.Dispose();
                                tesseract.Dispose();
                                // Прибавляем 1 к числу
                                return number + 1;

                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // Обработка исключений
                MessageBox.Show("An error occurred: " + ex.Message);
            }

            // Возвращаем null, если число не было распознано
            return null;
        }
        public Bitmap EnhanceImage(Bitmap originalImage, float scale = 2.0f, float contrast = 5.0f)
        {
            // Увеличить размер изображения
            int width = (int)(originalImage.Width * scale);
            int height = (int)(originalImage.Height * scale);
            Bitmap enlargedImage = new Bitmap(width, height);
            using (Graphics graphics = Graphics.FromImage(enlargedImage))
            {
                graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
                graphics.DrawImage(originalImage, new Rectangle(0, 0, width, height));
            }

            // Повысить контрастность
            ImageAttributes imageAttributes = new ImageAttributes();
            float[][] colorMatrixElements = {
        new float[] {contrast, 0, 0, 0, 0},
        new float[] {0, contrast, 0, 0, 0},
        new float[] {0, 0, contrast, 0, 0},
        new float[] {0, 0, 0, 1, 0},
        new float[] {(1.0f - contrast) / 2.0f, (1.0f - contrast) / 2.0f, (1.0f - contrast) / 2.0f, 0, 1}
    };
            ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

            Bitmap contrastEnhancedImage = new Bitmap(width, height);
            using (Graphics g = Graphics.FromImage(contrastEnhancedImage))
            {
                g.DrawImage(enlargedImage, new Rectangle(0, 0, width, height), 0, 0, originalImage.Width, originalImage.Height, GraphicsUnit.Pixel, imageAttributes);
            }

            // Освободить ресурсы увеличенного изображения
            enlargedImage.Dispose();

            return contrastEnhancedImage;
        }
        public void ChangePrice(long? price = null)
        {
            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)
                {
                    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); // Симулируем клик ЛКМ
                    Thread.Sleep(300);
                    SendKeys.SendWait(price.ToString());
                }
                // Если это вторая точка, просто произведите клик
                else if (i == 1)
                {
                    //  mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
                }
            }
        }


    }
}