Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/37: Рейтинг темы: голосов - 37, средняя оценка - 4.81
nuke4303
98 / 99 / 16
Регистрация: 30.03.2011
Сообщений: 350
1

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

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

Посоветуйте пожалуйста алгоритмы распознавания геометрических фигур в зашумленном изображении например(как пример обычное фото где например на столе или на стенке нарисован квадрат какимнить цветом)...готовые решения типа OpenCV не предлагать, нужно реализовать с 0!
Нужно найти тодже квадрат например и выделить его, все найденные мной алгоритмы распознаю фигуры на монотонном фоне(метод жука)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 22:56
Ответы с готовыми решениями:

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

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

Отрисовка примитивов PictureBox
Здравствуйте! Нужда заставила разобраться с принципом рисования элементарных примитивов двумерного...

Отрисовка большого количества примитивов
Требуется отрисовать в WPF некоторое количество прямоугольников, с заданными высотой и шириной и...

Нарисовать из примитивов подобие шахматной доски.
Здраствуйте. Делаю шаблон к элементу управления. Мне нужно нарисовать в фоне этого элемента...

12
nio
5977 / 3383 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.04.2011, 08:34 2
nuke4303, оператор Собела пробовал?
0
nuke4303
98 / 99 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 13:14  [ТС] 3
Я про собела читал что у него какието проблемы бывают, что нужно использовать canny.
И еще вопрос, работаю в шрапх, но расчет хочу вести в с++ библиотеке..каким образом передать туда Bitmap? Может перевести в IntPtr, ток в импортируемой из с++ функции что в заголовке писать?, а потом как преобразовать например в Cbitmap? Или в с++ может есть аналог шарпного Bitmapa, без перевода в кучу может можно обойтись?
0
Mikant
1288 / 961 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
11.04.2011, 13:23 4
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
11.04.2011, 13:23
nuke4303
98 / 99 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 13:31  [ТС] 5
Цитата Сообщение от Mikant Посмотреть сообщение
лучше маршаллировать указатель на залоченный битмап
Спасибо, поробую
Цитата Сообщение от Mikant Посмотреть сообщение
и работать с ним. а ещё лучше не усложнять себе жизнь и писать на C#
А как насчет скорости? Ведь мне нужно будет после выделения краев темже собелем например, выделить геометрические фигуры в потоке видео например с вебкамере, без задержек видимых
0
nio
5977 / 3383 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.04.2011, 13:40 6
nuke4303, а я совсем не понимаю зачем тебе C++? Чем тебя C# не устраивает?
0
Mikant
1288 / 961 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
11.04.2011, 14:18 7
по скорости можно выиграть только в том случае, если знания и опыт C++ намного превосходят опыт на C#. в общем же случае, разрабатывая приложение на C#, намного меньшими усилиями получишь хороший результат
1
nuke4303
98 / 99 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 14:31  [ТС] 8
Ок, убедили...насчет главного вопроса, какой алгоритм более или мение эффективно выделит края изображения? И тут есть небольшой нюанс, на вход алгоритму тогоже собаина нужно подавать цветное изображение или в градация серого, и какое на выходе получаем?
Я так понимаю на выходе должно быть бинаризованное изображение в котором методом например жука ищем примитивы, я правильно понял?
0
nio
5977 / 3383 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
11.04.2011, 14:49 9
Цитата Сообщение от nuke4303 Посмотреть сообщение
на вход алгоритму тогоже собаина нужно подавать цветное изображение
это зависит от того как ты организуешь сам олгоритм, я делал прямо в методе перегон в оттенки серого, а затем выделение контуров.

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

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

Добавлено через 11 минут
Контуры можно получить используя маски оператора Робертса, Превитта, Собела, а также операторы линейного котрастирования
2
nuke4303
98 / 99 / 16
Регистрация: 30.03.2011
Сообщений: 350
11.04.2011, 16:10  [ТС] 10
А есть ли какиенибудь алгоритмы поиска примитивов кроме "жука" ?
0
nuke4303
98 / 99 / 16
Регистрация: 30.03.2011
Сообщений: 350
17.04.2011, 12:29  [ТС] 11
Получаю изображение с помщью 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 12
Насколько мне известно, эти проблемы всё равно будут независимо от языка программирования. Где-то больше, где-то меньше.

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

По 2-ому пункту: где возможно - вынести из циклов лишние проверки, вычисления.
Почитать на тему оптимизации википедию для начала. Техника оптимизации программ Крис Касперски.
Можно попробовать использовать профилировщик, например, VTune. Он покажет, какие конструкции дольше всего выполняются.
1
VTsaregorodtsev
606 / 563 / 85
Регистрация: 19.02.2010
Сообщений: 2,058
18.04.2011, 22:01 13
Цитата Сообщение от LastPast Посмотреть сообщение
2. оптимизировать исходный код.
+1. Сам расчётный код (внутренние циклы) в разы ускоряется, если подумать головой
1
18.04.2011, 22:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2011, 22:01

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

Как ускорить отрисовку примитивов на PictureBox'e
Есть следующая проблема. По движению мыши на Bitmap'e рисую сплошную линию(с кистью в виде...

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


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

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

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