|
Вопрос # 4 696/ вопрос открыт / |
|
Здравствуйте!
Перебирается каждый пиксель на картинке (на картинке пять точек) как только находит первый нужный пиксель цикл останавливается, начинается второй цикл нахождения второй точки... но он никак не хочет запускаться, первую находит и всё... я в панике, помогите пожалуйста, умоляю...
Приложение: Переключить в обычный режим- procedure TMainForm.Timer1Timer(Sender: TObject);
- var
- n,s,st,i,s2,st2,i2, n2:Integer;
- b,z:Cardinal;
- begin
- SampleGrabber1.GetBitmap(Image.Picture.Bitmap);
- s:=119;
- st:=159;
- for i:=0 to s do
- for n:=0 to st do
- begin
- b:= GetYValue(image.Picture.Bitmap.Canvas.Pixels[n,i]);
- if b>110 then
- begin
- Label1.Caption:='x='+IntToStr(n);
- Label2.Caption:='y='+IntToStr(i);
- exit;
- end;
- end;
-
- s2:=119;
- st2:=n+20;
-
- for i2:=i+10 to s2 do
- for n2:=n-20 to st2 do
-
- begin
- z:= GetYValue(image.Picture.Bitmap.Canvas.Pixels[n2,i2]);
- if z>110 then
- begin
- Label3.Caption:='x='+IntToStr(n2);
- Label4.Caption:='y='+IntToStr(i2);
- exit;
- end;
- end;
- end;
Примечание #1 (2 ноября 2010, 17:44): Цикл останавливал другим способом без exit;
s:=i;
st:=n;
непомогло
 |
Вопрос задал: EvgenDRV (статус: Посетитель)
Вопрос отправлен: 2 ноября 2010, 17:35
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 21; последнее сообщение — 4 ноября 2010, 00:29; участников в обсуждении: 5.
Страницы: [1] [2] [Следующая »]
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:02 [#1]:
мне кажется ты что-то напутал в границах поиска.
s2:=119;
st2:=n+20;
for i2:=i+10 to s2 do
for n2:=n-20 to st2 do
в любом случае по такому абстрактному описанию входных данных непонятно что и где мы ищем, где первая точкка, а где вторая. Возможно, в установленных выше границах поиска вообще нет второй точки
|
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:05 [#2]:
"Цикл останавливал другим способом без exit;
s:=i;
st:=n;
непомогло"
мне кажется ты пытаешься что-то подогнать, взяв чужую прогу, вместо того чтобы разобраться.
|
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:12 [#3]:
если i докрутилось до 109-119, цикл по i2 уже не запустится
|
|
EvgenDRV (статус: Посетитель), 2 ноября 2010, 18:14 [#4]:
Да нет же... что тут подгонять... если бы была чужая прога я бы только был рад. Может есть где исходники... мне нужно определить координаты точек: самую верхнюю, левую ближе к центру и правую ближе к центру... центр по Х первой точки.
а вот это
s2:=119;
st2:=n+20;
for i2:=i+10 to s2 do
for n2:=n-20 to st2 do
ищется точка под первой верхней точкой... и она там есть.
если даже i= меньше 109, всё равно не хочет работать.
|
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:27 [#5]:
почему в цикле i2 берется начальное значение i+10 ?? выбрасывается 10 строк поиска ниже и-той.
полная высота картинки 119?
|
|
EvgenDRV (статус: Посетитель), 2 ноября 2010, 18:34 [#6]:
да всё правильно, вторую точку начинает искать ниже десяти строк первой... высота 119
|
|
Amidamaru (статус: 4-ый класс), 2 ноября 2010, 18:41 [#7]:
Чтобы не запутаться, лучше разделить поиск точек и вывод результата. Тогда нужен будет лишь один цикл:{...}
var
h,w,ix,iy,ip:Integer;
b:Cardinal;
pa: array[1..3]of TPoint;
begin
SampleGrabber1.GetBitmap(Image.Picture.Bitmap);
w:=Image.Picture.Width;
h:=Image.Picture.Height;
ip:=1;
for iy:=0 to h-1 do
for ix:=0 to w-1 do
begin
b:= GetYValue(image.Picture.Bitmap.Canvas.Pixels[ix,iy]);
if b>110 then
begin
pa[ip].X:=ix;
pa[ip].Y:=iy;
inc(ip);
end;
if ip>3 then exit;
end;
Label1.Caption:='x='+IntToStr(pa[1].x);
Label2.Caption:='y='+IntToStr(pa[1].y);
Label3.Caption:='x='+IntToStr(pa[2].x);
{...}
end;
|
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:47 [#8]:
это условие такое?
а почему по Х ограничиваемся интервалом +-20 от н? тоже условие?
ты отрезаешь свою область поиска. насколько я понимаю она должна быть по Х от 0 до 159, по У от н до 119, если не оговорено другое...
так в чем проблема? Не входит в цикл по и2 н2, как написано в вопросе или не находит точку, все-таки?
|
|
EvgenDRV (статус: Посетитель), 2 ноября 2010, 20:36 [#9]:
Именно не входит в цикл т.к. условие менял на любое... в любом случае что-то должно было показать... Значит не запускается цикл.
Да, после нахождения первой точки, идет поиск точки2 в узком диапозоне.
|
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 20:48 [#10]:
а дебагером ты смотрел входит она в цикл или нет и значения переменных на входе цикл?
|
|
EvgenDRV (статус: Посетитель), 2 ноября 2010, 22:47 [#11]:
То что предложил Amidamaru может и правильно если разобраться, но так ещё больше запутался... к тому же таким макаром совсем ничего не работает.
А дебагером пользоваться не умею... знаю, стыдно. Погуглил... понял, что дебагером ещё долго не научусь пользоваться.
Точно могу сказать, что косяк в exit;(останавливает все циклы включая и второй) а Break; ничего не останавливает.
|
|
AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 23:17 [#12]:
а, ну правильно, ты по exit из функции выходишь.
found: boolean;
found := false;
s:=119;
st:=159;
n := 0;
i:= 0;
while ((i<s) and (not found)) do
begin
while ((n<st) and (not found)) do
begin
b:= GetYValue(image.Picture.Bitmap.Canvas.Pixels[n,i]);
if b>110 then
begin
Label1.Caption:='x='+IntToStr(n);
Label2.Caption:='y='+IntToStr(i);
found := true;
end;
inc(n);
end;
inc(i);
end;
|
|
EvgenDRV (статус: Посетитель), 3 ноября 2010, 00:57 [#13]:
По идее твой код должен работать безупречно, но совсем что-то невероятное... в твоем цикле работает только второй цикл с "n"... "i" как стоит на 0 так и стоит... я уже совсем ничего не понимаю как так.
А так нормальные люди делают, если сделать несколько процедур:
первая ищет 1точку, вторая 2точку и т.д.
По окончании процедуры вызывается следующая и т.д
Или не заморачиваться и копать дальше в циклах while.
|
|
AlexMPEI (статус: 1-ый класс), 3 ноября 2010, 10:07 [#14]:
потому что перед вторым while я забыл добавить
n:=0;
|
|
Вадим К (статус: Академик), 3 ноября 2010, 15:40 [#17]:
достаточно грузить картинку в битмап, а не в image и скорость работы заметно увеличиться. А если ещё и ScanLine заюзать... то совсем баснословная скорость будет ))
Галочка "подтверждения прочтения" - вселенское зло.
|
|
EvgenDRV (статус: Посетитель), 3 ноября 2010, 15:44 [#18]:
так вот же
SampleGrabber1.GetBitmap(Image.Picture.Bitmap);
грузит в битмап... или я опять чего-то недогоняю.
Да, кстати, ScanLine клёвая штука, мне очень пригодится.
|
|
Вадим К (статус: Академик), 3 ноября 2010, 16:18 [#19]:
а кто его знает, что такое SampleGrabber1...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 3 ноября 2010, 21:31 [#20]:
канва у TImage и есть битмап
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
3 ноября 2010, 21:43: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Графика (2D и 3D) в приложениях модератором Ерёмин А.А.
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|