Вверх ↑
Ответов: 8888
Рейтинг: 823
#1: 2015-12-19 17:53:13 ЛС | профиль | цитата
Tad писал(а):
в IC ни одного комментария
Предполагал в тегах выложить, а в них кириллица при неправильном копировании портит код Щаз напишу
------------ Дoбавленo в 17.02:
Add(InlineCode,2366711,630,203)
{
WorkPoints=#7:doStart|12:doFindBitmap|
EventPoints=#8:onResult|
VarPoints=#
DataPoints=#6:Bitmap|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|40: TByteArray = array [0..32767] of Byte;|27: PByteArray = ^TByteArray;|35: TBuf = array of array of integer;|2: |28: THiAsmClass = class(TDebug)|10: private|22: buf1, buf2: TBuf;|9: public|26: _data_Data:THI_Event;|23: Bitmap: THI_Event;|25: onResult: THI_Event;|52: procedure doStart(var _Data:TData; Index:word);|57: procedure doFindBitmap(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|40:function LoagIMG(var Bmp:PBitmap) :TBuf;|3:var|17: i,j,k: integer;|16: p: pByteArray;|15: buffer: TBuf;|5:begin|65: Bmp.PixelFormat:=pf24Bit; //Формат картинки|63: SetLength(buffer, Bmp.Height, Bmp.Width*3); //Размер буфера|87: for j:=0 to Bmp.Height-1 do //Заполнение буфера данными из картинки|8: begin|62: p:=Bmp.ScanLine[j]; //Чтение линии|103: for i:=0 to Bmp.Width-1 do for k:=0 to 2 do buffer[j,i*3+k]:= p[i*3+k]; //Перенос данных из линии|7: end;|67: Result := buffer; //Выдача результата|4:end;|0:|30:procedure THiAsmClass.doStart;|3:var|19: Bmp:PBitmap; |5:begin|69: Bmp := ReadBitmap(_Data,Bitmap); //Чтение картинки-фона|42: if (Bmp = nil) or Bmp.Empty then exit;|0:|82: buf2 := LoagIMG(Bmp); //Загрузка картинки фона в буфер №2|15: buf1:=buf2;|4:end;|4: |35:procedure THiAsmClass.doFindBitmap;|3:var|16: Bmp:PBitmap;|54: i,j,k,Xb,Yb,Xe,Ye,Width1,Height1,Temp:integer; |5:begin|66: Bmp := ReadBitmap(_Data,Bitmap); //Чтение картинки|42: if (Bmp = nil) or Bmp.Empty then exit;|84: buf1 := LoagIMG(Bmp); //Загрузка картинки фона в буфер №1|76: Width1:=Bmp.Width-1; //Ширина картинки для цикла|76: Height1:=Bmp.Height-1; //Высота картинки для цикла|15: //Bmp.Free;|95: Xb:=640; //Установка X начального адреса не совпадений |94: Yb:=640; //Установка Y начального адреса не совпадений|93: Xe:=-1; //Установка X конечного адреса не совпадений|93: Ye:=-1; //Установка Y конечного адреса не совпадений|97: for j:=0 to Height1 do //Поиск по ВСЕЙ картинке не совпадающих пикселей|12: begin |29: for i:=0 to Width1 do|14: begin|26: for k:=0 to 2 do|16: begin|46: Temp:=buf1[j,i*3+k]-buf2[j,i*3+k];|74: if abs(Temp)>100 then //Если разница более 100 |49: begin |88: if i<Xb then Xb:=i; //запоминаем адрес начала не совпадений|34: if j<Yb then Yb:=j;|95: if i>Xe then Xe:=i; //или запоминаем адрес окончания не совпадений|49: if j>Yb then Ye:=j; |18: end;|15: end;|13: end;|10: end;|114: _hi_onEvent(onResult, int2str(round((Xb+Xe)/2))+';'+int2str(round((Yb+Ye)/2))); //Выводим центр не совпадений |4:end;|4:end.|
}


------------ Дoбавленo в 17.17:
Tad писал(а):
Зачем время повторного слежения...
Предполагается картинка будет поступать с видеокамеры, тогда можно (и нужно) и синхронизацию ввести. Сейчас пишу проработку по трём кадрам (позавчерашний, вчерашний и текущий) без заранее снятого фона.
карма: 19

0