here is the class with the tracer how come it only works 4 simple shapes is beyond me
Imports System.Math
Public Class Aeye
Public outlinePixel As Integer = 30
Dim Imageslist As New List(Of ImageList)
Dim ImageListCounter As Integer = 0
Dim minX, minY, maxX, maxY As Integer
Dim checkedMatrix(1000, 1000) As Boolean
Dim imageMatrix(1000, 1000) As Boolean
Dim HX(1000) As Integer
Dim LX(1000) As Integer
Dim HY(1000) As Integer
Dim LY(1000) As Integer
Dim Icounter As Integer
Public Shared Function is_pixel_dark_at(ByVal xPos As Integer, ByVal Ypos As Integer, ByVal image As Bitmap, ByVal DarkPixel As Integer) As Boolean
Dim color As Color
Dim r, g, b As Integer
color = image.GetPixel(xPos, Ypos)
r = color.R
g = color.G
b = color.B
If (r < DarkPixel) And (g < DarkPixel) And (b < DarkPixel) Then
Return True
Else
Return False
End If
End Function
Public Shared Function isOutLine(ByVal xPos As Integer, ByVal Ypos As Integer, ByVal image As Bitmap, ByVal bias As Integer) As Boolean
Dim result As Boolean = False
Dim change As Byte = 0
If xPos > 0 And xPos < image.Width - 1 And Ypos > 0 And Ypos < image.Height - 1 Then
Dim color1, color2, color3, color4, color5, color6, color7, color8, color9 As Color
color1 = image.GetPixel(xPos - 1, Ypos - 1)
color2 = image.GetPixel(xPos, Ypos - 1)
color3 = image.GetPixel(xPos + 1, Ypos - 1)
color7 = image.GetPixel(xPos - 1, Ypos + 1)
color8 = image.GetPixel(xPos, Ypos + 1)
color9 = image.GetPixel(xPos + 1, Ypos + 1)
color4 = image.GetPixel(xPos - 1, Ypos)
color6 = image.GetPixel(xPos + 1, Ypos)
color5 = image.GetPixel(xPos, Ypos)
If (CType(color5.R, Integer) > CType(color4.R, Integer) - bias) And (CType(color5.R, Integer) < CType(color4.R, Integer) + bias) Then
change += 1
End If
If (CType(color5.G, Integer) > CType(color4.G, Integer) - bias) And (CType(color5.G, Integer) < CType(color4.G, Integer) + bias) Then
change += 1
End If
If (CType(color5.B, Integer) > CType(color4.B, Integer) - bias) And (CType(color5.B, Integer) < CType(color4.B, Integer) + bias) Then
change += 1
End If
If (CType(color5.R, Integer) > CType(color8.R, Integer) - bias) And (CType(color5.R, Integer) < CType(color8.R, Integer) + bias) Then
change += 1
End If
If (CType(color5.G, Integer) > CType(color8.G, Integer) - bias) And (CType(color5.G, Integer) < CType(color8.G, Integer) + bias) Then
change += 1
End If
If (CType(color5.B, Integer) > CType(color8.B, Integer) - bias) And (CType(color5.B, Integer) < CType(color8.B, Integer) + bias) Then
change += 1
End If
End If
'Dim sumR, sumG, sumB As Integer
'sumR = (CType(color1.R, Integer) + CType(color2.R, Integer) + CType(color3.R, Integer))
'sumR -= (CType(color7.R, Integer) + CType(color8.R, Integer) + CType(color9.R, Integer))
''sumG = (CType(color7.R, Integer) + CType(color8.R, Integer) + CType(color9.R, Integer))
''sumG -= (CType(color1.G, Integer) + CType(color2.G, Integer) + CType(color3.G, Integer))
''sumB = (CType(color1.B, Integer) + CType(color2.B, Integer) + CType(color3.B, Integer))
''sumB -= (CType(color7.B, Integer) + CType(color8.B, Integer) + CType(color9.B, Integer))
'sumR = Abs(sumR)
''sumG = Abs(sumG)
''sumB = Abs(sumB)
''Dim sumR2, sumG2, sumB2 As Integer
''sumR2 = (CType(color1.R, Integer) + CType(color4.R, Integer) + CType(color7.R, Integer))
''sumG2 = (CType(color1.G, Integer) + CType(color4.G, Integer) + CType(color7.G, Integer))
''sumB2 = (CType(color1.B, Integer) + CType(color4.B, Integer) + CType(color7.B, Integer))
''sumR2 -= (CType(color3.R, Integer) + CType(color6.R, Integer) + CType(color9.R, Integer))
''sumG2 -= (CType(color3.G, Integer) + CType(color6.G, Integer) + CType(color9.G, Integer))
''sumB2 -= (CType(color3.B, Integer) + CType(color6.B, Integer) + CType(color9.B, Integer))
''sumR2 = Abs(sumR2)
''sumG2 = Abs(sumG2)
''sumB2 = Abs(sumB2)
''sumR2 = color1.R + color4.R + color7.R
''sumG2 = color1.G + color4.G + color7.G
''sumB2 = color1.B + color4.B + color7.B
''sumR2 -= color3.R + color6.R + color9.R
''sumG2 -= color3.G + color6.G + color9.G
''sumB2 -= color3.B + color6.B + color9.B
If change = 6 Then
result = True
End If
Return result
End Function
Public Shared Function mark_dark_pixel(ByVal x As Integer, ByVal y As Integer, ByVal bmp1 As Bitmap, ByVal marker As Byte)
For i As Integer = 0 To marker
For j As Integer = 0 To marker
Try
bmp1.SetPixel(x + j, y + i, Color.Green)
Catch ex As Exception
End Try
Next
Next
Return bmp1
End Function
Public Function contourImage(ByVal bmp As Bitmap) As Bitmap
For index = 0 To bmp.Height - 1
For j = 0 To bmp.Width - 1
checkedMatrix(j, index) = False
imageMatrix(j, index) = is_pixel_dark_at(j, index, bmp, 30)
'If imageMatrix(j, index) Then
' MsgBox(j, index)
'End If
Next
Next
minX = bmp.Width
minY = bmp.Height
maxX = 0
maxY = 0
Dim jindex As Integer = 0
Icounter = 0
For i = 0 To bmp.Height - 1 Step 5
While jindex < bmp.Width - 1
If Not checkedMatrix(jindex, i) Then
If Not imageMatrix(jindex, i) Then
checkedMatrix(jindex, i) = True
Else
tracer(bmp, bmp.Width, bmp.Height, jindex, i)
HX(Icounter) = maxX
LX(Icounter) = minX
HY(Icounter) = maxY
LY(Icounter) = minY
Icounter += 1
minX = bmp.Width
minY = bmp.Height
maxX = 0
maxY = 0
jindex = jumpImage(jindex, i)
End If
End If
jindex += 5
End While
jindex = 0
Next
For index = 0 To Icounter
bmp = graphicContour(bmp, LX(index), HX(index), LY(index), HY(index))
Next
Return bmp
End Function
Public Function jumpImage(ByVal x, y) As Integer
If Icounter > 999 Then
Icounter = 999
End If
Dim n As Integer = 0
For index = 0 To Icounter
If (LX(index) <= x And HX(index) >= x) And (LY(index) <= y And HY(index) >= y) Then
n = HX(index)
End If
Next
Return n
End Function
Public Shared Function graphicContour(ByVal bmp As Bitmap, ByVal xmin As Integer, ByVal xmax As Integer, ByVal ymin As Integer, ByVal ymax As Integer) As Bitmap
For i = xmin To xmax
bmp = mark_dark_pixel(i, ymin, bmp, 1)
bmp = mark_dark_pixel(i, ymax, bmp, 1)
Next
For i = ymin To ymax
bmp = mark_dark_pixel(xmin, i, bmp, 1)
bmp = mark_dark_pixel(xmax, i, bmp, 1)
Next
Return bmp
End Function
Private Sub tracer(ByVal bmp1 As Bitmap, ByVal w1 As Integer, ByVal h1 As Integer, ByVal x As Integer, ByVal y As Integer)
If (x > 0 And x < w1) And (y > 0 And y < h1) Then
If Not checkedMatrix(x, y) Then
checkedMatrix(x, y) = True
If imageMatrix(x, y) Then 'not black pixel
maxer(x, maxX)
maxer(y, maxY)
miner(x, minX)
miner(y, minY)
tracer(bmp1, w1, h1, x - 5, y - 5)
tracer(bmp1, w1, h1, x, y - 5)
tracer(bmp1, w1, h1, x + 5, y - 5)
tracer(bmp1, w1, h1, x - 5, y)
tracer(bmp1, w1, h1, x + 5, y)
tracer(bmp1, w1, h1, x - 5, y + 5)
tracer(bmp1, w1, h1, x, y + 5)
tracer(bmp1, w1, h1, x + 5, y + 5)
End If
End If
End If
End Sub
Public Sub maxer(ByVal a As Integer, ByRef b As Integer)
If a > b Then
b = a
End If
End Sub
Public Sub miner(ByVal a As Integer, ByRef b As Integer)
If a < b Then
b = a
End If
End Sub
End Class
Public Class ImageList
Public minX As Integer
Public minY As Integer
Public maxX As Integer
Public maxY As Integer
End Class