|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 11 марта 2014, 14:04
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 13 марта 2014, 20:21; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 11 марта 2014, 16:07 [#1]:
Что значит "распознавать линии"? Сформулируй, плиз, по-русски. Допустим, на входе алгоритма есть bitmap, цвет его фона и/или цвет линий (отрезков), координаты начал и концов которых надо найти. Как это должно выглядеть на практике? И как алгоритм должен обработать, к примеру, вот такие картинки:
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
senyor (статус: Посетитель), 11 марта 2014, 16:57 [#2]:
Цвет фона белый, цвет линий красный,(больше цветов нету). координаты пикселей красного цвета которые выводится в Мемо, должны идти в порядке очереди, т.е. прог. сначала нашла первый красный пиксель, потом второй красный пиксель рядом стоящий на растоянии одного пикселя, третий и т.д. пока цвет пикселя не станет белым. (т.е. конец первой линии), потом надо чтобы мемо появилась пустая строка отделяющая, координаты первой линии от второй, и заново запустить цикл для второй линии. Немогу написать такой цикл?
|
|
min@y™ (статус: Доктор наук), 11 марта 2014, 18:46 [#3]:
Цитата (senyor):
Цвет фона белый, цвет линий красный,(больше цветов нету)
А толщина линий? А их пересечение? А кривизна?
Как алгоритм должен сработать вот в таких ситуациях, например?

Цитата (senyor):
координаты пикселей красного цвета которые выводится в Мемо
Да погоди ты про вывод! Главное - алгоритм вычисления начала и конца линии.
Цитата (senyor):
Немогу написать такой цикл?
Это вопрос?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 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 (статус: Посетитель), 11 марта 2014, 21:04 [#6]:
надо так, чтобы отрисовка была сначала одной линии, потом другой и координты в мемо выдавал сначала одной линии потом другой, если сможешь, просьба помоги с кодом для меня трудно
|
|
min@y™ (статус: Доктор наук), 11 марта 2014, 21:52 [#7]:
Цитата (senyor):
надо так, чтобы отрисовка была сначала одной линии, потом другой
Допустим. Тут надо применить что вроде волнового алгоритма: нашёл красную точку и двигаешься от неё по всем направлениям (а не просто простым квадратно-гнездовым перебором).
Цитата (senyor):
если сможешь, просьба помоги с кодом
Я тебя научить пытаюсь. Сначала надо представить себе (разработать) алгоритм, по которому затем писать код.
А "помоги с кодом" - это "напиши программу за меня", да? Это можно. Только у тебя в голове ничего не останется.
Вообще, откуда такая задача взялась-то? Как и кем её решение будет использоваться на практике?
Запрсы авторизации в ICQ не принимаю. Присылай сообщения.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
senyor (статус: Посетитель), 11 марта 2014, 21:59 [#8]:
давай в skype напишу тебе объясню все подробно, мой ник Erlan19772 или в аське тебе вроде запрос отправил я аську впревый раз пользуюсь
|
|
min@y™ (статус: Доктор наук), 11 марта 2014, 22:03 [#9]:
Цитата (senyor):
давай в skype напишу тебе объясню все подробно
Не, скайп я редко юзаю. И разговариваю только с сильно знакомыми людьми. В аську!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 13 марта 2014, 20:21 [#10]:

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