Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознование образов - узнать фигуру по щелчку .. по щелчку мыши на pictureBox узнать .... 
V
    Опции темы
Мурлыкатам_
Дата 27.10.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Задача: Программа загружает картинку на форму ( в pictureBox к примеру ), картинка черно-белая, фигуры черные: квадрат, треугольник, круг. По щелчку мыши надо определить на какую фигуру щелкнул юзер, для этого надо узнать цвет пикселя в том месте где юзер щелкнул...

Загружаю картинку следующим образом:

Код

private void menuItem2_Click(object sender, System.EventArgs e)
        {
            
            OpenFileDialog op = new OpenFileDialog();
            op.ShowDialog();
            if(op.FileName.Length > 0)
            {
                Stream f  = File.Open(op.FileName, System.IO.FileMode.Open);
                pictureBox1.Image =  System.Drawing.Image.FromStream(f, false);
            }
            

        }



Далее у меня получается тока получить координаты щелчка мышью:


Код

private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            MX  = MousePosition.X;
            MY  = MousePosition.Y;
            textBox1.Text = MX.ToString();
            textBox2.Text = MY.ToString();
        }

А как теперь по этим координатом получить цвет пикселя - ума не приложу  smile 
Если кто, что знает подскажите плз...
У мя такое чувство, что надо по другому загружать файл наверное...  Создавать DC ...


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
stab
Дата 27.10.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



(pictureBox1.Image as Bitmap).GetPixel(MX, MY)


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Мурлыкатам_
Дата 27.10.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Спасибо!
Сталкнулся со следующей проблемой:

                                   
Код

                                    Color c;
            float colorBrightness;
            textBox3.Text = "";
            MX  = MousePosition.X;
            MY  = MousePosition.Y;
            textBox1.Text = MX.ToString();
            textBox2.Text = MY.ToString();
            c = (pictureBox1.Image as Bitmap).GetPixel(MX, MY);
            colorBrightness= c.GetBrightness();
            textBox3.Text = colorBrightness.ToString();


На строке: 
Код

c = (pictureBox1.Image as Bitmap).GetPixel(MX, MY);


Иногда выдает исключение: An unhandled exception of type 'System.ArgumentException' occurred in system.drawing.dll

Additional information: Invalid parameter used.

И яркость не совпадает со щелчками мыши... почему - то. Я испробывал все св-ва pictureBox-a SizeMode но постоянно яркость не совподает с действительностью. Пологаю, что это связано с тем, что у меня нету никаких приведений координат мыши с контролом. Т.е. координаты щелчка ведь считаются относительно контрола или экрана? 
Да однозначно привязка идет по экрану, можно ли как нить привязать к контролу?
У PictureBox есть скролы? Это бы я думаю решило бы вопрос с оригинальным размером изображения ..


Это сообщение отредактировал(а) Мурлыкатам_ - 27.10.2007, 22:27


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Мурлыкатам_
Дата 28.10.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Я молодец! Я додумался ))) Как привязать координаты!

Код

Color c;
            int PHeight, PWidth;
            float colorBrightness = 0;
            System.Drawing.Point p = new Point();
            System.Drawing.Point p2;

            
            textBox3.Text = "";
            PHeight = pictureBox1.Height;
            PWidth = pictureBox1.Width;
            MX  = MousePosition.X;
            MY  = MousePosition.Y;
            p.X = MX;
            p.Y = MY;
            p2 = pictureBox1.PointToClient(p);
            
            //MousePosition.Offset
            textBox1.Text = MX.ToString();
            textBox2.Text = MY.ToString();
            textBox4.Text = "p2.x = " + p2.X.ToString();
            textBox5.Text = "p2.y = " + p2.Y.ToString();
            
            c = (pictureBox1.Image as Bitmap).GetPixel(p2.X, p2.Y);
            colorBrightness = c.GetBrightness();
            textBox3.Text ="br = " +  colorBrightness.ToString();


Осталось тока реализовать алгоритм обхода границ фигуры для распознования формы фигуры  smile 


Это сообщение отредактировал(а) Мурлыкатам_ - 28.10.2007, 00:40


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Мурлыкатам_
Дата 29.10.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Короче всё программное сделал, надо найти или придумать алгоритм расспознования фигур чисто математически, я решил делать по принципу обхода границы фигуры, и по признакам фигур делать вывод о фигуре. Может кто знает какую - нить готовую схему решения?
У мя получается что для распознования прямоугольника понадобиться 5 циклов и 8 условных операторов ... мне кажеться это оч много ...


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
zaver
Дата 29.10.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



если дело ограничивается еллипсом, треугольником и прямоугольником. то можно обходить фигуру по ее краю и считать кол-во углов, как мест резкой смены наклона линнии границы фигуры. 
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Мурлыкатам_
Дата 31.10.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



А в этом случае углов на эллипсе не будет?
Преподователь предлогает загнать всё изображение в матрицу А[width;height] пройтись по каждому пикселю, найти связанные пиксели, обозначить что группа связанных пикселей - фигура, каждой фигуре присвоить цифру, и работать чисто с этой матрицей. А щелчек юзера обрабатывать как int MouseClick = A[x,y]; И в зависимости от цифры решать какая фигура, а сам процесс распознование фигуры - на плечи студента :(


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Linus
Дата 1.11.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 1
Всего: 4



А сама картинка (которую загоняют) большая? Можно сделать нейронную сеть и обучить её (так как кол-во фигур маленькое, а картинку, в конце концов, можно и уменьшить, и обрезать ненужные края (удалить те крайние столбцы и строки, в которых нет ни одного черного пиксела)).
PM MAIL ICQ   Вверх
zaver
Дата 1.11.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



нейронная сеть- это слишком долго, и прокатит, если картинка 10на10 пикселей. лучше считать углы, в еллипсе кол-во углов будет или 0 (за редким случаем 2), в треугольнике 3 (за редким случаем 3) в прямоугольнике 4 (за редким случаем 2).
под редким случаем я понимаю такую ситуацию - см прикрепленный рисунок. тут даже человеку тяжело определить где что, не говоря уже про про машину.

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  1.jpg 2,81 Kb
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Linus
Дата 1.11.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.8.2006
Где: Украина

Репутация: 1
Всего: 4



zaver, почему именно 10 на 10 пикселей?  В любом случае картинку можно программно увеличить/уменьшить/подрезать... Только обучать такую сеть будет действительно геморно.  А если обходить "жучком" контур фигуры, в принципе, очень даже и реально... Кстати, толщина линии в фигуре - 1 пиксел?
PM MAIL ICQ   Вверх
zaver
Дата 1.11.2007, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



пикселей 10 на 10 - это я сказал образно, а имел ввиду, что самому NN можно сделать и научить в приемлемый срок только если у нее кол-во акцепоторов будет немного. чем больше множество сигналов, которые ты подаешь на NN, тем дольше и труднее ее надо учить. про масштабирование - понятно, можно сразу свести к тому, что у нас будет после масштабирования, играми с цветами и прочей косметикой. мы говорим о том, что мы подаем системе распознования на вход. темболее NN для лабы - это круто.

толщина - не обязательно 1 пиксел, фигура какая угодно.
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Мурлыкатам_
Дата 6.11.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Короче мои последние достижения:
1. Все фигуры обходяться жуком, выделяются по границе красным цветом smile
2. Фигуры сплошныи - черные.

Мне нун алгоритм чтобы подсчитать углы :(((
Мучаюсь уже [censored 6]... че тока не пробавал.. Нун талковы алгоритм, вот как с жуком, всё четка и ясно.


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
marcusmae
Дата 6.11.2007, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Мурлыкатам_, интересная задача, можно я тоже выскажусь?

Знаете, подсчёт углов мне представляется жутковатым. У Вас ведь в числе образов имеется весьма и весьма нелинейная фигура. Это что же, Вы будете считать углы между каждой тройкой точек..? 

Мне кажется, идея преподавателя с матрицами весьма дальновидна. Она не только менее трудоёмка, но и в дальнейшем может оказаться более универсальной.

Как я понял, у Вас имеется приложение делающее следующее : на картинке имеются закрашенные (не полые!) фигурки. По щелчку мыши Вы определяете координаты пикселя, далее определяете его цвет, и, если этот цвет - чёрный, то начинаете вокруг этой точки ходить и собирать все рядом лежащие чёрные пиксели вплоть до границ фигуры. Прекрасно. А теперь, найдя максимумы-минимумы, можно найти прямоугольник, заключающий в себе обнаруженную фигуру. Создаём матрицу с размерностями, как у этого прямоугольника : где чёрные пиксели - кладём единицу, где нечёрные - ноль. На счёт гиганскости матрицы не стоит переживать - это уже отдельная задача- можно много-чего хорошего напридумывать в плане компактности.

Ту же самую процедуру нужно будет проделать с заранее заготовленными образами - с каждого "снять" по матрице. И обратить эти матрицы.

Как из этого получить результат? = Матрицу, снятую с исследуемого образа помножаем поочереди на обращённые матрицы эталонных образов. Чем ближе результат перемножения к единичной матрице (можно какую-нибудь норму оценивать), тем точнее совпадение - отсюда определяем, на какой из образов объект похож больше всего .

Это сообщение отредактировал(а) marcusmae - 6.11.2007, 21:18


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Мурлыкатам_
Дата 7.11.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Задача решена, вернее сведена к анализу массива с плавающими точками, причем в этом массиве углы очевидны.
Делал так:

1. После щелчка мышью - проход по черным пикселям до белого (нахождение границы)
2. Запуск алгоритма Жука (белый пиксель - поворот направо, черный - налево)
3. На каждом 3м шаге Жука по черному пикселю - создается матрица 5 х 5 
3.1 цикл заполняет матрицу, при этом считает белые пиксели, по концовки от 25 отнимаем количество белых пикселей.
3.2 Получаем 2 велечины: кол-во черных и белых пикселей, находим их отношение ().
3.3 Пишем в файл полученую велечину (мне показалось это удобнее чем в отладке на F5 жмякать и более наглядно).
4. И о чудо! ))) я сам оболдел при просмотре файла, хотя я теоретически предпологал данное явление, но все 5 х 5 матрицы, которые попадают на угол - отношение белые / черные > 1 или очень близко к нему, а предыдущий и следующий шаг < 1.
  * массив примерно следующего вида получается: 
0,5625
0,3157895
0,5625
0,3157895
2,571429    - очевидный угол
1,272727    - следующий шаг тоже цепляет этот угол + 1 угол smile

0,7857143
0,7857143
0,6666667
0,3157895
0,4705882
0,5625
0,7857143
1,083333  -
2,571429  - повторное явление захвата одного угла 2 раза => + 1 угол

0,6666667
0,6666667
0,6666667
0,6666667
0,6666667
0,7857143
2,125               - откровенный угол (идеальный вариант работы алгоритма) => +1 угол
0,7857143
0,5625
0,3157895

Фигура - треугольник.
5. Остается тока обработать массив, чтобы посчитать угол.
Вот какой я молодец  smile 


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
marcusmae
Дата 7.11.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



Цитата(Мурлыкатам_ @  7.11.2007,  14:23 Найти цитируемый пост)
Задача решена, вернее сведена к анализу массива с плавающими точками, причем в этом массиве углы очевидны.


Мне нетерпится увидеть, как этот замечательный подход будет работать для круга  smile 

Это сообщение отредактировал(а) marcusmae - 7.11.2007, 16:14


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.