Преобразование Хафа

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

Преобразование Хафа

Сообщение Sergey89 » 05.11.2014 (Ср) 19:49

Должно нарисовать красные линии в месте нахождения прямых, а не работает. Подскажите, пожалуйста, в чем проблема?
Вот код.
Код: Выделить всё
' y=(x*cos(theta)+rho)/sin(theta)
Const pi = 3.14


Private Sub Picture1_Click()
Dim x, y, i, j As Integer
Dim Teta, R As Integer
Dim w, h
Dim maxR As Integer
Dim ReS() As Integer, MaxV As Integer

w = Picture1.ScaleWidth
h = Picture1.ScaleHeight
maxR = Round(Sqr(w * w + h * h))

ReDim ReS(180, maxR) As Integer

Teta = 0

For y = 0 To h
    For x = 0 To w
If Picture1.Point(x, y) <> vbWhite Then
'\\\\\

For i = 0 To 179
    For j = 0 To maxR - 1
Teta = i * pi / 180
If Abs((y * Sin(Teta) + x * Cos(Teta)) - j) < 0.1 Then ReS(i, j) = ReS(i, j) + 1
    Next j
Next i

 
'\\\\\
End If
    Next x
Next y

MaxV = 0
Teta = 0
R = 0

For i = 0 To 179
  For j = 0 To maxR - 1
If ReS(i, j) > MaxV Then MaxV = ReS(i, j)
Teta = i
R = j
    Next j
Next i

Teta = Teta * pi / 180
For y = 0 To h
    For x = 0 To w
If Round(y * Sin(Teta) + x * Cos(Teta)) = R Then Picture1.PSet (x, y), vbRed
    Next x
Next y
Picture1.Refresh
'Erase Res
End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Преобразование Хафа

Сообщение Хакер » 05.11.2014 (Ср) 20:00

Сначала приведи код в порядок.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sergey89
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.09.2014 (Вт) 10:48

Re: Преобразование Хафа

Сообщение Sergey89 » 05.11.2014 (Ср) 20:10

А что именно?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Преобразование Хафа

Сообщение iGrok » 05.11.2014 (Ср) 20:21

Sergey89 писал(а):А что именно?

Форматирование, отступы, комментарии (хотя бы минимальные). Не исключено, что после этого сам поймёшь, почему не работает.
А если не поймёшь - остальным будет легче разбираться.
А так сначала тратить полчаса, чтобы разобраться в этих макаронах - это нужно иметь много бесполезного свободного времени. У тех, кто мог бы тебе помочь, обычно его нет, или оно очень дорого стоит, чтобы так бессмысленно его расходовать.
label:
cli
jmp label

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Преобразование Хафа

Сообщение ger_kar » 05.11.2014 (Ср) 20:28

Очевидно код должен быть отформатирован так, чтобы его можно было хоть как то понимать.
Примерно так:
Код: Выделить всё
' y=(x*cos(theta)+rho)/sin(theta)
Const pi = 3.14


Private Sub Picture1_Click()
    Dim x As Integer, y As Integer, i As Integer, j As Integer
    Dim Teta As Integer, R As Integer
    Dim w, h
    Dim maxR As Integer
    Dim ReS() As Integer, MaxV As Integer

    w = Picture1.ScaleWidth
    h = Picture1.ScaleHeight
    maxR = Round(Sqr(w * w + h * h))

    ReDim ReS(180, maxR) As Integer

    Teta = 0

    For y = 0 To h
        For x = 0 To w
            If Picture1.Point(x, y) <> vbWhite Then
                 '\\\\\
                 For i = 0 To 179
                     For j = 0 To maxR - 1
                         Teta = i * pi / 180
                         If Abs((y * Sin(Teta) + x * Cos(Teta)) - j) < 0.1 Then ReS(i, j) = ReS(i, j) + 1
                     Next j
                 Next i
                 '\\\\\
            End If
        Next x
    Next y

    MaxV = 0
    Teta = 0
    R = 0

    For i = 0 To 179
        For j = 0 To maxR - 1
            If ReS(i, j) > MaxV Then MaxV = ReS(i, j)
            Teta = i
            R = j
        Next j
    Next i

Ну и так далее..


Пока форматировал образец, Игрок уже свой ответ вставил :)
Бороться и искать, найти и перепрятать

Sergey89
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.09.2014 (Вт) 10:48

Re: Преобразование Хафа

Сообщение Sergey89 » 06.11.2014 (Чт) 18:05

Теперь работает.
Код: Выделить всё
Const pi = 3.14


Private Sub Picture1_Click()
         Dim x, y, i, j As Integer
         Dim Teta, R As Integer
         Dim w, h
         Dim maxR As Integer
         Dim ReS() As Integer, MaxV As Integer
         Dim T1, T2

w = Picture1.ScaleWidth
h = Picture1.ScaleHeight
maxR = Round(Sqr(w * w + h * h))

ReDim ReS(180, maxR) As Integer

Teta = 0

T1 = Time
For y = 0 To h - 1
    For x = 0 To w - 1
If Picture1.Point(x, y) = 0 Then
'\\\\\

        For i = 0 To 179
                 For j = 0 To maxR - 1
Teta = i * pi / 180
If Abs((y * Sin(Teta) + x * Cos(Teta)) - j) < 0.1 Then ReS(i, j) = ReS(i, j) + 1
                Next j
        Next i

 
'\\\\\
End If
    Next x
Next y

MaxV = 0
Teta = 0
R = 0

    For i = 0 To 179
         For j = 0 To maxR - 1
    If ReS(i, j) > MaxV Then
MaxV = ReS(i, j)
Teta = i
R = j
    End If
         Next j
    Next i


Teta = Teta * pi / 180
For y = 0 To h - 1
    For x = 0 To w - 1
                If Round(y * Sin(Teta) + x * Cos(Teta)) = R Then Picture1.PSet (x, y), vbRed
    Next x
Next y
         Picture1.Refresh
T2 = Time
         Caption = "Потрачено времени: " & DateDiff("s", T1, T2) & " секунд"
Erase ReS
End Sub

Sergey89
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.09.2014 (Вт) 10:48

Re: Преобразование Хафа

Сообщение Sergey89 » 06.11.2014 (Чт) 18:07

Но определяет только одну линию за один вызов функции.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Преобразование Хафа

Сообщение ger_kar » 06.11.2014 (Чт) 18:17

Sergey89 писал(а):Теперь работает.
А нормального форматирования как не было, так и нет. Видимо не судьба...
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Преобразование Хафа

Сообщение Хакер » 06.11.2014 (Чт) 18:18

Sergey89 писал(а): Dim x, y, i, j As Integer
Dim Teta, R As Integer

Вот тебе невдомёк, что это из всех переменных, только j и R будут иметь тип Integer?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sergey89
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 30.09.2014 (Вт) 10:48

Re: Преобразование Хафа

Сообщение Sergey89 » 07.11.2014 (Пт) 18:10

Спасибо! Выставил типы и скорость выполнения увеличилась вдвое.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Преобразование Хафа

Сообщение ger_kar » 07.11.2014 (Пт) 18:15

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


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

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

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

    TopList