Анализ и поиск обьектов на картинке...помогите осуществить

Тема в разделе "WASM.BEGINNERS", создана пользователем devillsd, 30 мар 2008.

  1. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Картинк должна браться с рабочего стола...
    Допустим эта картинка будет выглядеть так
    --------------------------
    --------------------------
    -------------------------- + Это чёрные пикселя
    -------------------------- - Это белые пикселя
    ------++-----------------
    ------++----------------- Картинка будет сниматься с экрана 25 раз в секнду,
    ----+++++--------------- Операции с поиском нужной части битмапы должны
    ----+++++--------------- производиться очень быстро.....
    ------++-----------------
    ------++-----------------
    --------------------------
    --------------------------
    Моя идея такова:
    Ищем хоть один чёрный пиксел,узнаём его координаты, прибавляем к его координате х одиничку и по новым координатам сверяем пикселя если он чёрный значит мы нашли нашу картинку, теперь нужно убедиться,для этого мы прибавляем к кординате Y пятёрочку,сверяем пиксел по новым координатам,если он чёрный то это наш обьект с координатами левого угла (x-2,y)

    Ну а теперь задача...
    1)нужно поместить Битмап с экрана в память...
    2)Как лучше искать в нём нужный пиксел
    a)Сверяя каждый пиксел поочерёдно
    b)Както по другому
    Если a) то как сверить пиксел с координатами например 1 1 если битмап находится в памяти или в переменной???

    Я уже теряюсь вообщем отписуйте любые интересные идеи....
     
  2. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Конкретно твой случай, который ты описал в примере? очень прост. Т.е. если изображение двоичное, то множество всех чёрных пикселей можно обозначить A, а их границу b(A), тогда для выделения границ достаточно сделать сдедующее:

    [​IMG]

    Операция в скобках - эрозия множества A по примитиву B.

    Пример использования алгоритма выше:

    [​IMG]

    Единственное замечание по примеру: множеством A здесь называется множество белых пикселей.

    Объект ты ограничил и в состоянии получить координаты всех границ.

    Больше ничего не могу сказать, ибо недостаточно данных.

    PS Пример взят из книги Digital Image Processing R. Gonzalez R. Woods
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    devillsd
    А в чем задача? Пиксели можно последовательно искать, а можно и случайно.
    :lol:

    addr=start+y*BytePerLine+x*BytePerPixel

    А дальше сравниваешь как тебе надо и в зависимости от формата пикселя
     
  4. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Обьясни пожалуйста что это?? Я же бегинер, я не просто в этот раздел отписал...
    Напишы мне кусок кода как это применить...Тогда я разберусь
    А так мне эти строчки ничего не говорят,сам алгоритм посика я примерно для себя представил..а вот как мою фантазию написать на АСМЕ вот это меня и интересует
    Например я думал зделать так(Для десктопа с разрешением 1024 768)
    .WHILE(y!=768)
    .WHILE(x!=1024)
    invoke GetDC,0
    mov cdc
    invoke GetPixel,cdc,x,y
    ;;;Тут сравение и все нужные операции(Да кстати у меня битмапа не будет монохронной,но и фон меня не интересует,вот обьекты будут монохронные(но разных цветов)
    invoke ReliseDC,cdc
    ink x (стыдно не помню оператор прибавить 1, ну вроди так)
    .ENDW
    ink y(тоже самое)
    .ENDW
    НООООО Уменя то таймер работает каждые 40 мс а в это время изображение может поменятьсо, обьект может поменять место и всё капец нифига не пашет
    Поэтому Getpixel нужно заменить
    Нужно чтобы картинка бралась с десктопа и хранилась гдето
    Ну и какойто апи типа GetPixel давала мне инуфу по пикселям...
    ХЕЛП
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    devillsd
    Таймер не может работать каждые 40 мс. 55 мс - минимальный интервал. А с Вашим GetPixel Вы и за час не управитесь. Думаю, что в 55 мс Вы и с помощью BitBlt не уложитесь. Но можете попробовать:
    Берете хэндл контекста устройства экрана (GetDC(0)/GetWindowDC(0))
    1) На его основе создаете совместимый: CreateCompatibleDC
    2) Также на его основе создаете совместимый битмап: CreateCompatibleBitmap
    3) Выбираете полученный битмап в созданный контекст: SelectObject
    4) Копируете из контекста экрана в созданный Вами контекст: BitBlt
    5) Выполняете с созданным Вами битмапом необходимые действия.
    6) Не забываете освободить контекст экрана, удалить созданный Вами контекст и удалить созданный Вами битмап: ReleaseDC, DeleteDC, DeleteObject.
     
  6. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Меня то эти действия и интересуют!!!
    Всё что вы написали нужно выполнять при Методе с GetPixel(ЧТо я уже протестировал,увы чтобы сверить все пикселы требуеться 3,5 секунды меня это абсолютно не устраивает+ресурсы загружаються до 100%=( ..)
    Предлагайте действия мне жызненно необходимо вложиться хотябы в 100 мс (кстати у меня почемуто таймер работает даже на 1 мс)
    Да кстати 11 клас я косил поэтому Эрозии и радикалов (походу) не знаю
    Если ктото может разшифровать вот это
    (если это действительно может мне помочь)то пожалуйста!
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    devillsd
    Вообще-то я ответил вот на это:
    Соответственно картинка бы хранилась в памяти, выделенной под объект битмап.
    Работает, конечно, но с частотой не более 18,2 раза в секунду, но никак не килогерц.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    devillsd
    Кстати, после получения битмапа, копируете его содержимое к себе в заранее выделенный буфер (GetBitmapBits или GetDIBits) и работаете с памятью, а не с тормозными функциями типа GetPixel.
     
  9. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    l_inc
    100%
    работа с памятью - это самое то.
    Фильтровал видео таким способом всё успевал.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    l_inc
    Вы отстали от жизни. Таймер уже давно работает с большей частотой от 18 до 1000Гц
    Причем есть еще мультимидийный таймер он работает лучши обыкновенного - срабатывает через заданный интервал времени, в отличии от простого который интервал не держит.

    devillsd
    Изоброжнение сохроняется в битмам и дальше работа идет с ним путем прямого доступа к байтам изоброжения. И еще желательно чтобы изоброжение было выравненно по границе 16байт.
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Pavia
    Решил перепроверить. Да, действительно быстрее. Но килогерц - это все равно слишком. Прикладываю пример, на котором два таймера с запрашиваемыми частотами в гектогерц и килогерц дают на самом деле одинаковую частоту.
    P.S. Ну... у меня дают. На XP SP2; P4 3,4.
     
  12. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    Таймеры....
    Код (Text):
    1.     invoke CreateEvent,0,TRUE,FALSE,0
    2.     mov hWait1,eax
    3.     invoke timeSetEvent,20,0,addr TimerFunc,hWait1,TIME_PERIODIC
    4.     mov hTimer,eax
    5.  
    6. TimerFunc proc a,b,hWait,ce,d
    7.    
    8.     invoke PulseEvent,hWait
    9.     ret
    10.  
    11. TimerFunc endp
     
  13. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  14. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    Сначала обрадовался,потом переделал какртинку на разрешение 1024*768-увы скорость таже ~ 3.5 секунды=(
    Мне нужно вложиться в 100 мс, я начинаю представлять себя за книжкой по нейросетям..
    Побереги Господь...
    У кого ещё есть какие-то идеи...
     
  15. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  16. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    devillsd
    Тогда нужно думать об аппаратном решении - часть работы делать прямо в видео-карте.
     
  17. devillsd

    devillsd New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    131
    temp666
    Слухай у меня почемуто твоя не компилиться=((Кстати исунок ты пределал в точно такой как и я координаты совпали до пиксела=)
    Говорит:
    :\finder1\finder.asm(163) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(171) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(178) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(229) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(257) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(258) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(425) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(454) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(502) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(503) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(525) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(568) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(614) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(657) : error A2006: undefined symbol : free
    D:\finder1\finder.asm(688) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(765) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(918) : error A2006: undefined symbol : malloc
    D:\finder1\finder.asm(943) : error A2006: undefined symbol : free
    Что не так?
    valterg
    А где мжно почитать про аппаратные врозможности в этом направлении?
     
  18. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141