Страница: 1 | 2 | 3 | 4 |
Вопрос: Поиск нужного фрагмента рисунка на экране.
Добавлено: 25.05.07 19:38
Автор вопроса: Andrey
Ответы
Всего ответов: 59
Номер ответа: 16
Автор ответа:
Andrey
Вопросов: 1
Ответов: 11
Профиль | | #16
Добавлено: 26.05.07 13:53
в принципе в моем примере уникална полоска толщиной в один пиксель и длинной в 90 пикселей. а это значит что придется использовать цикл по подтверждению подлинности рисунка 90 раз. можно даже сократить до 40 пиклелей... но суть то в другом. это получается подгон под ответ, а если я захочу изменить рисунок?
Чем больше рисунок, который нужно найти, тем дольше работает программа... это ясно. использовать буду маленький рисунок, суммарная масса пикселей которого не привышает 500.
Номер ответа: 17
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #17
Добавлено: 26.05.07 17:17
Пример можно = http://vbnet.ru/forum/show.aspx?id=142546
Номер ответа: 18
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #18
Добавлено: 26.05.07 17:21
10 сек - это уже очень долго. У меня обработка рисунка в четверть экрана меньше секунды.
500 пикселей? Это рисунок 50x10? Насмешил. Что в таком рисунке можно разместить? 300x300 (90000) у меня обрабатывается незаметно (>30fps точно)
Номер ответа: 19
Автор ответа:
Andrey
Вопросов: 1
Ответов: 11
Профиль | | #19
Добавлено: 26.05.07 19:13
ZagZag
основной рисунок (скрин экрана) 1024*768, а фрагмент который нужно будет найти 5*90 пикселей. вот я и спрашиваю, сколько по времени это займет.
(прошлый раз немного не так выразился)
Номер ответа: 20
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #20
Добавлено: 27.05.07 20:50
Сколько времени займет?
Столько же сколько займет поиск 450 байт в массиве из 786432 байт. Совсем немного, кстати.
Я предложил вариант работы с картинкой как с массивом, потомучто в этом случае торможения на работу с картинкой не происходит.
Осталось только придумать как найти 450 байт в одномерном массиве из 786432 байт (который можно представить как двухмерный, т.е. строки идут слева направо, сверху вниз)
Я предлагаю искать первую строку (5 байт), а дальше проверять остальные 89 строк под ней, и если все сходится, то координаты найдены.
Координаты 89 строк можно вычислить без всякого поиска, просто прибавляя 1024 к позиции найденой первой строки
PS
Сам мало понял что написал, но код за "спасибо" реализовывать лень.
Номер ответа: 21
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #21
Добавлено: 28.05.07 14:31
Зачем юзать массивы пикселей, когда есть PictureBox?
Работает в кучу раз быстрее.
Номер ответа: 22
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #22
Добавлено: 28.05.07 14:39
Sub Find()
Dim X As Integer
Dim Y As Integer
For X = 1 To picScreen.ScaleWidth
For Y = 1 To picScreen.ScaleHeight
If picScreen.Point(X, Y) = picCusok.Point(1, 1) Then
If Toch(X, Y) Then
MsgBox X & "; " & Y
End If
End If
Next Y
Next X
End Sub
Function Toch(StX As Integer, StY As Integer) As Boolean
Dim X As Integer
Dim Y As Integer
Dim l As Boolean
l = True
For X = StX To StX + picCusok.ScaleWidth
For Y = StY To StY + picCusok.ScaleHeight
If picScreen.Point(X, Y) <> picCusok.Point(X - StX + 1, Y - StY + 1) Then
l = False
Exit For
Next Y
If l = False Then Exit For
Next X
Toch = l
End Function
Номер ответа: 23
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #23
Добавлено: 28.05.07 15:43
Вот погоди, реализую это через массив и сравним скороть
Номер ответа: 24
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #24
Добавлено: 28.05.07 16:10
А я вот не понимаю: в VB много раз пробовал писать обработщики изображений, и не разу у меня не было полсекундного срабатывания.
Номер ответа: 25
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #25
Добавлено: 28.05.07 16:12
В смысле от 10 секунд и выше (брал по пиксельно, а не потвипово)
Номер ответа: 26
Автор ответа:
Andrey
Вопросов: 1
Ответов: 11
Профиль | | #26
Добавлено: 28.05.07 16:15
написал выбор через массив. правда заполнял его рандомом...
Option Explicit
Dim MassLadge(1 To 1024, 1 To 768) As Integer
Dim MassLadgeX As Integer
Dim MassLadgeY As Integer
Dim MassSmall(1 To 43, 1 To 5) As Integer
Private Sub Command1_Click()
'рондом заполняет массив
For MassLadgeY = 1 To 768
For MassLadgeX = 1 To 1024
MassLadge(MassLadgeX, MassLadgeY) = Fix(Rnd * 2)
Next MassLadgeX
Next MassLadgeY
For MassSmallX = 1 To 20
For MassSmallY = 1 To 5
MassSmall(MassSmallX, MassSmallY) = Fix(Rnd * 1)
Next MassSmallY
Next MassSmallX
End Sub
Private Sub Command2_Click()
' проводится сравнение массива на совпадение.
'
Dim MassLadgeXStr As String
Dim MassLadgeYStr As String
Dim i As Integer
Dim l As Integer
Dim a As Integer
Dim b As Integer
a = 1
b = 1
For MassLadgeY = 1 To 768 - 5
For MassLadgeX = 1 To 1024 - 43
If MassLadge(MassLadgeX, MassLadgeY) = MassSmall(1, 1) Then
MassLadgeXStr = MassLadgeX
MassLadgeYStr = MassLadgeY
i = MassLadgeX
l = MassLadgeY
Label1(1).Caption = MassLadge(MassLadgeX, MassLadgeY)
For b = 1 To 5
If MassLadge(i, l) <> MassSmall(a, b) Then Exit For
For a = 1 To 43
If MassLadge(i, l) <> MassSmall(a, b) Then Exit For
If i = MassLadgeX + 42 Then
If l = MassLadgeY + 4 Then
Label1(0).Caption = MassLadgeXStr + " x " + MassLadgeYStr
' TxtMouseMoveX = MassLadgeX
' TxtMouseMoveY = MassLadgeY
' TmrMouseMoveXY = True
' Label1.Caption = MassLadgeXStr + " x " + MassLadgeYStr
End If
End If
i = i + 1
Next a
l = l + 1
a = 1
i = MassLadgeX
Next b
End If
Next MassLadgeX
Next MassLadgeY
End Sub
Номер ответа: 27
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #27
Добавлено: 28.05.07 16:17
ZagZag, твой выход
Номер ответа: 28
Автор ответа:
Andrey
Вопросов: 1
Ответов: 11
Профиль | | #28
Добавлено: 28.05.07 17:35
Проблема оказалась в другом. непонятно чем заполняется массив. может стоит его сделать строковым?
Номер ответа: 29
Автор ответа:
Andrey
Вопросов: 1
Ответов: 11
Профиль | | #29
Добавлено: 28.05.07 17:37
твой вариант у меня все повесил... хотя он и проще по коду кажется)
Номер ответа: 30
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #30
Добавлено: 28.05.07 19:10