Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 696

/ вопрос открыт /

Здравствуйте!
Перебирается каждый пиксель на картинке (на картинке пять точек) как только находит первый нужный пиксель цикл останавливается, начинается второй цикл нахождения второй точки... но он никак не хочет запускаться, первую находит и всё... я в панике, помогите пожалуйста, умоляю...

Приложение:
  1. procedure TMainForm.Timer1Timer(Sender: TObject);
  2. var
  3. n,s,st,i,s2,st2,i2, n2:Integer;
  4. b,z:Cardinal;
  5. begin
  6. SampleGrabber1.GetBitmap(Image.Picture.Bitmap);
  7. s:=119;
  8. st:=159;
  9. for i:=0 to s do
  10. for n:=0 to st do
  11. begin
  12. b:= GetYValue(image.Picture.Bitmap.Canvas.Pixels[n,i]);
  13. if b>110 then
  14. begin
  15. Label1.Caption:='x='+IntToStr(n);
  16. Label2.Caption:='y='+IntToStr(i);
  17. exit;
  18. end;
  19. end;
  20.  
  21. s2:=119;
  22. st2:=n+20;
  23.  
  24. for i2:=i+10 to s2 do
  25. for n2:=n-20 to st2 do
  26.  
  27. begin
  28. z:= GetYValue(image.Picture.Bitmap.Canvas.Pixels[n2,i2]);
  29. if z>110 then
  30. begin
  31. Label3.Caption:='x='+IntToStr(n2);
  32. Label4.Caption:='y='+IntToStr(i2);
  33. exit;
  34. end;
  35. end;
  36. end;


Примечание #1 (2 ноября 2010, 17:44):
Цикл останавливал другим способом без exit;
s:=i;
st:=n;
непомогло

EvgenDRV Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: EvgenDRV (статус: Посетитель)
Вопрос отправлен: 2 ноября 2010, 17:35
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 21; последнее сообщение — 4 ноября 2010, 00:29; участников в обсуждении: 5.

Страницы: [1] [2] [Следующая »]

AlexMPEI

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

AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:05 [#2]:

"Цикл останавливал другим способом без exit;
s:=i;
st:=n;
непомогло"
мне кажется ты пытаешься что-то подогнать, взяв чужую прогу, вместо того чтобы разобраться.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:12 [#3]:

если i докрутилось до 109-119, цикл по i2 уже не запустится
EvgenDRV

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

AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:27 [#5]:

почему в цикле i2 берется начальное значение i+10 ?? выбрасывается 10 строк поиска ниже и-той.
полная высота картинки 119?
EvgenDRV

EvgenDRV (статус: Посетитель), 2 ноября 2010, 18:34 [#6]:

да всё правильно, вторую точку начинает искать ниже десяти строк первой... высота 119
Amidamaru

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;
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 18:47 [#8]:

это условие такое?
а почему по Х ограничиваемся интервалом +-20 от н? тоже условие?
ты отрезаешь свою область поиска. насколько я понимаю она должна быть по Х от 0 до 159, по У от н до 119, если не оговорено другое...
так в чем проблема? Не входит в цикл по и2 н2, как написано в вопросе или не находит точку, все-таки?
EvgenDRV

EvgenDRV (статус: Посетитель), 2 ноября 2010, 20:36 [#9]:

Именно не входит в цикл т.к. условие менял на любое... в любом случае что-то должно было показать... Значит не запускается цикл.
Да, после нахождения первой точки, идет поиск точки2 в узком диапозоне.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 2 ноября 2010, 20:48 [#10]:

а дебагером ты смотрел входит она в цикл или нет и значения переменных на входе цикл?
EvgenDRV

EvgenDRV (статус: Посетитель), 2 ноября 2010, 22:47 [#11]:

То что предложил Amidamaru может и правильно если разобраться, но так ещё больше запутался... к тому же таким макаром совсем ничего не работает.

А дебагером пользоваться не умею... знаю, стыдно. Погуглил... понял, что дебагером ещё долго не научусь пользоваться.

Точно могу сказать, что косяк в exit;(останавливает все циклы включая и второй) а Break; ничего не останавливает.
AlexMPEI

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

EvgenDRV (статус: Посетитель), 3 ноября 2010, 00:57 [#13]:

По идее твой код должен работать безупречно, но совсем что-то невероятное... в твоем цикле работает только второй цикл с "n"... "i" как стоит на 0 так и стоит... я уже совсем ничего не понимаю как так.

А так нормальные люди делают, если сделать несколько процедур:
первая ищет 1точку, вторая 2точку и т.д.
По окончании процедуры вызывается следующая и т.д
Или не заморачиваться и копать дальше в циклах while.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 3 ноября 2010, 10:07 [#14]:

потому что перед вторым while я забыл добавить
n:=0;
EvgenDRV

EvgenDRV (статус: Посетитель), 3 ноября 2010, 13:26 [#15]:

Всё афигенно... всё работает!!! Расцеловал бы тебя:) Смущает только, что притормаживает при нахождении двух точек, а ещё надо третью искать... попробую, надеюсь не сильные тормоза будут. Просто таких картинок надо обработать 25 штук в секунду и скорость обработки очень важна. В любом случае спасибо большое, а то я уже собрался в монастырь уходить:) программер из меня вообще...
AlexMPEI

AlexMPEI (статус: 1-ый класс), 3 ноября 2010, 14:46 [#16]:

для ускорения и не зависание единственное что могу посоветовать - многопоточность.
http://forum.vingrad.ru/topic-60076.html
Вадим К

Вадим К (статус: Академик), 3 ноября 2010, 15:40 [#17]:

достаточно грузить картинку в битмап, а не в image и скорость работы заметно увеличиться. А если ещё и ScanLine заюзать... то совсем баснословная скорость будет:)))
Галочка "подтверждения прочтения" - вселенское зло.
EvgenDRV

EvgenDRV (статус: Посетитель), 3 ноября 2010, 15:44 [#18]:

так вот же
SampleGrabber1.GetBitmap(Image.Picture.Bitmap);
грузит в битмап... или я опять чего-то недогоняю.

Да, кстати, ScanLine клёвая штука, мне очень пригодится.
Вадим К

Вадим К (статус: Академик), 3 ноября 2010, 16:18 [#19]:

а кто его знает, что такое SampleGrabber1...
Галочка "подтверждения прочтения" - вселенское зло.
bugmenot

bugmenot (статус: 3-ий класс), 3 ноября 2010, 21:31 [#20]:

канва у TImage и есть битмап
виконання програми розпочинається з того самого мiсця, де призупинилося.

3 ноября 2010, 21:43: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Графика (2D и 3D) в приложениях модератором Ерёмин А.А.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.