Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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.

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
твой вариант у меня все повесил... хотя он и проще по коду кажется)
Там надо +/- 1 где нибудь преписать, точно я не знаю, сам не пробовал :))))))

Ответить

Страница: 1 | 2 | 3 | 4 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам