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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 6 522

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

Здравствуйте! Уважемые эксперты!
Есть три линии в фале 1.bmp. Как можно праивльно написать условие, чтобы програ распазнала эти три отдельные линии и вевыла их координаты в Мемо.
Line 1
1, 610
1, 609 и т.д, потом
Line 2
координаты
Line 3
координаты.
У меня закрашивает все подраяд как одну линию и координаты все подряд без разделений линий.
procedure TForm1.Button1Click(Sender: TObject);
var i,j,n,x,y:integer;
a:array of TPoint; //N точек
begin
with Image1.Canvas do
begin
n:=0;
for i:=1 to Height do
for j:=1 to Width do
if Pixels[i,j]=clRed then
begin
Memo1.Lines.Add(IntToStr(i)+ ', '+IntToStr(Height-j));
n:=n+1;
setlength(a,n);
a[n-1].x:=i;
a[n-1].y:=j;
end;


MoveTo(a[0].x,a[0].y);
for i:=1 to n-1 do
LineTo(a[i].x,a[i].y);
end;
end;

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

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

Вопрос задал: senyor (статус: Посетитель)
Вопрос отправлен: 11 марта 2014, 14:04
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 10; последнее сообщение — 13 марта 2014, 20:21; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 11 марта 2014, 16:07 [#1]:

Что значит "распознавать линии"? Сформулируй, плиз, по-русски. Допустим, на входе алгоритма есть bitmap, цвет его фона и/или цвет линий (отрезков), координаты начал и концов которых надо найти. Как это должно выглядеть на практике? И как алгоритм должен обработать, к примеру, вот такие картинки:
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
senyor

senyor (статус: Посетитель), 11 марта 2014, 16:57 [#2]:

Цвет фона белый, цвет линий красный,(больше цветов нету). координаты пикселей красного цвета которые выводится в Мемо, должны идти в порядке очереди, т.е. прог. сначала нашла первый красный пиксель, потом второй красный пиксель рядом стоящий на растоянии одного пикселя, третий и т.д. пока цвет пикселя не станет белым. (т.е. конец первой линии), потом надо чтобы мемо появилась пустая строка отделяющая, координаты первой линии от второй, и заново запустить цикл для второй линии. Немогу написать такой цикл?
min@y™

min@y™ (статус: Доктор наук), 11 марта 2014, 18:46 [#3]:

Цитата (senyor):

Цвет фона белый, цвет линий красный,(больше цветов нету)

А толщина линий? А их пересечение? А кривизна?
Как алгоритм должен сработать вот в таких ситуациях, например?



Цитата (senyor):

координаты пикселей красного цвета которые выводится в Мемо

Да погоди ты про вывод! Главное - алгоритм вычисления начала и конца линии.

Цитата (senyor):

Немогу написать такой цикл?

Это вопрос?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
senyor

senyor (статус: Посетитель), 11 марта 2014, 19:51 [#4]:

Там прикреплен файл 1.bmp
Толщина линий примерно 2 пикселя. Пересечений между линиями не бывает. Попробуйте вставьте мой код вставить в Дельфи и открыт рисунок 1.bmp, через application.ProcessMessages там увидите как считывается каждый пиксель длинной линии и потом он резко переходит на паралельнную линию которая идет выше и получается все это одна сплошная линия, а насчет алгоритма я вот пытался так условие прописать: но ничего не получается больше подходит к концу линии, а не к середине
if (Pixels[i-1,j-1]) and (Pixels[i-1,j]) and (Pixels[i+1,j-1]) and
(Pixels[i,j+1]) and
(Pixels[i-1,j+1]) and (Pixels[i,j+1]) and (Pixels[i+1,j+1]) = clWhite then
min@y™

min@y™ (статус: Доктор наук), 11 марта 2014, 20:31 [#5]:

Цитата (senyor):

Там прикреплен файл 1.bmp

Вижу. В нём 3 кривых отрезка.

Цитата (senyor):

Толщина линий примерно 2 пикселя.

ЩИТО? Моя твоя не понимай, однако!

Цитата (senyor):

Пересечений между линиями не бывает.

А как программа должна отреагировать, если ей ей подсунуть картинку с ошибкой?

Цитата (senyor):

Попробуйте вставьте мой код вставить в Дельфи

И не подумаю. Оно мне надо? И невооружённым глазом косяки видны сразу:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, n, x, y: integer;
  a: array of TPoint; // N точек
begin
  with Image1.Canvas do
    begin
      n:= 0;
 
      for i:= 1 to Height do    // Width и Height - свойства какого объекта-то?
        for j:= 1 to Width do   // i и j не с нуля до Z - 1, айяйяй, как нехорошо!
          if Pixels[i, j] = clRed // Не забывай, что i - это № столбца, а y - строки (перепутал местами).
            then begin
                   Memo1.Lines.Add(IntToStr(i) + ', ' + IntToStr(Height - j));
                   n:= n + 1;
                   SetLength(a, n); // Height · Width перераспределений памяти! НАХРЕНА?
                   a[n - 1].x:= i;
                   a[n - 1].y:= j;
                 end;
 
      // Отрисовка отрезков между найденными точками на том же Canvas тем же цветов. НАХРЕНА?
      // Посмотрел бы для начала количество найденных точек.
      MoveTo(a[0].x, a[0].y);
      for i:= 1 to n - 1 do
        LineTo(a[i].x, a[i].y);
    end; // with
end;

Цитата (senyor):

а насчет алгоритма я вот пытался так условие прописать: но ничего не получается больше подходит к концу линии, а не к середине if (Pixels[i-1,j-1]) and (Pixels[i-1,j]) and (Pixels[i+1,j-1]) and (Pixels[i,j+1]) and (Pixels[i-1,j+1]) and (Pixels[i,j+1]) and (Pixels[i+1,j+1]) = clWhite then

Я просил набросать примерный алгоритм, а не код. Напиши просто по-русски, чего ты хочешь от программы. Только потом можно будет писать код и отлаживать его.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
senyor

senyor (статус: Посетитель), 11 марта 2014, 21:04 [#6]:

надо так, чтобы отрисовка была сначала одной линии, потом другой и координты в мемо выдавал сначала одной линии потом другой, если сможешь, просьба помоги с кодом для меня трудно
min@y™

min@y™ (статус: Доктор наук), 11 марта 2014, 21:52 [#7]:

Цитата (senyor):

надо так, чтобы отрисовка была сначала одной линии, потом другой

Допустим. Тут надо применить что вроде волнового алгоритма: нашёл красную точку и двигаешься от неё по всем направлениям (а не просто простым квадратно-гнездовым перебором).

Цитата (senyor):

если сможешь, просьба помоги с кодом

Я тебя научить пытаюсь. Сначала надо представить себе (разработать) алгоритм, по которому затем писать код.
А "помоги с кодом" - это "напиши программу за меня", да? Это можно. Только у тебя в голове ничего не останется.

Вообще, откуда такая задача взялась-то? Как и кем её решение будет использоваться на практике?

Запрсы авторизации в ICQ не принимаю. Присылай сообщения.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
senyor

senyor (статус: Посетитель), 11 марта 2014, 21:59 [#8]:

давай в skype напишу тебе объясню все подробно, мой ник Erlan19772 или в аське тебе вроде запрос отправил я аську впревый раз пользуюсь
min@y™

min@y™ (статус: Доктор наук), 11 марта 2014, 22:03 [#9]:

Цитата (senyor):

давай в skype напишу тебе объясню все подробно

Не, скайп я редко юзаю. И разговариваю только с сильно знакомыми людьми. В аську!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 13 марта 2014, 20:21 [#10]:

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

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

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