Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/58: Рейтинг темы: голосов - 58, средняя оценка - 4.69
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350

Распознавание графических примитивов

10.04.2011, 22:56. Показов 11803. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Посоветуйте пожалуйста алгоритмы распознавания геометрических фигур в зашумленном изображении например(как пример обычное фото где например на столе или на стенке нарисован квадрат какимнить цветом)...готовые решения типа OpenCV не предлагать, нужно реализовать с 0!
Нужно найти тодже квадрат например и выделить его, все найденные мной алгоритмы распознаю фигуры на монотонном фоне(метод жука)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2011, 22:56
Ответы с готовыми решениями:

Расчета длины контуров графических примитивов, закодированных в PLT файле
Добрый вечер. Имеется программа расчета длины контуров графических примитивов, закодированных в PLT файле. В идеале она должна рассчитывать...

AForge.Neuro. Распознавание графических изображений
Реализовать распознавание заданных образов на примере лаб.3 Треугольник, квадрат, ромб, круг

Движение графических примитивов
Не работает движение нижней части клюва , помогите понять почему и помогите исправить . using System; using...

12
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.04.2011, 08:34
nuke4303, оператор Собела пробовал?
0
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 13:14  [ТС]
Я про собела читал что у него какието проблемы бывают, что нужно использовать canny.
И еще вопрос, работаю в шрапх, но расчет хочу вести в с++ библиотеке..каким образом передать туда Bitmap? Может перевести в IntPtr, ток в импортируемой из с++ функции что в заголовке писать?, а потом как преобразовать например в Cbitmap? Или в с++ может есть аналог шарпного Bitmapa, без перевода в кучу может можно обойтись?
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
11.04.2011, 13:23
nuke4303, как ни прискорбно это писать, но если ты хочешь делать на С++, то без прослойки на C++/CLI ты не обойдешься, а это геморрой ещё тот. лучше писать на чистом С. но тут тоже учти, что хоть и у IntPtr есть простой метод ToPointer() (-> void*) (который автоматом сам и вызовется при маршаллинге этого объекта), голый C++ мало знает о структуре System.Drawing.Bitmap... лучше маршаллировать указатель на залоченный битмап:
C#
1
2
3
BitmapData data = myBitmap.LockBits(new Rectangle(Point.Empty, myBitmap.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
int len = bmpData.Height * bmpData.Stride;
byte* numPtr = (byte*)bmpData.Scan0;
и работать с ним. а ещё лучше не усложнять себе жизнь и писать на C#
1
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 13:31  [ТС]
Цитата Сообщение от Mikant Посмотреть сообщение
лучше маршаллировать указатель на залоченный битмап
Спасибо, поробую
Цитата Сообщение от Mikant Посмотреть сообщение
и работать с ним. а ещё лучше не усложнять себе жизнь и писать на C#
А как насчет скорости? Ведь мне нужно будет после выделения краев темже собелем например, выделить геометрические фигуры в потоке видео например с вебкамере, без задержек видимых
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.04.2011, 13:40
nuke4303, а я совсем не понимаю зачем тебе C++? Чем тебя C# не устраивает?
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
11.04.2011, 14:18
по скорости можно выиграть только в том случае, если знания и опыт C++ намного превосходят опыт на C#. в общем же случае, разрабатывая приложение на C#, намного меньшими усилиями получишь хороший результат
1
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 14:31  [ТС]
Ок, убедили...насчет главного вопроса, какой алгоритм более или мение эффективно выделит края изображения? И тут есть небольшой нюанс, на вход алгоритму тогоже собаина нужно подавать цветное изображение или в градация серого, и какое на выходе получаем?
Я так понимаю на выходе должно быть бинаризованное изображение в котором методом например жука ищем примитивы, я правильно понял?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.04.2011, 14:49
Цитата Сообщение от nuke4303 Посмотреть сообщение
на вход алгоритму тогоже собаина нужно подавать цветное изображение
это зависит от того как ты организуешь сам олгоритм, я делал прямо в методе перегон в оттенки серого, а затем выделение контуров.

Цитата Сообщение от nuke4303 Посмотреть сообщение
и какое на выходе получаем?
тоже в градациях серого

Цитата Сообщение от nuke4303 Посмотреть сообщение
Я так понимаю на выходе должно быть бинаризованное изображение в котором методом например жука ищем примитивы, я правильно понял?
после выделения контуров можно перегнать в бинарное

Добавлено через 11 минут
Контуры можно получить используя маски оператора Робертса, Превитта, Собела, а также операторы линейного котрастирования
2
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 16:10  [ТС]
А есть ли какиенибудь алгоритмы поиска примитивов кроме "жука" ?
0
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
17.04.2011, 12:29  [ТС]
Получаю изображение с помщью directshow c 30fps, если начинаю обрабатывать каждый кадр фильтром собеля происходить падения фпс до 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
unsafe IntPtr Sobel(IntPtr image,int w,int h,int s)
{
IntPtr ptr= Marshal.AllocCoTaskMem(s * h);   
int[,] GX=new int[3,3];  
    int[,] GY=new int[3,3];   
   int      sumX = 0;
   int      sumY = 0;
   byte     SUM = 0;
   int bitsPerPixel = 24;//Image.GetPixelFormatSize(PixelFormat.Format24bppRgb);
   // Masks //////////////////////////////////////
   //X//
   GX[0,0] = -1; GX[0,1] = 0; GX[0,2] = 1;
   GX[1,0] = -2; GX[1,1] = 0; GX[1,2] = 2;
   GX[2,0] = -1; GX[2,1] = 0; GX[2,2] = 1;
   //Y//
   GY[0,0] =  1; GY[0,1] = 2; GY[0,2] = 1;
   GY[1,0] =  0; GY[1,1] = 0; GY[1,2] = 0;
   GY[2,0] = -1; GY[2,1] = -2; GY[2,2] = -1;
 
     byte* scan0_ish = (byte*)image.ToPointer();
     byte* scan0_dest = (byte*)ptr.ToPointer();   
  
 
   for(int Y=0; Y<h; Y++)  {
    for(int X=0; X < w; X++)  {
         sumX = 0;
         sumY = 0;
 
         if(Y==0 || Y == h-1)
        SUM = 0;
         else if(X==0 || X == w-1)
        SUM = 0;
         else
         {
             for(int I=-1; I<=1; I++)  {
        for(int J=-1; J<=1; J++)  {
 
            int piX = J + X;
            int piY = I + Y;
 
            //COLORREF pixVal = image->GetPixel(piX,piY);
             byte* data = scan0_ish + piY * s + piX * bitsPerPixel / 8;
            int R = data[0];//GetRValue(pixVal);
            int G = data[1];
            int B = data[2];
 
            int NC = (R+G+B)/3;
 
            sumX = sumX + (NC) * GX[J+1,I+1];
            sumY = sumY + (NC) * GY[J+1,I+1];
 
                  }
           }
                SUM = (byte)(Math.Abs(sumX) + Math.Abs(sumY));
          }
         if(SUM>255) SUM=255;
         if(SUM<0) SUM=0;
         byte newPixel = (byte)(255 - SUM);
 
         byte* data_2 = scan0_dest + Y * s + X * bitsPerPixel / 8;
         data_2[0] = newPixel;
         data_2[1] = newPixel;
         data_2[2] = newPixel;
         //COLORREF newPixCol =  RGB(newPixel,newPixel,newPixel);
        // returnImage->SetPixel(X,Y,newPixCol) ;
         }
   }
   return ptr;
}
0
 Аватар для LastPast
32 / 32 / 2
Регистрация: 06.07.2010
Сообщений: 129
18.04.2011, 16:45
Насколько мне известно, эти проблемы всё равно будут независимо от языка программирования. Где-то больше, где-то меньше.

Выходы:
1. обрабатывать не каждый кадр.
2. оптимизировать исходный код.
3. улучшить железо.

По 2-ому пункту: где возможно - вынести из циклов лишние проверки, вычисления.
Почитать на тему оптимизации википедию для начала. Техника оптимизации программ Крис Касперски.
Можно попробовать использовать профилировщик, например, VTune. Он покажет, какие конструкции дольше всего выполняются.
1
2621 / 1632 / 266
Регистрация: 19.02.2010
Сообщений: 4,330
18.04.2011, 22:01
Цитата Сообщение от LastPast Посмотреть сообщение
2. оптимизировать исходный код.
+1. Сам расчётный код (внутренние циклы) в разы ускоряется, если подумать головой
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2011, 22:01
Помогаю со студенческими работами здесь

Создание графических примитивов
Поздравляю всех с новым годом. Ситуация такая. Пытаюсь создать графические примитивы для дальнейшего их использования т.есть Создаю классы...

Рисование графических примитивов на форме
Народ. Интересует рисование на форме, то есть круги, треугольники, линии движением мыши, но начиная с самых азов. Подскажите пожалуйста что...

Перевести код создания графических примитивов с C#
кто может помочь перевести на VB.net текст программы на C#: using System; using System.Collections.Generic; using...

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

Основные методы для рисования графических примитивов в Windows Forms
Назвать основные методы для рисования графических примитивов (Windows Forms)


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru