снова я sorry

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

снова я sorry

Сообщение TX » 20.05.2004 (Чт) 13:58

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.05.2004 (Чт) 14:09

Можешь выложить примеры картинок, которые будут сканироваться?
А то написать универсальный распознаватель образов это понимаешь... :)
Lasciate ogni speranza, voi ch'entrate.

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 21.05.2004 (Пт) 5:13

нет проблем - вот туту в архиве "figury" я нарисовал 4 объекта по отдельности - вот желательно, чтобы он вот эти объекты распозновал
а в архиве "all" - сдесь все фигуры в одном файле это так - если сможешь то и это чтоб он распознать смог
Вложения
figury.zip
здесь 4 объекта по отдельности - каждый в своем файле
(8.23 Кб) Скачиваний: 149
all.zip
здесь 4 объекта вместе все в одном файле
(5.94 Кб) Скачиваний: 149

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 24.05.2004 (Пн) 5:09

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

Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Type POINTAPI

x As Long

y As Long

End Type



dim i as long, j as long

dim cArray() as POINTAPI


with picture1

for i=0 to .Width / Screen.TwipsPrePixelX ' ScaleMode в Twip'ы

for j=0 to .Width / Screen.TwipsPrePixelY

if GetPixel(.hdc, i, j) = 0& then ' Работает с пикселами, не твипами (заместо ее можно использовать стандартную VB'шную, но она должна быть медленнее)

redim cArray(LUBound(cArray) + vbNull)

cArray(UBound(cArray)).X = i

cArray(UBound(cArray)).Y = j

end if

next

next

end with


private function LUBound(inArray as POINTAPI) as long

on error resume next

LUBound = &HFFFF

LUBound = UBound(inArray)

end function

- как мне сравнивать этот объект с массивом - чтобы отпределить, что это за фигура -

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 25.05.2004 (Вт) 11:43

Блин
у меня осталось две недели до сдачи курсовой - помогите с програмкой - горю

Aqualung
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 27.02.2004 (Пт) 23:56

Сообщение Aqualung » 25.05.2004 (Вт) 18:22

Точки каждой фигуры обозначаются своим собственным целым числом.

Далее, для каждой фигуры.

Находятся четыре точки:
А – точка с минимальным Х при минимально возможном У;
В – точка с максимальным Х при максимально возможном У;
С – точка с минимальным У при минимально возможном Х;
Д – точка с максимальным У при максимально возможном Х.

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

1. Четыре точки А, В, С, Д.
Если отрезок АС принадлежит фигуре – прямоугольник, нет – окружность.

2. Три точки А, В, С. Однозначно, треугольник.

3. Две точки А, В.
Если отрезок АВ не принадлежит фигуре – прямоугольник.
Если АВ принадлежит фигуре и точка с координатами Х=Х(А), У=У(В) также принадлежит фигуре, не совпадая, при этом, с одной из точек А или В, – треугольник, в противном случае – прямая.

Принадлежность отрезка фигуре, в данном случае, проще всего определить из принадлежности фигуре его середины. На всякий случай, координаты середины отрезка равны среднему арифметическому координат его концов.
Последний раз редактировалось Aqualung 26.05.2004 (Ср) 11:31, всего редактировалось 1 раз.

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 26.05.2004 (Ср) 5:38

to Aqualung - а ты сможешь это через код написать

Aqualung
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 27.02.2004 (Пт) 23:56

Сообщение Aqualung » 26.05.2004 (Ср) 11:33

Код довольно простой, но достаточно объемный, а я, все-таки, еще и работаю. Так что, извини, постарайся уж сам.

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 27.05.2004 (Чт) 5:10

to alibek
а ты не поможешь - помоги, если не трудно - очень, очень, очень надо

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 27.05.2004 (Чт) 9:35

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

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 28.05.2004 (Пт) 9:03

наверное лучше будет использовать bmp файл
квадрат не может быть соорентирован под другим углом
на рисунки будет только фигура, которую нужно распознать, лишних не будет

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 28.05.2004 (Пт) 10:58

Жаль, что отформатировал диск, был замечательный пример с нейросетями. Думаю в данном случае это то, что нужно.
ХЎ

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 28.05.2004 (Пт) 11:00

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

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 28.05.2004 (Пт) 11:08

Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As
Long) As Long
Private Type POINTAPI

x As Long
y As Long
End Type

Private Sub Form_Load()

Dim i As Long, j As Long
dim cArray() as POINTAPI

with picture1
For i = 0 To Me.Width / Screen.TwipsPerPixelX
For j = Me.Height / Screen.TwipsPerPixelY To 0 Step &HFFFF ' For j = 0 To Me.Height /
Screen.TwipsPerPixelY
Debug.Print i, j

redim cArray(LUBound(cArray) + vbNull)
cArray(UBound(cArray)).X = i
cArray(UBound(cArray)).Y = j
end if
next
next
end with

private function LUBound(inArray as POINTAPI) as long
on error resume next
LUBound = &HFFFF
LUBound = UBound(inArray)
end function

End Sub
- вот есть код - а как мне теперь сравнивать его смоими фигурками - есть идеи, код по этому поводу

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 28.05.2004 (Пт) 13:46

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 30.05.2004 (Вс) 8:46

TX

С тебя пиво :wink:

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 31.05.2004 (Пн) 6:54

Это то что я думаю?
Я просто щас на работе и проыерить смогу только вечеремо
- это та прога которая распозанет изображения
- тогда это просто супер

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 31.05.2004 (Пн) 9:52

Она, она. Распознает линии, прямоугольники, круги, оставшиеся считает треугольниками. Отсеивает мелкий мусор, допускает небольшие разрывы в фигурах. Отмечает распознанные фигуры соответствующим цветом, допускает вложенность фигур одна в другую... писал часа два - задача увлекла. :wink:
Над интерфейсом, естественно, не заморачивался - сам доделаешь.

SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Сообщение SeRRg » 31.05.2004 (Пн) 10:11

Респект. :!:
VB - это звучит!

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 31.05.2004 (Пн) 16:27

просто супер - спасибо - не подскажешь - как мне высвечивать на экран - что это за фигура
п.с. - как тебе пиво прислать - давай адресс - деньги на пиво пришлю - или дай адресс как тебя в инете найти - вот если что моя ася - стукни туда - 139150044

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 31.05.2004 (Пн) 17:25

2Mikle - извени за назойливость
напиши еще чтоб она искала квадраты
спасибо

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 01.06.2004 (Вт) 11:50

сам код просто отпад
вот если бы он еще квадрат определял
и высвечивал что эта за фигура
было бы супер-пупер
Не а вообще - Респект тебе

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 01.06.2004 (Вт) 12:35

Если код определения прямоугольников измненить так:
вместо:
Код: Выделить всё
  For n = 0 To Lw - 1
    If (Way(n).X = MinX) Or (Way(n).X = MaxX) Or (Way(n).Y = MinY) Or (Way(n).Y = MaxY) Then k = k + 1
  Next n
  If k / Lw > 0.95 Then
    For n = 0 To Lw - 1
      pic.PSet (Way(n).X, Way(n).Y), RGB(0, 192, 0)
    Next n
    Exit Sub
  End If

поставить:
Код: Выделить всё
  k = 0
  If Abs((MaxY - MinY) / (MaxX - MinX) - 1) < 0.1 Then r = RGB(0, 192, 0) Else r = RGB(192, 192, 192)
  For n = 0 To Lw - 1
    If (Way(n).X = MinX) Or (Way(n).X = MaxX) Or (Way(n).Y = MinY) Or (Way(n).Y = MaxY) Then k = k + 1
  Next n
  If k / Lw > 0.95 Then
    For n = 0 To Lw - 1
      pic.PSet (Way(n).X, Way(n).Y), r
    Next n
  Exit Sub

, квадраты будут выделены от остальных прямоугольников.

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 01.06.2004 (Вт) 12:39

а как сделать чтоб он высвечивал что эта за фигура?
:)

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 01.06.2004 (Вт) 12:41

и объясни плиз, что такое lw

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 01.06.2004 (Вт) 12:56

Поиск пролисходит так: заливка, затем анализ. Во время заливки ищется путь - way. Соответственно lw - len of way, длина пути (размер залитого фрагмента). А чтобы высвечивать найденную фигуру, после фрагмента:
For n = 0 To Lw - 1
pic.PSet (Way(n).X, Way(n).Y), RGB(0, 128, 255)
Next n
поставь что-то типа:
debug.print "найден квадрат"
в зависимости от того, какая фигура найдена.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 01.06.2004 (Вт) 12:58

ЗЫ
Пиво на мыло слать не надо - не люблю пиво с запахом мыла. :wink:

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 01.06.2004 (Вт) 13:00

ты не против - если у меня вдруш вопросы возникнут - я к тебе обращусь?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.06.2004 (Ср) 10:19

В пределах свободного времени. :roll:

TX
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 26.04.2004 (Пн) 10:44
Откуда: RUссия

Сообщение TX » 02.06.2004 (Ср) 13:08

2 Mikle:снимаю перед тобой шляпу!!! :D
1) - код определние прямоугольникво я изменил - но он что то глючит и вместо debugюзкште(это на работает) я поставил MsgBox "квадрат" и он мне все квадраты и прямоугольники за квадрат пишет - посмотри - я пытался сам его изменить - не помогло
2)- просьба - ты не мог бы свой код построчно объяснить - очень надо (ну и по мере свободного времени)

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 14

    TopList