Image Processing using AForge with COM Object
How to do Image Processing using AForge with COM+ Object
- Requirements: Visual Studio 2005, 2008, 2010
- Programming Level: Advance
- Language: Visual Basic.Net
- AForge.dll(v 2.2.0.0)
- AForge.Imaging.dll(2.2.2.0)
- AForge.Math.dll(2.2.2.0)
Project references
- AForge
- AForge.Imaging
- AForge.Imaging.Filters
- AForge.Math.Geometry
- System.Collections.Generic
- System.Drawing
- System.Drawing.Imaging
- System.Reflection
Scenario
Microsoft Visual Basic 6 as we all know is the ancestor of Visual Basic.Net the current versions of Visual Studio is 2012 upon this writing, and still due to the requirements that has passed to me that need to use Visual Basic 6.0 as the main system development as far as Image Processing is concerned. For those who have not known to them that Visual Basic.Net Application can still be use in vb6 to enhance its capabilities. So in this connection, I would like to introduce to you the COM+ Object, we can create an application in visual Basic.Net in the form of a Dynamic Link Library (DLL), a COM Class application that generates TLB Files, in which stands for Translation Lookaside Buffer this TLB file can then be access as COM+ component in Visual Basic 6 environment.
What is Translation Lookaside Buffer?
A TLB is a file extension for Object Linking and Embedding (OLE) used in Microsoft Visual C++ runtime. This file extension is accessible as COM (Component Object Model) in VB6 environment. As you referenced it from VB6 Project its class can be use as common class object in VB6 environment thus will expose its properties methods and event as regular class. A third Library is being use in this project the AForge.Net Libraries.
Shape Detector Class
' *********** Class Created by Eng'r Nolan F. Sunico **********************************
' ************* Created February 10, 2013 - 9:13 PM ***********************************
' ************* Visit us at http://www.sourcehints.com ********************************
' *************************************************************************************
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms
Imports System.Reflection
' ******** AForege.Net Reference Assembly Version 2.2.0.0 *****************************
Imports AForge
Imports AForge.Imaging
Imports AForge.Imaging.Filters
Imports AForge.Math.Geometry
' * The AForege.Net Assembly is not included in this project as we are not authorized *
' **** to distribute its assemblies please download the 2.2.0.0 version from their ****
' **** Website at http://www.aforgenet.com/ the Official Website of AForge.Net ********
' *************************************************************************************
Namespace Geometry
<ComClass(ShapeDetector.ClassId, ShapeDetector.InterfaceId, ShapeDetector.EventsId)> _
Public Class ShapeDetector
#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "1c033e28-ef50-4650-92d4-a4aeb11c5e0a"
Public Const InterfaceId As String = "2e625fec-e82f-446a-9358-fef000ef7989"
Public Const EventsId As String = "969d56d7-59cb-455a-946e-b54c41479ca5"
#End Region
' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
#Region "Enumeration"
Public Enum ShapePolygon
[Nothing] = 0
Square = 1
Circle = 2
EquilateralTriangle = 3
Rectangle = 4
Pentagon = 5
Parallelogram = 6
IsoscelesTriangle = 7
Trapezoid = 8
Rhombus = 9
End Enum
#End Region
#Region "Private Subroutines"
Private Function ProcessImage(bitmap As Bitmap) As ShapePolygon
Dim SP As ShapePolygon = ShapePolygon.Nothing
Try
' lock image
Dim bmpData As BitmapData = bitmap.LockBits(New Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat)
' step 1 - turn background to black
Dim colorFilter As New ColorFiltering()
colorFilter.Red = New IntRange(0, 64)
colorFilter.Green = New IntRange(0, 64)
colorFilter.Blue = New IntRange(0, 64)
colorFilter.FillOutsideRange = False
colorFilter.ApplyInPlace(bmpData)
' step 2 - locating objects
Dim blobCounter As New BlobCounter()
blobCounter.FilterBlobs = True
blobCounter.MinHeight = 5
blobCounter.MinWidth = 5
blobCounter.ProcessImage(bmpData)
Dim blobs As Blob() = blobCounter.GetObjectsInformation()
bitmap.UnlockBits(bmpData)
' step 3 - check objects' type and highlight
Dim shapeChecker As New SimpleShapeChecker()
Dim i As Integer = 0, n As Integer = blobs.Length
While i < n
Dim edgePoints As List(Of IntPoint) = blobCounter.GetBlobsEdgePoints(blobs(i))
Dim center As DoublePoint
Dim radius As Single
Dim corners As List(Of IntPoint) = Nothing
' is circle ?
If shapeChecker.IsCircle(edgePoints, center, radius) Then
SP = ShapePolygon.Circle
Dim st As AForge.Math.Geometry.ShapeType = shapeChecker.CheckShapeType(edgePoints)
Select Case st
Case ShapeType.Quadrilateral
Case ShapeType.Unknown
MsgBox("Unknown")
End Select
ElseIf shapeChecker.IsConvexPolygon(edgePoints, corners) Then
Dim subType As PolygonSubType = shapeChecker.CheckPolygonSubType(corners)
Dim s As String = ""
Select Case corners.Count
Case 3 'Triangle
Select Case subType
Case PolygonSubType.IsoscelesTriangle
SP = ShapePolygon.IsoscelesTriangle
Case PolygonSubType.EquilateralTriangle
SP = ShapePolygon.EquilateralTriangle
Case Else
SP = ShapePolygon.EquilateralTriangle
End Select
Exit Try
Case 4 ' Quadrilateral
Select Case subType
Case PolygonSubType.Square
SP = ShapePolygon.Square
Case PolygonSubType.Rectangle
SP = ShapePolygon.Rectangle
Case PolygonSubType.Parallelogram
SP = ShapePolygon.Parallelogram
Case PolygonSubType.Rhombus
SP = ShapePolygon.Rhombus
Case PolygonSubType.Trapezoid
SP = ShapePolygon.Trapezoid
End Select
Exit Try
End Select
Else
SP = ShapePolygon.Pentagon
End If
i += 1
End While
' put new image to clipboard
Clipboard.SetDataObject(bitmap)
' and to picture box
Return SP
Catch ex As Exception
'
End Try
Return SP
End Function
#End Region
#Region "Subroutines"
'Public Subroutines
Private Function ToPointsArray(ByVal points As List(Of IntPoint)) As System.Drawing.Point()
Dim array As System.Drawing.Point() = New System.Drawing.Point(points.Count - 1) {}
Dim i As Integer = 0, n As Integer = points.Count
While i < n
array(i) = New System.Drawing.Point(points(i).X, points(i).Y)
i += 1
End While
Return array
End Function
Public Function ProcessImage(FileName As String) As ShapePolygon
Dim SPoly As ShapePolygon = ShapePolygon.Nothing
Dim mBitmap As Bitmap = Nothing
Try
mBitmap = New Bitmap(FileName)
SPoly = ProcessImage(mBitmap)
Catch ex As Exception
SPoly = ShapePolygon.Nothing
End Try
Return SPoly
End Function
Public Function ProcessCropImage() As ShapePolygon
Dim SPoly As ShapePolygon = ShapePolygon.Nothing
Try
SPoly = ProcessImage(CommonImage.CropBitmap)
Catch ex As Exception
SPoly = ShapePolygon.Nothing
End Try
Return SPoly
End Function
#End Region
End Class
End Namespace
Shape Recognizer
' *********** Class Created by Eng'r Nolan F. Sunico **********************************
' ************* Created February 10, 2013 - 9:13 PM ***********************************
' ************* Visit us at http://www.sourcehints.com ********************************
' *************************************************************************************
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Collections.Generic
Imports Microsoft.VisualBasic.Compatibility.VB6
' ******** AForege.Net Reference Assembly Version 2.2.0.0 *****************************
Imports AForge
Imports AForge.Imaging.Filters
Imports AForge.Imaging
Imports AForge.Math.Geometry
' * The AForege.Net Assembly is not included in this project as we are not authorized *
' **** to distribute its assemblies please download the 2.2.2.0 version from their ****
' **** Website at http://www.aforgenet.com/ the Official Website of AForge.Net ********
' *************************************************************************************
Imports Image = System.Drawing.Image 'Remove ambiguousness between AForge.Image and System.Drawing.Image
Imports Point = System.Drawing.Point 'Remove ambiguousness between AForge.Point and System.Drawing.Point
Namespace Geometry
<ComClass(ShapeRecognizer.ClassId, ShapeRecognizer.InterfaceId, ShapeRecognizer.EventsId)> _
Public Class ShapeRecognizer
#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "66e6a97a-68e3-4789-8929-8aa030235d58"
Public Const InterfaceId As String = "450b4285-9805-4b16-96dc-57bd05146d52"
Public Const EventsId As String = "d3189765-7fd0-4175-9b30-fd6f0174a034"
#End Region
' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
#Region "Class"
Private CommonSeq As FiltersSequence 'Commonly filter sequence to be used
''' <summary>
''' Crop Image from Source Image given the Left
''' Top, Width and Height of a resultant image as parameters.
''' </summary>
''' <param name="ImageFilename">The Image Filename to be Cropped</param>
''' <param name="x">The Left or X Dimension</param>
''' <param name="y">The Top or Y Dimension</param>
''' <param name="width">The Width of an Image to be cropped</param>
''' <param name="height">The Height of an Image to be cropped</param>
''' <remarks></remarks>
Public Sub CropImage(ByVal ImageFilename As String, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ImageFileNameToSave As String)
Dim bmp As New Bitmap(ImageFilename)
Try
Dim crop As New Crop(New Rectangle(x, y, width, height))
bmp = crop.Apply(bmp)
Geometry.CommonImage.CropBitmap = bmp
bmp.Save(ImageFileNameToSave, System.Drawing.Imaging.ImageFormat.Bmp)
Catch ex As Exception
' Error Occurred
MsgBox(ex.Message)
End Try
End Sub
#End Region
End Class
End Namespace
Common Image Class
' *********** Class Created by Eng'r Nolan F. Sunico **********************************
' ************* Created February 10, 2013 - 9:13 PM ***********************************
' ************* Visit us at http://www.sourcehints.com ********************************
' *************************************************************************************
Imports System.Drawing
Namespace Geometry
<ComClass(CommonImage.ClassId, CommonImage.InterfaceId, CommonImage.EventsId)> _
Public Class CommonImage
#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "e3369f65-21c3-4d4a-8983-711fee3e4b3b"
Public Const InterfaceId As String = "e9530bcf-1598-4681-b9e0-aff5eab29553"
Public Const EventsId As String = "10ac4620-f9a8-4984-8742-a0c680342839"
#End Region
' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
#Region "FileSystem"
Public Function CopyDirectory(SourceDirectory As String, DestinationDirectory As String) As Boolean
Dim Success As Boolean = False
Try
My.Computer.FileSystem.CopyDirectory(SourceDirectory, SourceDirectory)
Success = True
Catch ex As Exception
Success = False
End Try
Return Success
End Function
Public Function CopyFile(Source As String, Destination As String) As Boolean
Dim Success As Boolean = False
Try
My.Computer.FileSystem.CopyFile(Source, Destination)
Success = True
Catch ex As Exception
Success = False
End Try
Return Success
End Function
Public Function FileExist(Filename As String) As Boolean
Dim ret As Boolean = False
Try
ret = My.Computer.FileSystem.FileExists(Filename)
Catch ex As Exception
ret = False
End Try
Return ret
End Function
Public Function DirectoryExist(Filename As String) As Boolean
Dim ret As Boolean = False
Try
ret = My.Computer.FileSystem.DirectoryExists(Filename)
Catch ex As Exception
ret = False
End Try
Return ret
End Function
Public Function CreateDirectory(DirName As String) As Boolean
Dim Success As Boolean = False
Try
If Not DirectoryExist(DirName) Then
My.Computer.FileSystem.CreateDirectory(DirName)
End If
Success = True
Catch ex As Exception
Success = False
End Try
Return Success
End Function
Public Function GetSystemDrive() As String
Dim SysDrive As String = ""
Try
SysDrive = Environment.GetEnvironmentVariable("SystemDrive")
Catch ex As Exception
SysDrive = ""
End Try
Return SysDrive
End Function
Public Function GetWindowsDirectory() As String
Dim WinDir As String = ""
Try
WinDir = Environment.GetEnvironmentVariable("SystemRoot")
Catch ex As Exception
WinDir = ""
End Try
Return WinDir
End Function
Public Function GetTempDirectoryPath() As String
Dim TempDir As String = ""
Try
TempDir = My.Computer.FileSystem.SpecialDirectories.Temp
Catch ex As Exception
TempDir = ""
End Try
Return TempDir
End Function
#End Region
#Region "Public Properties"
Private Shared _CropBitmap As Bitmap
Public Shared Property CropBitmap() As Bitmap
Get
Return _CropBitmap
End Get
Set(ByVal value As Bitmap)
_CropBitmap = value
End Set
End Property
#End Region
#Region "Subroutines"
Public Function GetCommonBitmap() As Bitmap
Return CropBitmap
End Function
#End Region
End Class
End Namespace
Compiling the COM+ Library
Create a project in Visual Studio 2010, a Visual Basic>net Project and on a template select Class Library, and then remove or delete the default Class Library created by the process, right click the project name -> Add->Class from Popup menu and on the Template select COM Class, this will generate automatically a COM+ class library and exposed its public properties as component objects. to download the complete project please click the link below.
Sample Image Processing Project
Kindly like our Fan Page at: Like Us at SourceHints
ZIP Password: ilikesourcehints


