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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2010, 20:56   #11
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Вам не нужны какие-то особенные массивы (s, s2), так как TBitmap при загруженном изображении можно рассматривать как двухмерный массив элементов типа Integer, которые интерпретируются как TColor.
После загрузки картинок в один и второй объекты класса TBitmap уже можно спокойно применять к ним "разностную функцию".
в любом случае я освобожу эти массивы и загружу туда новые изображения, значит переменной, полученной после 1 изображения, мои значения нужно присвоить.

если без переменных, как мне обратиться к [i,j] элементам и что присвоить как если бы я брал

Код:
s1[i,j]:=(RowProcessed[i].rgbtBlue shl 16)+
    (RowProcessed[i].rgbtGreen shl 8) +
    RowProcessed[i].rgbtRed;
? спасибо
fen1ksss вне форума Ответить с цитированием
Старый 17.09.2010, 21:38   #12
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Признаться, не понял последние ваши слова.
А почему без переменных? Есть переменные, ссылающиеся на объекты типа TBitmap. OriginalBitmap, например.
Вряд ли понадобиться отдельно взятый элемент из массива цветов (s[i, j].
С пикселями из правой части первого кадра и пикселями из левой части второго кадра все равно надо будет работать в цикле.
Как представляется. Загружаем левую картинку в один Bitmap, правую в другой.
В цикле из левого кадра берутся пиксели из правой части, а из правого кадра берутся пиксели из левой части.
Код:
  for i := 0 to 100 do begin //100 как пример ширины захвата для проверки совпадений на двух кадрах
    for j := 0 to BM1.Height-1 do 
      BM1.Canvas.Pixels[BM1.Width-101+i, j]; //примеры обращения к пикселям, не более того
      BM2.Canvas.Pixels[i, j];
    end;
  end;
Этот код всего лишь эскиз, где показаны только обращения к элементам двухмерного массива цветов.
Работать надо, конечно со ScanLine, а не напрямую с Pixels.

Последний раз редактировалось Прик; 17.09.2010 в 22:08. Причина: поправка
Прик вне форума Ответить с цитированием
Старый 17.09.2010, 22:11   #13
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

смотрите, есть моя функция

Код:
for a:=0 to xkadr-xet+1 do
    for b:=0 to ykadr-yet+1 do
    begin
      F:=0;
      for j:=1 to yet do
      for i:=1 to xet do
      F:=F+abs(s1[i,j]-s2[i+a,j+b]);
      if F<Fmin then
      begin
        Fmin:=F;
        amin:=a;
        bmin:=b;
где xkadr,ykadr - height,width большого кадра
xet,yet - height,width 2 маленького кадра

т.е. не
Цитата:
В цикле из левого кадра берутся пиксели из правой части, а из правого кадра берутся пиксели из левой части.
а беру часть из центра 2 кадра и полностью прогоняю по 1

как мне из моей программы вытащить эти s1 и s2 или их аналоги?
OriginalBitmap - это же не двойной массив от i j
или я не прав?

Последний раз редактировалось fen1ksss; 17.09.2010 в 22:18.
fen1ksss вне форума Ответить с цитированием
Старый 17.09.2010, 22:20   #14
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Я вот и пытаюсь сколько времени донести, что OriginalBitmap - это и есть двойной (двухмерный) массив пикселей (тип которых TColor - как раз то что вам надо).
А как достукаться до конкретного элемента этого двухмерного массива я уже показал: Bitmap.Canvas.Pixels[i, j];
Прик вне форума Ответить с цитированием
Старый 18.09.2010, 00:49   #15
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Если задавать массив так, то при подстановке в функцию выдает нулевые результаты

Код:
OriginalBitmap.Canvas.Pixels[i,j]:=(RowProcessed[i].rgbtBlue shl 16)+(RowProcessed[i].rgbtGreen shl 8)+RowProcessed[i].rgbtRed;
или я что то не так понял?
fen1ksss вне форума Ответить с цитированием
Старый 18.09.2010, 05:42   #16
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Я вот тоже не понял: что значит "нулевой результат".
И что за функция? Нельзя ли на нее посмотреть.
В этом выражении происходит присвоение цвета элементу битмапа, а цель этого присвоения из единственного приведенного оператора непонятна.
Если речь о функции в посте #13 , то обращение к пикселям двух битмапов будет таким:
Код:
 F := F + abs(s1.Canvas.Pixels[i,j]-s2.Canvas.Pixels[i+a,j+b]);
Если s1 и s2 это TBitmap.
Но вопрос "в чем цель присвоения", остается.

Последний раз редактировалось Прик; 18.09.2010 в 05:59.
Прик вне форума Ответить с цитированием
Старый 18.09.2010, 11:05   #17
fen1ksss
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Я вот тоже не понял: что значит "нулевой результат".
Прикрепил исходник
При запуске программы проект работает постоянно и не выводит в итоге результат
А нулевые значения, если окно мемо, куда выводится F поставить в цикл функции, то там появляются значения, но всегда нулевые, т.е. F=0000000, amin=00000 и тд

Цитата:
Сообщение от Прик Посмотреть сообщение
Если речь о функции в посте #13 , то обращение к пикселям двух битмапов будет таким:
Код:
 F := F + abs(s1.Canvas.Pixels[i,j]-s2.Canvas.Pixels[i+a,j+b]);
Если s1 и s2 это TBitmap.
Так и есть только вместо s1 и s2 у меня

Код:
F:=F+abs(Ob.Canvas.Pixels[i,j]-OriginalBitmap.Canvas.Pixels[i+a,j+b]);
Вложения
Тип файла: rar CreateBMP+Etalon.rar (445.5 Кб, 15 просмотров)
fen1ksss вне форума Ответить с цитированием
Старый 20.09.2010, 09:00   #18
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

То что код не оптимальный это еще не самая большая беда. Беда в том, что код этот не имеет никакого смысла. То есть не может принести хоть в каком-то виде желаемый результат, пусть даже промежуточный.
В чем цель выражения?
Код:
F := F + abs(s1.Canvas.Pixels[i,j]-s2.Canvas.Pixels[i+a,j+b]);
Суммирование значений цветов и только. Как это число можно использовать в дальнейшем? Видится, что никак. После многочисленного суммирования значений цветов получим какое-то абстрактное большое число. И куда его пристроить?

Причем переменная F во внешнем цикле на очередном шаге обнуляется, а пржнее значение пропадает. К чему такое?
Цитата:
При запуске программы проект работает постоянно и не выводит в итоге результат
На самом деле, что-то выводится, если набраться терпения. Количество итераций (шагов) в четырех циклах (использующих размеры приложенных картинок) равно 174 240 000. Нужно подождать около 5 минут чтобы результат появился.

Зачем изменение размеров формы (разовая операция) размещать в двойном цикле, т.е. выполнять операторы
Код:
      Form1.Height:=OriginalBitmap.Height+100;
      Form1.width:=OriginalBitmap.Width;
120 000 раз? Но это уже из области оптимизации и грамотности программера и в нашем случае будем считать, что такой стиль программирования не влияет на конечный результат.

Попробуйте объяснить себе что делается в процедурах CreateEtalon и CreateBMP. При ближайшем рассмотрении - это всего лишь вывод картинки на поверхность формы. Для этого существуют простые и достаточно быстро работающие функции TCanvas. Draw, ClipRect и пр.

Особенно внимательно присмотритесь к этому коду
Код:
  Fmin:=1000000000;
  for a:=0 to OriginalBitmap.width-Ob.Height+1 do
  for b:=0 to OriginalBitmap.Height-Ob.width+1 do begin
    F:=0;
    for j:=1 to Ob.width do
      for i:=1 to Ob.Height do
        F:=F+abs(Ob.Canvas.Pixels[i,j]-OriginalBitmap.Canvas.Pixels[i+a,j+b]);
    if F<Fmin then begin
      Fmin:=F;
      amin:=a;
      bmin:=b;
    end;
  end;
Ничего практического он не несет. Только отнимает кучу времени на "прокручивания" сотни миллионов итераций и только для того чтобы на выходе получить одно единственное "абстрактное" число, никакого отношения к цвету не имеющее (регулярно обнуляемое внутри цикла).

Последний раз редактировалось Прик; 20.09.2010 в 09:07.
Прик вне форума Ответить с цитированием
Старый 20.09.2010, 11:40   #19
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

fen1ksss, в этой теме я прикрепил пример поиска фрагмента на изображении, посмотри.
x128 вне форума Ответить с цитированием
Старый 20.09.2010, 13:54   #20
Vikenty
Заслуженный флудер
Участник клуба
 
Аватар для Vikenty
 
Регистрация: 31.03.2010
Сообщений: 1,473
По умолчанию

есть API-функция GetBitmapBits
Vikenty вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
timage в bmp varelik Мультимедиа в Delphi 8 21.12.2009 09:55
Программа BMP PradoSV Общие вопросы C/C++ 0 23.11.2009 23:25
bmp картинки B@R@B@$HK@ Общие вопросы C/C++ 0 09.06.2009 23:08
Как загрузить BMP в массив и обратно в С++ Ilja Общие вопросы C/C++ 8 07.03.2009 23:48
Декодирование BMP Rezet Мультимедиа в Delphi 6 24.01.2009 22:33