Определение контура изображения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DeBass
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 27.10.2007 (Сб) 21:35

Определение контура изображения

Сообщение DeBass » 22.01.2008 (Вт) 9:33

Уважаемые форумчане, помогите пожалуйста, проблема следующая: есть картинка которая является чертяжем детали, черным цветом обозначен контур этой детали, надо определить все точки этого контура(именно черного цвета). Авот как это сделать я не знаю! Зарание спасибо!

Anubis
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 02.11.2007 (Пт) 10:18

Сообщение Anubis » 22.01.2008 (Вт) 14:41

Делай проверку на цвета, если цвет чёрный, тогда... А что именно с этим контуром тебе надо сделать?
Мы родились на этот свет, и ни кто не в праве его выключать!

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 22.01.2008 (Вт) 16:44

Загрузи изображение в контрол Picture

Код: Выделить всё
Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

with Picture1
    .ScaleMode = vbPixels
    .AutoSize = True
    .AutoRedraw = True
end with

for x = 0 to width
  for y = 0 to Height
    if getpixel(Picture1.hdc,x,y)=vbblack then
       /////code
   else
     ////code
   end if
  next
next
В нашем деле главное ЛОГИКА.

косил косой косой косой.

DeBass
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 27.10.2007 (Сб) 21:35

Сообщение DeBass » 22.01.2008 (Вт) 17:13

Дело в том, что по этому контуру надо двигаться последовательно, поэтому вариант Gemini не подходит, надо двигаться все время по одной стороне(правило левого берега), это нужно для управления шаговых двигателей через LPT порт ПК. у меня идея такая:
1)находим первый пиксель черного цвета:
Код: Выделить всё

For lY = 0 To iHeight - 1
        For lX = 0 To iWidth - 1
        temp = GetPixel(Original.hdc, lX, lY)
        If temp = 0 Then Exit For
        Next
    pb.Value = lY
Next

2) определяем положение ближайшего черного пикселя, всего их может (направлений) 8
3)идем по определенному направлению пока цвет пикселя черный
4)порверяем не дошли ли мы до начальной точки

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.01.2008 (Вт) 17:50

DeBass, это надо в сторону распознования линий смотреть. Была когда то тема аналогичная, но вот где и к чему там пришли...
Весь мир матрица, а мы в нем потоки байтов!

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 22.01.2008 (Вт) 17:57

Если не ошибаюсь, DeBass и был автором того топика...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 22.01.2008 (Вт) 19:29

Lumen писал(а):Если не ошибаюсь, DeBass и был автором того топика...

Вряд ли... сие пораньше было.
З.Ы. Хотя вопрос может быть он и задавал уже.
Весь мир матрица, а мы в нем потоки байтов!

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 22.01.2008 (Вт) 19:44

Там было как раз про прямые, прямоугольники и окружности.
Поиском я не нашел, но одним из (со)авторов точно был Mikle. Перевыкладываю.

upd. Там еще треугольники распознаются :)
Оригинальная тема (без вложенного архива), кажется, вот: http://bbs.vbstreets.ru/viewtopic.php?t ... sc&start=0
Вложения
FormRecognizer.zip
Form Recognizer
(13.45 Кб) Скачиваний: 74
Моду создают модоки, а распространяют модозвоны.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.01.2008 (Вт) 22:10

Можно попробовать приладить Дейкстру.
Лучший способ понять что-то самому — объяснить это другому.

DeBass
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 27.10.2007 (Сб) 21:35

Сообщение DeBass » 23.01.2008 (Ср) 13:38

Пример конечно замечательный, но он мне тожне подходит, там как я понял контур заливкой определяется, а мне надо по нему последовательно идти, сейчас изучаю алг. Дейкстры.

З.Ы. Этот вопрос я задаю впервые, так что вы обознались :D

botaniQ
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.02.2008 (Сб) 17:42

Сообщение botaniQ » 09.02.2008 (Сб) 17:58

Даров народ!!! помогите пжл: как определить цвет пикселя на форме, если есть просто линия( нарисованная) и надо определить цвет и координату данного пикселя, заранее спасибо

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 10.02.2008 (Вс) 1:09

А пиксель где находится? на линии или где? может просто GetPixel заюзать?
Подпись проходит рефакторинг

botaniQ
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.02.2008 (Сб) 17:42

Сообщение botaniQ » 10.02.2008 (Вс) 15:33

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.02.2008 (Вс) 19:10

botaniQ
Color=Point(x,y)
Это определение цвета по координатам.
Но "определить цвет и координаты данного пикселя", это как? Как он дан, если не известны ни координаты, ни цвет?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.02.2008 (Пн) 5:04

DeBass, смотрел edgescan?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

botaniQ
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.02.2008 (Сб) 17:42

Сообщение botaniQ » 11.02.2008 (Пн) 12:36

а ну да точно, че то я прогнал.....спс, буду пробовать

DeBass
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 27.10.2007 (Сб) 21:35

Сообщение DeBass » 12.02.2008 (Вт) 21:14

Извините что так долго не появлялся! =) edgescan я не нашел, туплю может, или кривизна рук проявляется =) пока пользуюсь своим алгоритмом.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 13.02.2008 (Ср) 2:39

Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 13.02.2008 (Ср) 19:20

DeBass писал(а):Извините что так долго не появлялся! =) edgescan я не нашел, туплю может, или кривизна рук проявляется =) пока пользуюсь своим алгоритмом.

Твой алгоритм в корне не правильный если ты говоришь о шаговых двигателях. По твоему алгоритму можно только прямые линии строго вертикальные или горизонталььные чертить. Тут много нюансов связанных с именно шаговыми движками. При рисовании наклонных линий тебе придется заставить Движки за одинаковое время отрабатывать разное количество шагов например по X-10 , а по Y-5. Из примера предложенного выше у меня получилось выудить распознование отдельных линий и определение начальных и кон координат линии. Тут нужен особый интерфейс который бы обеспечивал буфферизацию смещения по 2м координатам с одновременной отработкой по сигналу готовности и расчётом частоты импульсов для каждого движка. Тут всё зависит от твоего аппаратного обеспечения.
Лишь разум потерянный бесповоротно мною. Наполнить может сердце мне тоской.
Нельзя обнять необъятное и впихнуть невпихуемое.

botaniQ
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.02.2008 (Сб) 17:42

Сообщение botaniQ » 17.02.2008 (Вс) 14:06

всем привет!!! нужна помощь: как остановить выполнение программы в этом коде If count_y >= 100 Then End, чтобы она не закрывалась как у меня а просто остановилась, заранее спасибо

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 17.02.2008 (Вс) 15:07

botaniQ
Немного не понятно...

Варианты:
1.Goto метка
2.Exit sub
3.Exit function
----------------
Побольше кода, если можно...
В нашем деле главное ЛОГИКА.

косил косой косой косой.

botaniQ
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.02.2008 (Сб) 17:42

Сообщение botaniQ » 17.02.2008 (Вс) 15:10

If r <> "255" Then
yy.SetValue(y, count_y)
If count_y >= 100 Then End
count_y = count_y + 1
ListBox1.Items.Add(x)
ListBox1.Items.Add(y)
g = PictureBox2.CreateGraphics()
g.FillEllipse(Brushes.Blue, x, y, 3, 3)

find_x(y)

End If


вот, с END'ом она просто закрывается, а надо чтобы остановилась в выполнении

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 17.02.2008 (Вс) 15:48

botaniQ

If r <> "255" Then 'Убери кавычки.
-------
В зависимости от того где разположен код и куда сделать выход.
Например:
1.
Код: Выделить всё
Private sub MyCode()
If count_y >= 100 Then Exit sub
end sub

2.
Код: Выделить всё
Private Function MyCode()
If count_y >= 100 Then Exit Function
end Function


3.
Код: Выделить всё
Private sub MyCode()
If r <>  255 Then
  yy.SetValue(y, count_y)
  If count_y >= 100 Then Goto Metka1
  count_y = count_y + 1
  ListBox1.Items.Add(x)
  ListBox1.Items.Add(y)
  g = PictureBox2.CreateGraphics()
  g.FillEllipse(Brushes.Blue, x, y, 3, 3)
  find_x(y)
End If

Exit sub
Metka1:
Msgbox "Выход"
end sub


4.
Код: Выделить всё
Private sub MyCode()
Do While True
If r <>  255 Then
  yy.SetValue(y, count_y)
  If count_y >= 100 Then Goto Metka1
  count_y = count_y + 1
  ListBox1.Items.Add(x)
  ListBox1.Items.Add(y)
  g = PictureBox2.CreateGraphics()
  g.FillEllipse(Brushes.Blue, x, y, 3, 3)
  find_x(y)
End If
loop
Metka1:
.....Продолжаем выполнение кода
end sub
В нашем деле главное ЛОГИКА.

косил косой косой косой.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 17.02.2008 (Вс) 15:58

botaniQ
Тебе совсем надо остановить выполнение кода?
Тогда Stop
#define ROFL 0xDDDD

botaniQ
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 09.02.2008 (Сб) 17:42

Сообщение botaniQ » 18.02.2008 (Пн) 14:16

Gemini
ага, понятно, спс


DirectXManiac
я пробовал, но stop он же полностью останавляет, он мне не подходит[/b]

Memfivosfey
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 17.02.2005 (Чт) 14:55

Сообщение Memfivosfey » 25.02.2008 (Пн) 1:18

Клавиша "F5", позволит тебе продолжить выполнение программы прямо с места останова оператором "STOP"

Клавиша F8, позволит тебе пошагово выполнять программу, для более детального рассмотрения сложных мест программы.

Эт так, на всяк случай, если ты не знал. :)
В программировании нет не решаемых проблемм, есть проблеммы на которые
мы не можем найти решение...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 94

    TopList  
cron