Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.06.12;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
2-1299154215
antonn
2011-03-03 15:10
2011.06.12
Потокобезопасность DecodeDate()


15-1298323795
Юрий
2011-02-22 00:29
2011.06.12
С днем рождения ! 22 февраля 2011 вторник


2-1299086314
fynjy93
2011-03-02 20:18
2011.06.12
dbnavigator


2-1299749847
Неважно
2011-03-10 12:37
2011.06.12
C++ в Delphi.


15-1298486107
Unknown_user
2011-02-23 21:35
2011.06.12
Аффинное преобразование





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский