Картинк должна браться с рабочего стола... Допустим эта картинка будет выглядеть так -------------------------- -------------------------- -------------------------- + Это чёрные пикселя -------------------------- - Это белые пикселя ------++----------------- ------++----------------- Картинка будет сниматься с экрана 25 раз в секнду, ----+++++--------------- Операции с поиском нужной части битмапы должны ----+++++--------------- производиться очень быстро..... ------++----------------- ------++----------------- -------------------------- -------------------------- Моя идея такова: Ищем хоть один чёрный пиксел,узнаём его координаты, прибавляем к его координате х одиничку и по новым координатам сверяем пикселя если он чёрный значит мы нашли нашу картинку, теперь нужно убедиться,для этого мы прибавляем к кординате Y пятёрочку,сверяем пиксел по новым координатам,если он чёрный то это наш обьект с координатами левого угла (x-2,y) Ну а теперь задача... 1)нужно поместить Битмап с экрана в память... 2)Как лучше искать в нём нужный пиксел a)Сверяя каждый пиксел поочерёдно b)Както по другому Если a) то как сверить пиксел с координатами например 1 1 если битмап находится в памяти или в переменной??? Я уже теряюсь вообщем отписуйте любые интересные идеи....
Конкретно твой случай, который ты описал в примере? очень прост. Т.е. если изображение двоичное, то множество всех чёрных пикселей можно обозначить A, а их границу b(A), тогда для выделения границ достаточно сделать сдедующее: Операция в скобках - эрозия множества A по примитиву B. Пример использования алгоритма выше: Единственное замечание по примеру: множеством A здесь называется множество белых пикселей. Объект ты ограничил и в состоянии получить координаты всех границ. Больше ничего не могу сказать, ибо недостаточно данных. PS Пример взят из книги Digital Image Processing R. Gonzalez R. Woods
devillsd А в чем задача? Пиксели можно последовательно искать, а можно и случайно. addr=start+y*BytePerLine+x*BytePerPixel А дальше сравниваешь как тебе надо и в зависимости от формата пикселя
Обьясни пожалуйста что это?? Я же бегинер, я не просто в этот раздел отписал... Напишы мне кусок кода как это применить...Тогда я разберусь А так мне эти строчки ничего не говорят,сам алгоритм посика я примерно для себя представил..а вот как мою фантазию написать на АСМЕ вот это меня и интересует Например я думал зделать так(Для десктопа с разрешением 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 давала мне инуфу по пикселям... ХЕЛП
devillsd Таймер не может работать каждые 40 мс. 55 мс - минимальный интервал. А с Вашим GetPixel Вы и за час не управитесь. Думаю, что в 55 мс Вы и с помощью BitBlt не уложитесь. Но можете попробовать: Берете хэндл контекста устройства экрана (GetDC(0)/GetWindowDC(0)) 1) На его основе создаете совместимый: CreateCompatibleDC 2) Также на его основе создаете совместимый битмап: CreateCompatibleBitmap 3) Выбираете полученный битмап в созданный контекст: SelectObject 4) Копируете из контекста экрана в созданный Вами контекст: BitBlt 5) Выполняете с созданным Вами битмапом необходимые действия. 6) Не забываете освободить контекст экрана, удалить созданный Вами контекст и удалить созданный Вами битмап: ReleaseDC, DeleteDC, DeleteObject.
Меня то эти действия и интересуют!!! Всё что вы написали нужно выполнять при Методе с GetPixel(ЧТо я уже протестировал,увы чтобы сверить все пикселы требуеться 3,5 секунды меня это абсолютно не устраивает+ресурсы загружаються до 100%=( ..) Предлагайте действия мне жызненно необходимо вложиться хотябы в 100 мс (кстати у меня почемуто таймер работает даже на 1 мс) Да кстати 11 клас я косил поэтому Эрозии и радикалов (походу) не знаю Если ктото может разшифровать вот это (если это действительно может мне помочь)то пожалуйста!
devillsd Вообще-то я ответил вот на это: Соответственно картинка бы хранилась в памяти, выделенной под объект битмап. Работает, конечно, но с частотой не более 18,2 раза в секунду, но никак не килогерц.
devillsd Кстати, после получения битмапа, копируете его содержимое к себе в заранее выделенный буфер (GetBitmapBits или GetDIBits) и работаете с памятью, а не с тормозными функциями типа GetPixel.
l_inc Вы отстали от жизни. Таймер уже давно работает с большей частотой от 18 до 1000Гц Причем есть еще мультимидийный таймер он работает лучши обыкновенного - срабатывает через заданный интервал времени, в отличии от простого который интервал не держит. devillsd Изоброжнение сохроняется в битмам и дальше работа идет с ним путем прямого доступа к байтам изоброжения. И еще желательно чтобы изоброжение было выравненно по границе 16байт.
Pavia Решил перепроверить. Да, действительно быстрее. Но килогерц - это все равно слишком. Прикладываю пример, на котором два таймера с запрашиваемыми частотами в гектогерц и килогерц дают на самом деле одинаковую частоту. P.S. Ну... у меня дают. На XP SP2; P4 3,4.
Таймеры.... Код (Text): invoke CreateEvent,0,TRUE,FALSE,0 mov hWait1,eax invoke timeSetEvent,20,0,addr TimerFunc,hWait1,TIME_PERIODIC mov hTimer,eax TimerFunc proc a,b,hWait,ce,d invoke PulseEvent,hWait ret TimerFunc endp
Сначала обрадовался,потом переделал какртинку на разрешение 1024*768-увы скорость таже ~ 3.5 секунды=( Мне нужно вложиться в 100 мс, я начинаю представлять себя за книжкой по нейросетям.. Побереги Господь... У кого ещё есть какие-то идеи...
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 А где мжно почитать про аппаратные врозможности в этом направлении?