![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Мурлыкатам_ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Задача: Программа загружает картинку на форму ( в pictureBox к примеру ), картинка черно-белая, фигуры черные: квадрат, треугольник, круг. По щелчку мыши надо определить на какую фигуру щелкнул юзер, для этого надо узнать цвет пикселя в том месте где юзер щелкнул...
Загружаю картинку следующим образом:
Далее у меня получается тока получить координаты щелчка мышью:
А как теперь по этим координатом получить цвет пикселя - ума не приложу Если кто, что знает подскажите плз... У мя такое чувство, что надо по другому загружать файл наверное... Создавать DC ... |
||||
|
|||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
(pictureBox1.Image as Bitmap).GetPixel(MX, MY)
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| Мурлыкатам_ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Спасибо!
Сталкнулся со следующей проблемой:
На строке:
Иногда выдает исключение: 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 |
||||
|
|||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Я молодец! Я додумался ))) Как привязать координаты!
Осталось тока реализовать алгоритм обхода границ фигуры для распознования формы фигуры Это сообщение отредактировал(а) Мурлыкатам_ - 28.10.2007, 00:40 |
|||
|
||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Короче всё программное сделал, надо найти или придумать алгоритм расспознования фигур чисто математически, я решил делать по принципу обхода границы фигуры, и по признакам фигур делать вывод о фигуре. Может кто знает какую - нить готовую схему решения?
У мя получается что для распознования прямоугольника понадобиться 5 циклов и 8 условных операторов ... мне кажеться это оч много ... |
|||
|
||||
| zaver |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 15.8.2005 Репутация: нет Всего: 3 |
если дело ограничивается еллипсом, треугольником и прямоугольником. то можно обходить фигуру по ее краю и считать кол-во углов, как мест резкой смены наклона линнии границы фигуры.
|
|||
|
||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
А в этом случае углов на эллипсе не будет?
Преподователь предлогает загнать всё изображение в матрицу А[width;height] пройтись по каждому пикселю, найти связанные пиксели, обозначить что группа связанных пикселей - фигура, каждой фигуре присвоить цифру, и работать чисто с этой матрицей. А щелчек юзера обрабатывать как int MouseClick = A[x,y]; И в зависимости от цифры решать какая фигура, а сам процесс распознование фигуры - на плечи студента :( |
|||
|
||||
| Linus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.8.2006 Где: Украина Репутация: 1 Всего: 4 |
А сама картинка (которую загоняют) большая? Можно сделать нейронную сеть и обучить её (так как кол-во фигур маленькое, а картинку, в конце концов, можно и уменьшить, и обрезать ненужные края (удалить те крайние столбцы и строки, в которых нет ни одного черного пиксела)).
|
|||
|
||||
| zaver |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 15.8.2005 Репутация: нет Всего: 3 |
нейронная сеть- это слишком долго, и прокатит, если картинка 10на10 пикселей. лучше считать углы, в еллипсе кол-во углов будет или 0 (за редким случаем 2), в треугольнике 3 (за редким случаем 3) в прямоугольнике 4 (за редким случаем 2).
под редким случаем я понимаю такую ситуацию - см прикрепленный рисунок. тут даже человеку тяжело определить где что, не говоря уже про про машину. Присоединённый файл ( Кол-во скачиваний: 19 )
1.jpg 2,81 Kb |
|||
|
||||
| Linus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 13.8.2006 Где: Украина Репутация: 1 Всего: 4 |
zaver, почему именно 10 на 10 пикселей? В любом случае картинку можно программно увеличить/уменьшить/подрезать... Только обучать такую сеть будет действительно геморно. А если обходить "жучком" контур фигуры, в принципе, очень даже и реально... Кстати, толщина линии в фигуре - 1 пиксел?
|
|||
|
||||
| zaver |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 204 Регистрация: 15.8.2005 Репутация: нет Всего: 3 |
пикселей 10 на 10 - это я сказал образно, а имел ввиду, что самому NN можно сделать и научить в приемлемый срок только если у нее кол-во акцепоторов будет немного. чем больше множество сигналов, которые ты подаешь на NN, тем дольше и труднее ее надо учить. про масштабирование - понятно, можно сразу свести к тому, что у нас будет после масштабирования, играми с цветами и прочей косметикой. мы говорим о том, что мы подаем системе распознования на вход. темболее NN для лабы - это круто.
толщина - не обязательно 1 пиксел, фигура какая угодно. |
|||
|
||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Короче мои последние достижения:
1. Все фигуры обходяться жуком, выделяются по границе красным цветом 2. Фигуры сплошныи - черные. Мне нун алгоритм чтобы подсчитать углы :((( Мучаюсь уже [censored 6]... че тока не пробавал.. Нун талковы алгоритм, вот как с жуком, всё четка и ясно. |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Мурлыкатам_, интересная задача, можно я тоже выскажусь?
Знаете, подсчёт углов мне представляется жутковатым. У Вас ведь в числе образов имеется весьма и весьма нелинейная фигура. Это что же, Вы будете считать углы между каждой тройкой точек..? Мне кажется, идея преподавателя с матрицами весьма дальновидна. Она не только менее трудоёмка, но и в дальнейшем может оказаться более универсальной. Как я понял, у Вас имеется приложение делающее следующее : на картинке имеются закрашенные (не полые!) фигурки. По щелчку мыши Вы определяете координаты пикселя, далее определяете его цвет, и, если этот цвет - чёрный, то начинаете вокруг этой точки ходить и собирать все рядом лежащие чёрные пиксели вплоть до границ фигуры. Прекрасно. А теперь, найдя максимумы-минимумы, можно найти прямоугольник, заключающий в себе обнаруженную фигуру. Создаём матрицу с размерностями, как у этого прямоугольника : где чёрные пиксели - кладём единицу, где нечёрные - ноль. На счёт гиганскости матрицы не стоит переживать - это уже отдельная задача- можно много-чего хорошего напридумывать в плане компактности. Ту же самую процедуру нужно будет проделать с заранее заготовленными образами - с каждого "снять" по матрице. И обратить эти матрицы. Как из этого получить результат? = Матрицу, снятую с исследуемого образа помножаем поочереди на обращённые матрицы эталонных образов. Чем ближе результат перемножения к единичной матрице (можно какую-нибудь норму оценивать), тем точнее совпадение - отсюда определяем, на какой из образов объект похож больше всего . Это сообщение отредактировал(а) marcusmae - 6.11.2007, 21:18 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 угол 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. Остается тока обработать массив, чтобы посчитать угол. Вот какой я молодец |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Мне нетерпится увидеть, как этот замечательный подход будет работать для круга Это сообщение отредактировал(а) marcusmae - 7.11.2007, 16:14 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |