'
'
'
'
'
Imports System
Imports System.Text
Imports Matrox.MatroxImagingLibrary
Namespace M3dmap
Friend Class Program
Shared Sub Main(ByVal args() As String)
Dim MilApplication As MIL_ID = MIL.M_NULL
Dim MilSystem As MIL_ID = MIL.M_NULL
Dim MilDisplay As MIL_ID = MIL.M_NULL
MIL.MappAllocDefault(MIL.M_DEFAULT, MilApplication, MilSystem, MilDisplay, CType(MIL.M_NULL, IntPtr), CType(MIL.M_NULL, IntPtr))
DepthCorrectionExample(MilSystem, MilDisplay)
CalibratedCameraExample(MilSystem, MilDisplay)
MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL)
End Sub
Private Const REFERENCE_PLANES_SEQUENCE_FILE As String = MIL.M_IMAGE_PATH & "ReferencePlanes.avi"
Private Const OBJECT_SEQUENCE_FILE As String = MIL.M_IMAGE_PATH & "ScannedObject.avi"
Private Const PEAK_WIDTH_NOMINAL As Integer = 10
Private Const PEAK_WIDTH_DELTA As Integer = 8
Private Const MIN_CONTRAST As Integer = 140
Private Shared ReadOnly CORRECTED_DEPTHS As Double() = {1.25, 2.5, 3.75, 5.0}
Private Const SCALE_FACTOR As Double = 10000.0
Private Const CALIB_TEXT_POS_X As Integer = 400
Private Const CALIB_TEXT_POS_Y As Integer = 15
Private Shared Sub DepthCorrectionExample(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID)
Dim MilOverlayImage As MIL_ID = MIL.M_NULL
Dim MilImage As MIL_ID = MIL.M_NULL
Dim MilDepthMap As MIL_ID = MIL.M_NULL
Dim MilLaser As MIL_ID = MIL.M_NULL
Dim MilCalibScan As MIL_ID = MIL.M_NULL
Dim MilScan As MIL_ID = MIL.M_NULL
Dim SizeX As MIL_INT = 0
Dim SizeY As MIL_INT = 0
Dim NbReferencePlanes As MIL_INT = 0
Dim NbObjectImages As MIL_INT = 0
Dim n As Integer = 0
Dim FrameRate As Double = 0.0
Dim StartTime As Double = 0.0
Dim EndTime As Double = 0.0
Dim WaitTime As Double = 0.0
MIL.MbufDiskInquire(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_SIZE_X, SizeX)
MIL.MbufDiskInquire(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_SIZE_Y, SizeY)
MIL.MbufDiskInquire(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_NUMBER_OF_IMAGES, NbReferencePlanes)
MIL.MbufDiskInquire(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_FRAME_RATE, FrameRate)
MIL.MbufDiskInquire(OBJECT_SEQUENCE_FILE, MIL.M_NUMBER_OF_IMAGES, NbObjectImages)
MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_DISP + MIL.M_PROC, MilImage)
MIL.MbufClear(MilImage, 0.0)
Console.WriteLine()
Console.WriteLine("DEPTH ANALYSIS:")
Console.WriteLine("---------------")
Console.WriteLine()
Console.WriteLine("This program performs a surface inspection to detect depth defects ")
Console.WriteLine("on a wood surface using a laser (sheet-of-light) profiling system.")
Console.WriteLine()
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.MdispSelect(MilDisplay, MilImage)
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY, MIL.M_ENABLE)
MIL.MdispInquire(MilDisplay, MIL.M_OVERLAY_ID, MilOverlayImage)
MIL.MgraControl(MIL.M_DEFAULT, MIL.M_BACKGROUND_MODE, MIL.M_TRANSPARENT)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_WHITE)
MIL.M3dmapAlloc(MilSystem, MIL.M_LASER, MIL.M_DEPTH_CORRECTION, MilLaser)
MIL.M3dmapAllocResult(MilSystem, MIL.M_LASER_CALIBRATION_DATA, MIL.M_DEFAULT, MilCalibScan)
Dim MilPeakLocator As MIL_ID = MIL.M_NULL
MIL.M3dmapInquire(MilLaser, MIL.M_DEFAULT, MIL.M_LOCATE_PEAK_1D_CONTEXT_ID + MIL.M_TYPE_MIL_ID, MilPeakLocator)
MIL.MimControl(MilPeakLocator, MIL.M_PEAK_WIDTH_NOMINAL, PEAK_WIDTH_NOMINAL)
MIL.MimControl(MilPeakLocator, MIL.M_PEAK_WIDTH_DELTA, PEAK_WIDTH_DELTA)
MIL.MimControl(MilPeakLocator, MIL.M_MINIMUM_CONTRAST, MIN_CONTRAST)
MIL.MbufImportSequence(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, CType(MIL.M_NULL, IntPtr), MIL.M_NULL, MIL.M_NULL, MIL.M_OPEN)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
For n = 0 To CInt(NbReferencePlanes) - 1
Dim CalibString As String
MIL.MbufImportSequence(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_LOAD, MIL.M_NULL, MilImage, MIL.M_DEFAULT, 1, MIL.M_READ)
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
CalibString = String.Format("Reference plane {0}: {1,0:f2} mm", (n + 1), CORRECTED_DEPTHS(n))
MIL.MgraText(MIL.M_DEFAULT, MilOverlayImage, CALIB_TEXT_POS_X, CALIB_TEXT_POS_Y, CalibString)
MIL.M3dmapControl(MilLaser, MIL.M_DEFAULT, MIL.M_CORRECTED_DEPTH, CORRECTED_DEPTHS(n) * SCALE_FACTOR)
MIL.M3dmapAddScan(MilLaser, MilCalibScan, MilImage, MIL.M_NULL, MIL.M_NULL, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, EndTime)
WaitTime = 1.0 / FrameRate - (EndTime - StartTime)
If WaitTime > 0 Then
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_WAIT, WaitTime)
End If
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
Next
MIL.MbufImportSequence(REFERENCE_PLANES_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, CType(MIL.M_NULL, IntPtr), MIL.M_NULL, MIL.M_NULL, MIL.M_CLOSE)
MIL.M3dmapCalibrate(MilLaser, MilCalibScan, MIL.M_NULL, MIL.M_DEFAULT)
Console.WriteLine("The laser profiling system has been calibrated using 4 reference")
Console.WriteLine("planes of known heights.")
Console.WriteLine()
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
Console.WriteLine("The wood surface is being scanned.")
Console.WriteLine()
MIL.M3dmapFree(MilCalibScan)
MilCalibScan = MIL.M_NULL
MIL.M3dmapAllocResult(MilSystem, MIL.M_DEPTH_CORRECTED_DATA, MIL.M_DEFAULT, MilScan)
MIL.MbufDiskInquire(OBJECT_SEQUENCE_FILE, MIL.M_FRAME_RATE, FrameRate)
MIL.MbufImportSequence(OBJECT_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, CType(MIL.M_NULL, IntPtr), MIL.M_NULL, MIL.M_NULL, MIL.M_OPEN)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
For n = 0 To CInt(NbObjectImages - 1)
MIL.MbufImportSequence(OBJECT_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_LOAD, MIL.M_NULL, MilImage, MIL.M_DEFAULT, 1, MIL.M_READ)
MIL.M3dmapAddScan(MilLaser, MilScan, MilImage, MIL.M_NULL, MIL.M_NULL, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, EndTime)
WaitTime = 1.0 / FrameRate - (EndTime - StartTime)
If WaitTime > 0 Then
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_WAIT, WaitTime)
End If
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
Next
MIL.MbufImportSequence(OBJECT_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, CType(MIL.M_NULL, IntPtr), MIL.M_NULL, MIL.M_NULL, MIL.M_CLOSE)
MIL.MbufAlloc2d(MilSystem, SizeX, NbObjectImages, 16 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP, MilDepthMap)
MIL.M3dmapCopyResult(MilScan, MIL.M_DEFAULT, MilDepthMap, MIL.M_PARTIALLY_CORRECTED_DEPTH_MAP, MIL.M_DEFAULT)
SetupColorDisplay(MilSystem, MilDisplay, MIL.MbufInquire(MilDepthMap, MIL.M_SIZE_BIT, MIL.M_NULL))
MIL.MdispSelect(MilDisplay, MilDepthMap)
MIL.MdispInquire(MilDisplay, MIL.M_OVERLAY_ID, MilOverlayImage)
Console.WriteLine("The pseudo-color depth map of the surface is displayed.")
Console.WriteLine()
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
PerformBlobAnalysis(MilSystem, MilDisplay, MilOverlayImage, MilDepthMap)
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.MdispLut(MilDisplay, MIL.M_DEFAULT)
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
MIL.M3dmapFree(MilScan)
MIL.M3dmapFree(MilLaser)
MIL.MbufFree(MilDepthMap)
MIL.MbufFree(MilImage)
End Sub
Private Const EXPECTED_HEIGHT As Double = 3.4
Private Const DEFECT_THRESHOLD As Double = 0.2
Private Const SATURATED_DEFECT As Double = 1.0
Private Const MIN_BLOB_RADIUS As Integer = 3
Private Const TEXT_H_OFFSET_1 As Integer = -50
Private Const TEXT_V_OFFSET_1 As Integer = -6
Private Const TEXT_H_OFFSET_2 As Integer = -30
Private Const TEXT_V_OFFSET_2 As Integer = 6
Private Shared Sub PerformBlobAnalysis(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID, ByVal MilOverlayImage As MIL_ID, ByVal MilDepthMap As MIL_ID)
Dim MilBinImage As MIL_ID = MIL.M_NULL
Dim MilBlobContext As MIL_ID = MIL.M_NULL
Dim MilBlobResult As MIL_ID = MIL.M_NULL
Dim SizeX As MIL_INT = 0
Dim SizeY As MIL_INT = 0
Dim TotalBlobs As MIL_INT = 0
Dim n As Integer = 0
Dim MinPixels As MIL_INT()
Dim DefectThreshold As Double = 0.0
Dim CogX As Double()
Dim CogY As Double()
MIL.MbufInquire(MilDepthMap, MIL.M_SIZE_X, SizeX)
MIL.MbufInquire(MilDepthMap, MIL.M_SIZE_Y, SizeY)
MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 1 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, MilBinImage)
DefectThreshold = (EXPECTED_HEIGHT - DEFECT_THRESHOLD) * SCALE_FACTOR
MIL.MimBinarize(MilDepthMap, MilBinImage, MIL.M_FIXED + MIL.M_LESS_OR_EQUAL, DefectThreshold, MIL.M_NULL)
MIL.MimOpen(MilBinImage, MilBinImage, MIN_BLOB_RADIUS, MIL.M_BINARY)
MIL.MblobAlloc(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, MilBlobContext)
MIL.MblobControl(MilBlobContext, MIL.M_CENTER_OF_GRAVITY + MIL.M_GRAYSCALE, MIL.M_ENABLE)
MIL.MblobControl(MilBlobContext, MIL.M_MIN_PIXEL, MIL.M_ENABLE)
MIL.MblobAllocResult(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, MilBlobResult)
MIL.MblobCalculate(MilBlobContext, MilBinImage, MilDepthMap, MilBlobResult)
MIL.MblobGetResult(MilBlobResult, MIL.M_DEFAULT, MIL.M_NUMBER + MIL.M_TYPE_MIL_INT, TotalBlobs)
Console.WriteLine("Number of defects: {0}", TotalBlobs)
CogX = New Double(CInt(TotalBlobs - 1)) {}
CogY = New Double(CInt(TotalBlobs - 1)) {}
MinPixels = New MIL_INT(CInt(TotalBlobs - 1)) {}
If CogX IsNot Nothing AndAlso CogY IsNot Nothing AndAlso MinPixels IsNot Nothing Then
MIL.MblobGetResult(MilBlobResult, MIL.M_DEFAULT, MIL.M_CENTER_OF_GRAVITY_X + MIL.M_GRAYSCALE, CogX)
MIL.MblobGetResult(MilBlobResult, MIL.M_DEFAULT, MIL.M_CENTER_OF_GRAVITY_Y + MIL.M_GRAYSCALE, CogY)
MIL.MblobGetResult(MilBlobResult, MIL.M_DEFAULT, MIL.M_MIN_PIXEL + MIL.M_TYPE_MIL_INT, MinPixels)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_RED)
MIL.MblobDraw(MIL.M_DEFAULT, MilBlobResult, MilOverlayImage, MIL.M_DRAW_BLOBS, MIL.M_INCLUDED_BLOBS, MIL.M_DEFAULT)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_WHITE)
For n = 0 To CInt(TotalBlobs - 1)
Dim DepthOfDefect As Double
Dim DepthString As String
DepthOfDefect = EXPECTED_HEIGHT - CDbl(MinPixels(n)) / SCALE_FACTOR
DepthString = String.Format("{0,0:f2} mm", DepthOfDefect)
Console.WriteLine("Defect #{0}: depth ={1,5:f2} mm", n, DepthOfDefect)
Console.WriteLine()
MIL.MgraText(MIL.M_DEFAULT, MilOverlayImage, CogX(n) + TEXT_H_OFFSET_1, CogY(n) + TEXT_V_OFFSET_1, "Defect depth")
MIL.MgraText(MIL.M_DEFAULT, MilOverlayImage, CogX(n) + TEXT_H_OFFSET_2, CogY(n) + TEXT_V_OFFSET_2, DepthString.ToString)
Next
Else
Console.WriteLine("Error: Not enough memory.")
Console.WriteLine()
End If
MIL.MblobFree(MilBlobResult)
MIL.MblobFree(MilBlobContext)
MIL.MbufFree(MilBinImage)
End Sub
Private Const BLUE_HUE As Double = 171.0
Private Const RED_HUE As Double = 0.0
Private Const FULL_SATURATION As Integer = 255
Private Const HALF_LUMINANCE As Integer = 128
Private Shared Sub SetupColorDisplay(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID, ByVal SizeBit As MIL_INT)
Dim MilRampLut1Band As MIL_ID = MIL.M_NULL
Dim MilRampLut3Band As MIL_ID = MIL.M_NULL
Dim MilColorImage As MIL_ID = MIL.M_NULL
Dim DefectGrayLevel As MIL_INT = 0
Dim ExpectedGrayLevel As MIL_INT = 0
Dim NbGrayLevels As MIL_INT = 0
NbGrayLevels = CType(1 << CInt(SizeBit), MIL_INT)
MIL.MbufAlloc1d(MilSystem, NbGrayLevels, 8 + MIL.M_UNSIGNED, MIL.M_LUT, MilRampLut1Band)
DefectGrayLevel = CType((EXPECTED_HEIGHT - SATURATED_DEFECT) * SCALE_FACTOR, MIL_INT)
ExpectedGrayLevel = CType(EXPECTED_HEIGHT * SCALE_FACTOR, MIL_INT)
MIL.MgenLutRamp(MilRampLut1Band, 0, RED_HUE, DefectGrayLevel, RED_HUE)
MIL.MgenLutRamp(MilRampLut1Band, DefectGrayLevel, RED_HUE, ExpectedGrayLevel, BLUE_HUE)
MIL.MgenLutRamp(MilRampLut1Band, ExpectedGrayLevel, BLUE_HUE, NbGrayLevels - 1, BLUE_HUE)
MIL.MbufAllocColor(MilSystem, 3, NbGrayLevels, 1, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE, MilColorImage)
MIL.MbufClear(MilColorImage, MIL.M_RGB888(0, FULL_SATURATION, HALF_LUMINANCE))
MIL.MbufCopyColor2d(MilRampLut1Band, MilColorImage, 0, 0, 0, 0, 0, 0, NbGrayLevels, 1)
MIL.MimConvert(MilColorImage, MilColorImage, MIL.M_HSL_TO_RGB)
MIL.MbufAllocColor(MilSystem, 3, NbGrayLevels, 1, 8 + MIL.M_UNSIGNED, MIL.M_LUT, MilRampLut3Band)
MIL.MbufCopy(MilColorImage, MilRampLut3Band)
MIL.MdispLut(MilDisplay, MilRampLut3Band)
MIL.MbufFree(MilRampLut1Band)
MIL.MbufFree(MilRampLut3Band)
MIL.MbufFree(MilColorImage)
End Sub
Private Const GRID_FILENAME As String = MIL.M_IMAGE_PATH & "GridForLaser.mim"
Private Const LASERLINE_FILENAME As String = MIL.M_IMAGE_PATH & "LaserLine.mim"
Private Const OBJECT2_SEQUENCE_FILE As String = MIL.M_IMAGE_PATH & "Cookie.avi"
Private Const GRID_NB_ROWS As Integer = 13
Private Const GRID_NB_COLS As Integer = 12
Private Const GRID_ROW_SPACING As Double = 5.0
Private Const GRID_COL_SPACING As Double = 5.0
Private Const CONVEYOR_SPEED As Double = -0.2
Private Const DEPTH_MAP_SIZE_X As Integer = 480
Private Const DEPTH_MAP_SIZE_Y As Integer = 480
Private Const GAP_DEPTH As Double = 1.5
Private Const D3D_DISPLAY_SIZE_X As Integer = 640
Private Const D3D_DISPLAY_SIZE_Y As Integer = 480
Private Const PEAK_WIDTH_NOMINAL_2 As Integer = 9
Private Const PEAK_WIDTH_DELTA_2 As Integer = 7
Private Const MIN_CONTRAST_2 As Integer = 75
Private Const MIN_HEIGHT_THRESHOLD As Double = 1.0
Private Shared Sub CalibratedCameraExample(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID)
Dim MilOverlayImage As MIL_ID = MIL.M_NULL
Dim MilImage As MIL_ID = MIL.M_NULL
Dim MilCalibration As MIL_ID = MIL.M_NULL
Dim MilDepthMap As MIL_ID = MIL.M_NULL
Dim MilLaser As MIL_ID = MIL.M_NULL
Dim MilCalibScan As MIL_ID = MIL.M_NULL
Dim MilScan As MIL_ID = MIL.M_NULL
Dim MilContainerId As MIL_ID = MIL.M_NULL
Dim FillGapsContext As MIL_ID = MIL.M_NULL
Dim CalibrationStatus As MIL_INT = 0
Dim SizeX As MIL_INT = 0
Dim SizeY As MIL_INT = 0
Dim NumberOfImages As MIL_INT = 0
Dim n As MIL_INT = 0
Dim FrameRate As Double = 0.0
Dim StartTime As Double = 0.0
Dim EndTime As Double = 0.0
Dim WaitTime As Double = 0.0
Dim Volume As Double = 0.0
Console.WriteLine()
Console.WriteLine("3D PROFILING AND VOLUME ANALYSIS:")
Console.WriteLine("---------------------------------")
Console.WriteLine()
Console.WriteLine("This program generates fully corrected 3D data of a")
Console.WriteLine("scanned cookie and computes its volume.")
Console.WriteLine("The laser (sheet-of-light) profiling system uses a")
Console.WriteLine("3d-calibrated camera.")
Console.WriteLine()
MIL.MbufRestore(GRID_FILENAME, MilSystem, MilImage)
MIL.MdispSelect(MilDisplay, MilImage)
Console.WriteLine("Calibrating the camera...")
Console.WriteLine()
MIL.MbufInquire(MilImage, MIL.M_SIZE_X, SizeX)
MIL.MbufInquire(MilImage, MIL.M_SIZE_Y, SizeY)
MIL.McalAlloc(MilSystem, MIL.M_TSAI_BASED, MIL.M_DEFAULT, MilCalibration)
MIL.McalGrid(MilCalibration, MilImage, 0.0, 0.0, 0.0, GRID_NB_ROWS, GRID_NB_COLS, GRID_ROW_SPACING, GRID_COL_SPACING, MIL.M_DEFAULT, MIL.M_CHESSBOARD_GRID)
MIL.McalInquire(MilCalibration, MIL.M_CALIBRATION_STATUS + MIL.M_TYPE_MIL_INT, CalibrationStatus)
If CalibrationStatus <> MIL.M_CALIBRATED Then
MIL.McalFree(MilCalibration)
MIL.MbufFree(MilImage)
Console.WriteLine("Camera calibration failed.")
Console.WriteLine("Press <Enter> to end.")
Console.WriteLine()
Console.ReadKey()
Return
End If
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY, MIL.M_ENABLE)
MIL.MdispInquire(MilDisplay, MIL.M_OVERLAY_ID, MilOverlayImage)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_GREEN)
MIL.McalDraw(MIL.M_DEFAULT, MilCalibration, MilOverlayImage, MIL.M_DRAW_IMAGE_POINTS, MIL.M_DEFAULT, MIL.M_DEFAULT)
Console.WriteLine("The camera was calibrated using a chessboard grid.")
Console.WriteLine()
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY, MIL.M_DISABLE)
MIL.MbufLoad(LASERLINE_FILENAME, MilImage)
MIL.M3dmapAlloc(MilSystem, MIL.M_LASER, MIL.M_CALIBRATED_CAMERA_LINEAR_MOTION, MilLaser)
MIL.M3dmapAllocResult(MilSystem, MIL.M_LASER_CALIBRATION_DATA, MIL.M_DEFAULT, MilCalibScan)
Dim MilPeakLocator As MIL_ID = MIL.M_NULL
MIL.M3dmapInquire(MilLaser, MIL.M_DEFAULT, MIL.M_LOCATE_PEAK_1D_CONTEXT_ID + MIL.M_TYPE_MIL_ID, MilPeakLocator)
MIL.MimControl(MilPeakLocator, MIL.M_PEAK_WIDTH_NOMINAL, PEAK_WIDTH_NOMINAL_2)
MIL.MimControl(MilPeakLocator, MIL.M_PEAK_WIDTH_DELTA, PEAK_WIDTH_DELTA_2)
MIL.MimControl(MilPeakLocator, MIL.M_MINIMUM_CONTRAST, MIN_CONTRAST_2)
MIL.M3dmapAddScan(MilLaser, MilCalibScan, MilImage, MIL.M_NULL, MIL.M_NULL, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.M3dmapCalibrate(MilLaser, MilCalibScan, MilCalibration, MIL.M_DEFAULT)
Console.WriteLine("The laser profiling system has been calibrated using the image")
Console.WriteLine("of one laser line.")
Console.WriteLine()
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.M3dmapFree(MilCalibScan)
MilCalibScan = MIL.M_NULL
MIL.M3dmapAllocResult(MilSystem, MIL.M_POINT_CLOUD_RESULT, MIL.M_DEFAULT, MilScan)
MIL.M3dmapControl(MilLaser, MIL.M_DEFAULT, MIL.M_SCAN_SPEED, CONVEYOR_SPEED)
MIL.MbufDiskInquire(OBJECT2_SEQUENCE_FILE, MIL.M_NUMBER_OF_IMAGES, NumberOfImages)
MIL.MbufDiskInquire(OBJECT2_SEQUENCE_FILE, MIL.M_FRAME_RATE, FrameRate)
MIL.MbufImportSequence(OBJECT2_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, CType(MIL.M_NULL, IntPtr), MIL.M_NULL, MIL.M_NULL, MIL.M_OPEN)
Console.WriteLine("The cookie is being scanned to generate 3D data.")
Console.WriteLine()
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
For n = 0 To NumberOfImages - 1
MIL.MbufImportSequence(OBJECT2_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_LOAD, MIL.M_NULL, MilImage, MIL.M_DEFAULT, 1, MIL.M_READ)
MIL.M3dmapAddScan(MilLaser, MilScan, MilImage, MIL.M_NULL, MIL.M_NULL, MIL.M_POINT_CLOUD_LABEL(1), MIL.M_DEFAULT)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, EndTime)
WaitTime = 1.0 / FrameRate - (EndTime - StartTime)
If WaitTime > 0 Then
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_WAIT, WaitTime)
End If
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
Next
MIL.MbufImportSequence(OBJECT2_SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, CType(MIL.M_NULL, IntPtr), MIL.M_NULL, MIL.M_NULL, MIL.M_CLOSE)
MIL.MbufAllocContainer(MilSystem, MIL.M_PROC Or MIL.M_DISP, MIL.M_DEFAULT, MilContainerId)
Dim NbClouds As Double = 1.0
MIL.M3dmapInquire(MilScan, MIL.M_DEFAULT, MIL.M_NUMBER_OF_POINT_CLOUDS, NbClouds)
MIL.M3dmapCopyResult(MilScan, MIL.M_ALL, MilContainerId, MIL.M_POINT_CLOUD_UNORGANIZED, MIL.M_DEFAULT)
MIL.MbufAlloc2d(MilSystem, DEPTH_MAP_SIZE_X, DEPTH_MAP_SIZE_Y, 16 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP, MilDepthMap)
MIL.M3dimCalibrateDepthMap(MilContainerId, MilDepthMap, MIL.M_NULL, MIL.M_NULL, MIL.M_DEFAULT, MIL.M_NEGATIVE, MIL.M_DEFAULT)
Dim MilPlane As MIL_ID = MIL.M3dgeoAlloc(MilSystem, MIL.M_GEOMETRY, MIL.M_DEFAULT, MIL.M_NULL)
MIL.M3dgeoPlane(MilPlane, MIL.M_COEFFICIENTS, 0.0, 0.0, 1.0, MIN_HEIGHT_THRESHOLD, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.M3dimCrop(MilContainerId, MilContainerId, MilPlane, MIL.M_NULL, MIL.M_SAME, MIL.M_INVERSE)
MIL.M3dgeoFree(MilPlane)
Console.WriteLine("Fully corrected 3D data of the cookie is displayed.")
Console.WriteLine()
Dim M3dDisplay As MIL_ID = Alloc3dDisplayId(MilSystem)
If M3dDisplay <> MIL.M_NULL Then
Console.WriteLine("Press <R> on the display window to stop/start the rotation.")
Console.WriteLine()
MIL.M3ddispSelect(M3dDisplay, MilContainerId, MIL.M_SELECT, MIL.M_DEFAULT)
MIL.M3ddispSetView(M3dDisplay, MIL.M_AUTO, MIL.M_BOTTOM_TILTED, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.M3ddispControl(M3dDisplay, MIL.M_AUTO_ROTATE, MIL.M_ENABLE)
End If
MIL.M3dimProject(MilContainerId, MilDepthMap, MIL.M_NULL, MIL.M_DEFAULT, MIL.M_MIN_Z, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.M3dimAlloc(MilSystem, MIL.M_FILL_GAPS_CONTEXT, MIL.M_DEFAULT, FillGapsContext)
MIL.M3dimControl(FillGapsContext, MIL.M_FILL_MODE, MIL.M_X_THEN_Y)
MIL.M3dimControl(FillGapsContext, MIL.M_FILL_SHARP_ELEVATION, MIL.M_MIN)
MIL.M3dimControl(FillGapsContext, MIL.M_FILL_SHARP_ELEVATION_DEPTH, GAP_DEPTH)
MIL.M3dimControl(FillGapsContext, MIL.M_FILL_BORDER, MIL.M_DISABLE)
MIL.M3dimFillGaps(FillGapsContext, MilDepthMap, MIL.M_NULL, MIL.M_DEFAULT)
MIL.M3dmetVolume(MilDepthMap, MIL.M_XY_PLANE, MIL.M_TOTAL, MIL.M_DEFAULT, Volume, CType(MIL.M_NULL, IntPtr))
Console.WriteLine("Volume of the cookie is {0,4:f1} cm^3.", Volume / 1000.0)
Console.WriteLine()
Console.WriteLine("Press <Enter> to end.")
Console.WriteLine()
Console.ReadKey()
If M3dDisplay <> MIL.M_NULL Then
MIL.M3ddispFree(M3dDisplay)
End If
MIL.M3dimFree(FillGapsContext)
MIL.MbufFree(MilContainerId)
MIL.M3dmapFree(MilScan)
MIL.M3dmapFree(MilLaser)
MIL.McalFree(MilCalibration)
MIL.MbufFree(MilDepthMap)
MIL.MbufFree(MilImage)
End Sub
Private Shared Function Alloc3dDisplayId(ByVal MilSystem As MIL_ID) As MIL_ID
MIL.MappControl(MIL.M_DEFAULT, MIL.M_ERROR, MIL.M_PRINT_DISABLE)
Dim MilDisplay3D As MIL_ID = MIL.M3ddispAlloc(MilSystem, MIL.M_DEFAULT, "M_DEFAULT", MIL.M_DEFAULT, MIL.M_NULL)
MIL.MappControl(MIL.M_DEFAULT, MIL.M_ERROR, MIL.M_PRINT_ENABLE)
If MilDisplay3D = MIL.M_NULL Then
Console.WriteLine()
Console.WriteLine("The current system does not support the 3D display.")
Console.WriteLine()
End If
Return MilDisplay3D
End Function
End Class
End Namespace