Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Алгоритм сравнения двух TBitmap   Найти похожие ветки 

 
deamon_t   (2006-01-21 12:52) [0]

Привет всем. Есть такая задача: сравнить два битмапа, как можно с меньшими затратами процессорного времени, и это надо делать очень часто. Я написал функцию CompareBitmaps, функция возвращает массив с номерами изменившимихся квадратиков (размер этих квадратиков передаеться в функцию RectHeigth,RectWith). Вродебы она работает но при заспуске её она занимает 100% времени процессора. Как её оптимизировать?

Для быстрого доступа к TBitmap я использвал модуль UQPIXELS, который нашел в статье на этом сайте.

Заранее спасибо


uses Graphics,UQPIXELS;

type
 TIntList=array of integer;
end;

function CompareBitmaps(Var Bitmap1,Bitmap2:TBitmap;RectHeigth,RectWith:integer;Var QP1,QP2:TQuickPixels):TIntList;
var res:TIntList;
   rowI,rowJ,I,J,NomerMozaik:Integer;
   BitP1,BitP2:Pointer;
   TheSkipAll:Boolean;
   
begin
  QP1.Attach(Bitmap1);
  QP2.Attach(Bitmap2);
  rowI:=0;rowJ:=0;NomerMozaik:=0;TheSkipAll:=false;
  While rowI<=Bitmap1.Height do
  begin
   For I:=rowI to rowI+RectHeigth do
    begin
     For J:=rowJ to rowJ+RectWith do
       begin
         if (J<(Bitmap1.Height)) and (I<(Bitmap1.Width)) then
           begin
             //Сравниваем, если находим совпадение добаляем в массив одно значение
             //И выходим из цикла
             if QP1.Pixels[I,J]<>QP2.Pixels[I,J] then
               begin
                 SetLength(Result,Length(Result)+1);
                 Result[Length(Result)-1]:=NomerMozaik;
                 TheSkipAll:=true;
                 Break;
               end;
           end;
       end;
         if TheSkipAll then
           begin
              TheSkipAll:=false;
              Break;
           end;
    end;
  //Тут переопределяем кубик
    Inc(NomerMozaik);
    if (rowJ+RectWith)>Bitmap1.Width then
     begin
       rowI:=rowI+RectHeigth;
       rowJ:=0;
     end else rowJ:=rowJ+RectWith;
  end;
end;



 
Набережных С. ©   (2006-01-21 15:03) [1]


> Вродебы она работает но при заспуске её она занимает 100%
> времени процессора

Любая функция во время ее выполнения занимает 100%  времени используемого текущим потоком процессора, за исключением следующих случаев:
- в ее теле вызывается Sleep
- в ее теле вызывается одна из функций ожидания системного события
- в ее теле производится попытка входа в занятую критическую секцию
- одновременно с ней на том же процессоре выполняются другие функции в других потоках, и эти функции ничего не ждут.


 
Gero ©   (2006-01-21 15:23) [2]

Существенно оптимизировать нельзя.


 
MBo ©   (2006-01-21 16:46) [3]

Обращение к пикселам существенно уже не ускорить, а вот это:
>SetLength(Result,Length(Result)+1);
нехорошо. Постоянная реаллокация памяти - занимает изрядно времени. По крайней мере, стоит увеличивать длину массива на значительную величину - скажем, на 16 элементов - количество перераспределений памяти снизится во столько же раз.


 
tesseract ©   (2006-01-21 16:46) [4]

Pixels занимает много процессорного времени.
Лучше,  использовать Scaline. Я лично не знаю насколько быстр UQPIXELS, тк это обёртка на scanline,да ты ещё в них регулярно память перебрасываешь.
Уж лучше реально - FastImage/DIB.

Пример scanline

for y := 0 to BitMap.Height -1 do
   begin
     P := BitMap.ScanLine[y];
     for x := 0 to BitMap.Width -1 do
       P[x] := y;
   end;


SetLength часто тоже лучше не применять. Лучше длину сделать большей, а потом, если уж очень нужно подрезать.


 
TUser ©   (2006-01-21 17:10) [5]

Если ожидается, что результат "совпадают полностью" будет возникать часто - то можно обойтись сравнением контрольных сумм. Вероятность ошибки ничтожна.


 
deamon_t   (2006-01-21 17:58) [6]

MBo ©

На самом деле релокация массива происходит относительно не часто (только если битмап изменился) , и даже если она происходит по максимуму т.е. битмап изменился польность то не более 80 раз, так как картинки деляться на кубики 100х100.

tesseract

Все дело в том что я сравниваю кубиками, т.е. делю битмап на кубики 100 на 100, и сравниваю попиксельно до первого несовпадения, следовательно в режиме 1024х768 мне надо будет вызывать функцию ScanLine при идеальном алгоритме 1024 раз за функцию, т.е. для каждой строки, мне показалось это неудачным решением, а функция Pixels вроде напрямую обращаеться к битмапу, вот она ниже...


function TQuickPixels.GetPixels16(X, Y: Integer): TColor;
asm
 imul ecx,[eax].FDelta
 add ecx,[eax].FStart
 movzx eax,word ptr [ecx+2*edx] //PWord(FStart + FDelta * Y + (X * 2))^
 mov ecx,eax
 and ecx,$1F
 imul ecx,541052
 and ecx,$FF0000
 mov edx,eax
 and edx,$7E0
 imul edx,135263
 shr edx,12
 and eax,$F800
 and edx,$FF00
 imul eax,135263
 shr eax,24
 or eax,ecx
 or eax,edx
end;


TUser

Думаешь будет быстрее? А как именно контрольной суммой? Можно примерчик?


 
tesseract ©   (2006-01-21 19:27) [7]

Откуда беруться битмапы?
Может проще будет отслеживать попытку их изменения?


 
deamon_t   (2006-01-21 19:59) [8]

Битмапы это скриншоты экрана, которые делаються с заданной частотой, цель передавать их на другой компьютер.


 
tesseract ©   (2006-01-22 13:57) [9]

А RAT пишем. А  сравнивать что-бы меньше траффика занимало.
Тода можно таким методом, сводишь к 16 бит (экономим). Переводишь с с передающей стороны в массив (system.Move?) и уже с ним работаешь. В случае массива таких  затрат на один пиксел уже не будет.


 
Eraser ©   (2006-01-22 16:14) [10]


> deamon_t   (21.01.06 19:59) [8]


> Битмапы это скриншоты экрана, которые делаються с заданной
> частотой, цель передавать их на другой компьютер.

не ты первый - не ты последний :)


 
Eraser ©   (2006-01-22 17:04) [11]

вот по теме пара ссылок
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=29531
http://www.realvnc.com/pipermail/vnc-list/2001-March/020802.html


 
Eraser ©   (2006-01-22 17:05) [12]

вот по теме пара ссылок
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=29531
http://www.realvnc.com/pipermail/vnc-list/2001-March/020802.html


 
Eraser ©   (2006-01-22 17:05) [13]

вот по теме пара ссылок
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=29531
http://www.realvnc.com/pipermail/vnc-list/2001-March/020802.html


 
Eraser ©   (2006-01-22 17:05) [14]

sorry за дубли.


 
Рыцарь   (2006-01-24 08:08) [15]

В какой из инет магазинов лучше регистрироваться чтобы больше покупали и какие проги надо продавать.
Помогите плизззззззззз...
P.S.
Прога создающая стерео изображение годится?



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
2-1149755108
Perf2k2
2006-06-08 12:25
2006.06.25
Вопрос по алгоритму


3-1145995287
kreyl
2006-04-26 00:01
2006.06.25
Медленное обновление БД


1-1147967851
agaga
2006-05-18 19:57
2006.06.25
Запретить растягивать картинку


15-1149143398
Игорь Шевченко
2006-06-01 10:29
2006.06.25
Offtopic: Ищется квартира в Москве на предмет снять :)


5-1130167379
Ling
2005-10-24 19:22
2006.06.25
Свой TEdit