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

Вниз

C++ в Delphi.   Найти похожие ветки 

 
Неважно   (2011-03-10 12:37) [0]

Есть код на C++ который мне необходимо перевести в Delphi.
В общем, как-то перевел, но результаты получаются разные. Тяжеловат для меня C++. Подскажите, куда смотреть и где я ошибся?


void RobertsFilter(byte *Source, byte *New,int Width,int Height)
{
int i,j,a,b,r;
BYTE *p,*p1;
if (!New) New=new byte[Width*Height*3];

p=(BYTE*)Source;
p1=(BYTE*)New;

for (i=0;i<Height;i++)
{
 for (j=0;j<Width;j++)
 {
   p1[0]=((BYTE)((float)*p*0.11+(float)p[1]*0.59+
  (float)p[2]*0.3+0.5)>100)?255:0;

   p+=3;
  p1+=3;
 };
};

p=(BYTE*)New;
p1=(BYTE*)New+Width*3; // вот с этого места и беда
       // не пойму что тут происходит. Зачем увеличивать его?

for (i=1;i<Height;i++)
{
 for (j=1;j<Width;j++)
 {
  a=(p[0]-p1[3]);
  b=(p[3]-p1[0]);
  r=(byte)((sqrt(a*a+b*b)+0.5));
  if (r>255) r=255;
  p[0]=r;  p[1]=r;  p[2]=r;
  p+=3;
  p1+=3;
  };
 p+=3;
 p1+=3;
};

};



var
 Data,NewData:array of Byte;
 P,P1: PByteArray;
 ...
begin
 ...
 P := @Data[0];

 for i := 1 to Bitmap.Height  do
 begin
   for j := 1 to Bitmap.Width  do
   begin
     if  Byte(Trunc(p[0]*0.11 + p[1]*0.59+ p[2]*0.3 + 0.5))>100 then
      P[0]:=255 else
       P[0]:=0;
     Inc(PByte(P), 3);
   end;
 end; // до этого места всё в порядке

 //
 SetLength(NewData,Length(Data)+Bitmap.Width*3);
 // копируем данные из одного во второй
 Move(Data[0],NewData[0],Length(Data));
 P := @Data[0];
 P1 := @NewData[0];
 for i := 1 to Bitmap.Height  do
 begin
  for j := 1 to Bitmap.Width  do
  begin
    a:=(p[0]-p1[3]);
    b:=(p[3]-p1[0]);
    r:=Byte(Trunc(sqrt(a*a+b*b)+0.5));
    if (r>255) then r:=255;
    p[0]:=r;
    p[1]:=r;
    p[2]:=r;
    Inc(PByte(P), 3);
    Inc(PByte(P1), 3);
   end;
 end;


Заранее низкий поклон!


 
clickmaker ©   (2011-03-10 12:57) [1]

почему вдруг
for i := 1 to Bitmap.Height


 
brother ©   (2011-03-10 12:58) [2]

так и
Bitmap.Height - 1
Bitmap.Width  - 1


 
Неважно   (2011-03-10 12:59) [3]

Согласен. Моя ошибка. Исправил.
for i := 0 to Bitmap.Height-1

Но дело-то не в этом (((


 
clickmaker ©   (2011-03-10 13:26) [4]

в исходном варианте в 1-м цикле p1[0]=
а во 2-м P[0]:=

и где p1=(BYTE*)New+Width*3; ?
там должно быть что-то типа
P1 := @Data[0];


 
clickmaker ©   (2011-03-10 13:27) [5]

Inc(PByte(P1), Width*3);


 
Неважно   (2011-03-10 13:41) [6]

2 clickmaker ©


> в исходном варианте в 1-м цикле p1[0]=

p=(BYTE*)Source; //реальное изображение
p1=(BYTE*)New;  // получаемое, после фильтрации


> а во 2-м P[0]:=


А во втором оба массива ссылаются на полученный массив, после фильтрации.


 
Неважно   (2011-03-10 13:53) [7]

Пробовал и так. Результат не соотвествует (коду на С++)

   P := @Data[0];  //оба ссылаются на массив после фильтра
   P1 := @Data[0]; //оба ссылаются на массив после фильтра
   for i := 0 to Bitmap.Height-1  do
   begin
     for j := 0 to Bitmap.Width-1  do
     begin
      a:=(p[0]-p1[3]);
      b:=(p[3]-p1[0]);
      r:=Byte(Trunc(sqrt(a*a+b*b)+0.5));
      if (r>255) then r:=255;
      p[0]:=r;
      p[1]:=r;
      p[2]:=r;
      Inc(PByte(P), 3);
      Inc(PByte(P1), 3);
     end;
   end;


 
Sapersky   (2011-03-10 15:44) [8]

Проблема не столько в Си, сколько с пониманием теории.
http://homepages.inf.ed.ac.uk/rbf/HIPR2/roberts.htm
Каждый результирующий пиксель изображения формируется из матрицы 2*2 исходного. Т.о. нужно работать одновременно с 2 скан-линиями (гор. рядами) исходной картинки, P - текущая, P1 - следующая, для этого и делается p1=(BYTE*)New+Width*3.
Т.е. это аналогично
p := Img.Scanlines[0]; p1 := Img.Scanlines[1];


 
Неважно   (2011-03-10 16:08) [9]

2 Sapersky   (10.03.11 15:44) [8]

Спасибо. Помогло!


P := @Data[0];
P1 := @Data[Bitmap.Width*3];



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

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

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1298382163
fs
2011-02-22 16:42
2011.06.12
восстановить данные удаленного раздела флешки


15-1298033535
oxffff
2011-02-18 15:52
2011.06.12
Языки и циклические зависимости между блоками компиляции(units)


2-1299063928
rodionov_uv
2011-03-02 14:05
2011.06.12
проблемы с окном


6-1238396115
ganda
2009-03-30 10:55
2011.06.12
POP3 - не принимать прочитанные письма


1-1233992383
Oleg_teacher
2009-02-07 10:39
2011.06.12
Equation+RxRichEdit