Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2011, 17:07   #1
brazhnik
Новичок
Джуниор
 
Регистрация: 09.09.2011
Сообщений: 2
По умолчанию При работе программы чем-то забивается память..

Есть программа, которая должна считать фокусировку веб-камеры.

Для этого берется изображение с камеры, считается его гистограмма, и в ней считается максимальная разница между соседними значениями, которая есть мера фокусировки. Т.к. изображение камеры немного плывет, производится усреднение изображения по нескольким кадрам.

После 3-5 сотен кадров вылетает сообщение о недостаточности памяти. Если взять один кадр усредненный по 500м, то получается тоже самое.

Подскажите, пожалуйста, как можно остановить увеличение занимаемой программой памяти?

Вроде бы все что можно уже чистится..

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  hWndC := 0;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
Label1.Caption := '  Идет расчет.. ';
kolkadrov:=StrToInt(Edit1.text);
if hWndC <> 0 then
begin
//начало цикла по изображениям, по которым идет усреднение:
for igisglob:=1 to kolkadrov do
begin

//ОЧИСТКА ПАМЯТИ?
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
 MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
 SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
 CloseHandle(MainHandle);
end;
end;
//ОЧИСТКА ПАМЯТИ? ЗАВЕРШЕНА

     //Создание форм для изображений:
     begin
        SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0); 
        SendMessage(hWndC, WM_CAP_EDIT_COPY, 0, 0);
        bmp := TBitmap.Create;
        bmpgis := TBitmap.Create;
        bmpb1 := TBitmap.Create;

        bmp.Assign(clipboard);
        bmpgis.Assign(clipboard);
        bmpb1.Assign(clipboard);

        bmp.PixelFormat:= pf24bit;
        bmpgis.PixelFormat:= pf24bit;
        bmpb1.PixelFormat:= pf24bit;
     end;

   //заливка изображений фоном:
   for m := 0 to bmp.Height - 1 do
   begin
     ByteArraygis := bmpgis.ScanLine[m];
     ByteArrayb1 := bmpb1.ScanLine[m];
     for n := 0 to bmp.Width *3- 1 do
     begin
      ByteArraygis[n] := 255;
      ByteArrayb1[n] := 0;
     end;
   end;

   //создание массива ч-б изображений (графиков распределений яркости):
   setlength(bb1,kolkadrov+10,480,640);
   for j := 1 to bmp.Height - 1 do
   begin
     ByteArray := bmp.ScanLine[j];
     for ii := 1 to bmp.Width - 1 do
     begin
       x:=ii*3;
      bb1[igisglob,j,ii]:= Round((ByteArray[x+1]+ByteArray[x+2]+ByteArray[x])/3);
     end;
   end;
   ZeroMemory(@bytearray, SizeOf(bytearray));
   Dispose(bytearray);
//конец цикла по изображениям.
end;

//создание усредненного изображения и его гистограммы:
setlength(b1,480,640);
setlength(gis,255);
   for igis:= 0 to 255 do gis[igis]:=0;
   for j := 1 to bmp.Height - 1 do
   begin
     for ii := 1 to bmp.Width - 1 do
     begin
      h:=0;
      for i:=1 to kolkadrov do h:= h+bb1[i,j,ii];
      b1[j,ii]:= Round(h/kolkadrov);
      gis[b1[j,ii]]:=gis[b1[j,ii]]+1;
     end;
   end;
   ZeroMemory(@bb1, SizeOf(bb1));
   kgis:=480;
   kgis2:=1;
//определение максимальной разности соседних столбцов гистограммы и масштабирование гистограммы:
   for igis:=0 to 254 do
   begin
   if kgis2<Abs(gis[igis]-gis[igis+1]) then kgis2:=Abs(gis[igis]-gis[igis+1]);
   gis[igis]:=round(gis[igis]/640);
   end;
//Прорисовка гистограммы в BitMape:
   for igis:=1 to kgis-1 do
   begin
     ByteArraygis := bmpgis.ScanLine[igis];
     for i:= 1 to 254 do
      begin
      if igis<254-round(gis[i]) then ByteArraygis[i*3] := 255
      else ByteArraygis[i*3+1] := 0;
      end;
   end;

   ZeroMemory(@bytearraygis, SizeOf(bytearraygis));
   Dispose(bytearraygis);
   label5.caption:='гистограмма усредн. кадра';
   Image8.Picture.Bitmap.Assign(bmpgis) ;
   Image8.Picture.Bitmap.Width := 255;
   Image8.Picture.Bitmap.Height := Round(kgis/2)+15;

//Прорисовка усредненного изоражения в BitMape:
   for j := 1 to bmp.Height - 1 do
   begin
     ByteArrayb1 := bmpb1.ScanLine[j];
     for ii := 1 to bmp.Width - 1 do
     begin
       x:=ii*3;
      ByteArrayb1[x] := b1[j,ii];
      ByteArrayb1[x+1] := b1[j,ii];
      ByteArrayb1[x+2] := b1[j,ii];
     end;
    end;

Label1.Caption := 'Контраст по гистограмме усредненного кадра: '+IntToStr(kgis2);
Image5.Picture.Bitmap.Assign(bmpb1) ;
ZeroMemory(@b1, SizeOf(b1));
ZeroMemory(@bytearrayb1, SizeOf(bytearrayb1));
Dispose(bytearrayb1);
setlength(b1,0,0);
setlength(bb1,0,0,0);
setlength(gis,0);
b1:=nil;
bb1:=nil;
gis:=nil;
ZeroMemory(@bmp, SizeOf(bmp));
ZeroMemory(@bmpb1, SizeOf(bmpb1));
ZeroMemory(@bmpgis, SizeOf(bmpgis));

end;
end;
end.
brazhnik вне форума Ответить с цитированием
Старый 13.10.2011, 18:00   #2
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Для освобождения памяти от битмапов
Код:
FreeAndNil(bmp);
FreeAndNil(bmpb1);
FreeAndNil(bmpgis);
Перед Dispose не нужно вызывать ZeroMemory... Вообще не нужно освобождать память после вызова ScanLine.
Последние 6 строк излишни.
PS
Думаю битмапы лучше создать перед циклом и освободить после его окончания

Последний раз редактировалось Silver_S; 13.10.2011 в 18:10.
Silver_S вне форума Ответить с цитированием
Старый 14.10.2011, 09:57   #3
brazhnik
Новичок
Джуниор
 
Регистрация: 09.09.2011
Сообщений: 2
По умолчанию Спасибо!!!

Большущее спасибо!!!!!

А ZeroMemory я вписал когда Dispose не сработал..
brazhnik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка "too many consecutive exceptions" при работе программы: как найти? DimychX Общие вопросы Delphi 11 22.06.2011 21:02
Непонятная ошибка при работе программы Вампирёнок Общие вопросы Delphi 7 24.01.2011 23:41
чем занимается программер на работе??? ashtone Свободное общение 7 14.01.2010 07:56
Как получить последнее значение при работе программы voron29 Общие вопросы Delphi 1 27.02.2009 12:22
Занятая память при работе приложения.Вопрос. Brizz Общие вопросы Delphi 3 03.01.2008 13:27