Форум: "Начинающим";
Текущий архив: 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