Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 424
1

Обработка изображения рабочего стола

25.04.2014, 18:47. Просмотров 1774. Ответов 9
Метки нет (Все метки)


Всем доброго времени суток.
По задаче для начала нам необходимо получить скрин с экрана, после необходимо обнаружить и определить позицию открытого окна с определенным именем и уже в окне на определенной позиции необходимо найти и получить значение текста(обычный печатный).

Подскажите как реализовать, а то я до этого не работал с изображениями.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2014, 18:47
Ответы с готовыми решениями:

Как получать изображения рабочего стола через сервисы
Получаю изображение вот так: Rectangle bounds = Screen.PrimaryScreen.Bounds; ...

Изобретение велосипеда, как тренировка студента. Передача видео или изображения рабочего стола по сети
Собственно, есть задание и коротко оно звучит так: "написать то, что будет передавать видео или...

Сканирование рабочего стола
Кто нить может подсказать код сканирования на файлы. Нужно сканировать рабочий стол, выявить кол-во...

Смена обоев рабочего стола
Вопрос вот в чем. Я не силен в Visual Studio. Хочу объединить vbs скрипт и картинку, в один exe...

9
674 / 420 / 45
Регистрация: 09.07.2012
Сообщений: 1,419
27.04.2014, 20:19 2
Если это действительно в этой последовательности делать надо, то тут OCR надо
Можно использовать C# NuGet Package Tesseract, прям из студии установить в проект.

А так проще сначала найти окно через API http://www.pinvoke.net/default... findwindow
и http://www.pinvoke.net/default... ndows.html для поиска внутри.
1
2427 / 1880 / 340
Регистрация: 22.07.2011
Сообщений: 7,197
28.04.2014, 00:23 3
Если текст не является элементом графики , а например стандартный контрол , то получить его можно через соответствующее WinApi, или для NET - Microsoft UI Automation
1
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 424
02.05.2014, 17:10  [ТС] 4
Нашел проект распознавания "Puma.NET" пробовал кодить, но сразу вылетает ошибка Exception, что я делаю не так?
Собстна сам код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        private void button1_Click(object sender, EventArgs e)
        {
            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap("test02.jpg");
            pictureBox1.Image = bitmap;;
 
            var pumapage = new Puma.Net.PumaPage(bitmap);
 
            using (pumapage)
            {
                pumapage.FileFormat = PumaFileFormat.RtfAnsi;
                pumapage.EnableSpeller = false;
                pumapage.Language = PumaLanguage.English;
 
                try
                { 
                    richTextBox1.Text = pumapage.RecognizeToString(); 
                }
                catch (Exception)
                {
                    MessageBox.Show("Херь какато!"); 
                }
            }  
 
 
        }
0
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 424
02.05.2014, 17:12  [ТС] 5
Ни одна и выше выложенных картинок не распознается
0
Изображения
   
674 / 420 / 45
Регистрация: 09.07.2012
Сообщений: 1,419
02.05.2014, 18:23 6
Exception при тестировании лучше выводить так
C#
1
2
3
4
catch (Exception exc)
                {
                    MessageBox.Show(exc.Message + " В методе button1_Click"); 
                }
Текст представленный в примерах 100% распознается при помощи tesseract
https://github.com/charlesw/tesseract

Getting started quickly

Add the Tesseract NuGet Package by running Install-Package Tesseract from the Package Manager Console.
Ensure you have Visual Studio 2012 x86 & x64 runtimes installed (see note above).
Download language data files for tesseract 3.02 from (https://code.google.com/p/tess... loads/list) and add them to your project, ensure 'Copy to output directory' is set to Always.
Check out the Samples solution ~/Samples/Tesseract.Samples.sln for a working example
If you run into any issues please check out this wiki page which details a number common issues and some potential solutions.

Устанавливаем Nuget Package, качаем словари Eng (опять же по картинкам понятно что нужен Английский).
Более подробно можно найти через поисковик.

И тут уже без разницы, контрол это или графика. Такого качества распознает на ура.
Проверено на личном опыте.

Обработка изображения рабочего стола
2
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 424
04.05.2014, 11:11  [ТС] 7
Dywar, Я никак не пойму как реализовать распознание на 3.0 версии в нете только версия 2
0
674 / 420 / 45
Регистрация: 09.07.2012
Сообщений: 1,419
04.05.2014, 14:18 8
В проекте где это нужно сделать:
"Сервис" -> "Диспетчер пакетов NuGet" -> "Управление пакетами NuGet для решения...". В открывшемся окне переходим на раздел "В сети" -> "nuget.org", в строке поиска пишем "tesseract" и нужный нам пакет "A .Net wrapper for tesseract-ocr". Устанавливаем его.

После этого в классе пишем "using Tesseract;"
Качаем пакеты языков. Кладем в папку debug (или релиз), в "\bin\Debug\tessdata" например.

C#
1
2
3
4
5
6
7
8
9
10
11
Bitmap image = наша картинка;
string answer = "";
 
            TesseractEngine OCRtesseractengine302 = new TesseractEngine("tessdata", "eng", EngineMode.ВЫБИРАЕМ);
 
            using (Tesseract.Page page = OCRtesseractengine302.Process(image))
            {
                answer = page.GetText();
            }
 
            return answer;
В answer ответ. Но перед этим картинку надо обработать, на исходной он не находит текст. Я ведь писал выше что сделал ЗУМх2 и Бинаризацию (1 и 0, белый и черный цвета).
Эти фильтры реализуем сами (гуглим), или используем готовые библиотеки для работы с изображениями - http://www.aforgenet.com/ http://accord-framework.net/ https://code.google.com/p/opencvsharp/ http://www.emgu.com/wiki/index.php/Main_Page
2
16 / 15 / 1
Регистрация: 05.04.2011
Сообщений: 424
06.05.2014, 16:33  [ТС] 9
Цитата Сообщение от Dywar Посмотреть сообщение
Бинаризацию
Бинаризацию выполнил, но у меня получается, обработать изображение как у вас у меня не получилось получаются мусорные пиксели, если проводить строковое распознавание то все нормально, а вот если таблицу как в примере 2 то возникают ошибки.

В общем с этим можно сказать я разобрался, теперь стоит вопрос как получить картинку с экрана, не рабочего стола, а именно определенного окна(желательно в bitMap)
0
674 / 420 / 45
Регистрация: 09.07.2012
Сообщений: 1,419
06.05.2014, 19:54 10
Например нагуглилось:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public void CaptureApplication(string procName)
{
    var proc = Process.GetProcessesByName(procName)[0];
    var rect = new User32.Rect();
    User32.GetWindowRect(proc.MainWindowHandle, ref rect);
 
    int width = rect.right - rect.left;
    int height = rect.bottom - rect.top;
 
    var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    Graphics graphics = Graphics.FromImage(bmp);
    graphics.CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy);
 
    bmp.Save("c:\\tmp\\test.png", ImageFormat.Png);
}
 
private class User32
{
    [StructLayout(LayoutKind.Sequential)]
    public struct Rect
    {
        public int left;
        public int top;
        public int right;
        public int bottom;
    }
 
    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);
}
Или такой

1, Invoke API FindWindow() to retrieve the window handle (Uuse SPY++ to get the two parameters ClassName & WindowName);
2, Invoke API GetWindowRect() to retrieve the size & postion of the specified window.

WindowName = Currentprocess.ProcessName;
ClassName = Currentprocess.MainWindowTitle;

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DllImport("user32.dll")]
        private static extern IntPtr FindWindow(string className, string windowName);
 
        [DllImport("user32.dll")]
        private static extern int GetWindowRect(IntPtr hwnd, out Rectangle rect);
 
        private void button2_Click(object sender, EventArgs e)
        {
            string className = "yourClassName";
            string windowName = "yourWindowName";
 
            Rectangle rect;
            IntPtr hwnd = FindWindow(className, windowName);
            GetWindowRect(hwnd, out rect);
        }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2014, 19:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Скрыть ярлыки рабочего стола
Можно сделать так чтоб при запуске программы исчезали все ярлыки рабочего стола?

Свой аналог рабочего стола
Делаю программу аналог рабочего стола.Что-то типа такого,как на скрине,только со своими виджетами и...

Изменение заставки рабочего стола
сабж, такое возможно?

Как определить hwnd рабочего стола?
Как определить hwnd рабочего стола? Добавлено через 2 часа 22 минуты решено. через спай пробил...

Скриншот рабочего стола удаленной машины.
Только начал изучать С#, прошу вашей помощи. Возможно ли получить скриншот рабочего стола...

Как программно сменить фон рабочего стола
Как программно сменить фон рабочего стола? P.S. Windows 7


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.