'
'
'
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports Matrox.MatroxImagingLibrary
Namespace MImLocatePeak1d
Friend Class Program
Private Const SEQUENCE_FILE As String = MIL.M_IMAGE_PATH & "HandWithLaser.avi"
Private Const LINE_WIDTH_AVERAGE As Integer = 20
Private Const LINE_WIDTH_DELTA As Integer = 20
Private Const MIN_CONTRAST As Double = 100.0
Private Const NB_FIXED_POINT As Integer = 4
Private Const D3D_DISPLAY_SIZE_X As Integer = 640
Private Const D3D_DISPLAY_SIZE_Y As Integer = 480
Private Const D3D_MESH_SCALING_X As Double = -1.0
Private Const D3D_MESH_SCALING_Y As Double = 4.0
Private Const D3D_MESH_SCALING_Z As Double = -0.13
<DllImport("mdispd3d.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function MdepthD3DAlloc(ByVal DepthBuffer As MIL_ID, ByVal IntensityBuffer As MIL_ID, ByVal DisplaySizeX As MIL_INT, ByVal DisplaySizeY As MIL_INT, ByVal ScaleX As Double, ByVal ScaleY As Double, ByVal ScaleZ As Double, ByVal MinZ As Double, ByVal MaxZ As Double, ByVal MaxDistanceZ As Double, ByVal WindowHandle As IntPtr) As IntPtr
End Function
<DllImport("mdispd3d.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Sub MdispD3DFree(ByVal DispHandle As IntPtr)
End Sub
<DllImport("mdispd3d.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Sub MdispD3DShow(ByVal DispHandle As IntPtr)
End Sub
<DllImport("mdispd3d.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Sub MdispD3DHide(ByVal DispHandle As IntPtr)
End Sub
<DllImport("mdispd3d.dll", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Sub MdispD3DPrintHelp(ByVal DispHandle As IntPtr)
End Sub
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
Dim MilDisplayImage As MIL_ID = MIL.M_NULL
Dim MilImage As MIL_ID = MIL.M_NULL
Dim MilPosYImage As MIL_ID = MIL.M_NULL
Dim MilValImage As MIL_ID = MIL.M_NULL
Dim MilContext As MIL_ID = MIL.M_NULL
Dim MilLocatePeak As MIL_ID = MIL.M_NULL
Dim MilExtreme As MIL_ID = MIL.M_NULL
Dim SizeX As MIL_INT = 0
Dim SizeY As MIL_INT = 0
Dim NumberOfImages As MIL_INT = 0
Dim FrameRate As Double = 0.0
Dim n As Integer = 0
Dim PreviousTime As Double = 0.0
Dim StartTime As Double = 0.0
Dim EndTime As Double = 0.0
Dim TotalProcessTime As Double = 0.0
Dim WaitTime As Double = 0.0
Dim ExtremePosY() As MIL_INT = {0, 0}
MIL.MappAllocDefault(MIL.M_DEFAULT, MilApplication, MilSystem, MilDisplay, CType(MIL.M_NULL, IntPtr), CType(MIL.M_NULL, IntPtr))
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_SIZE_X, SizeX)
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_SIZE_Y, SizeY)
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_NUMBER_OF_IMAGES, NumberOfImages)
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_FRAME_RATE, FrameRate)
MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, MilImage)
MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_DISP, MilDisplayImage)
MIL.MbufAlloc2d(MilSystem, SizeX, NumberOfImages, 16 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, MilPosYImage)
MIL.MbufAlloc2d(MilSystem, SizeX, NumberOfImages, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, MilValImage)
MIL.MimAlloc(MilSystem, MIL.M_LOCATE_PEAK_1D_CONTEXT, MIL.M_DEFAULT, MilContext)
MIL.MimAllocResult(MilSystem, MIL.M_DEFAULT, MIL.M_LOCATE_PEAK_1D_RESULT, MilLocatePeak)
MIL.MdispSelect(MilDisplay, MilDisplayImage)
Console.Write(Constants.vbLf + "EXTRACTING 3D IMAGE FROM A LASER LINE (SHEET-OF-LIGHT):" + Constants.vbLf)
Console.Write("-------------------------------------------------------" + Constants.vbLf + Constants.vbLf)
Console.Write("The position of a laser line is being extracted from an image" + Constants.vbLf)
Console.Write("to generate a depth image." + Constants.vbLf + Constants.vbLf)
MIL.MbufImportSequence(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.MimLocatePeak1d(MilContext, MilImage, MilLocatePeak, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_PREPROCESS, MIL.M_DEFAULT)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, PreviousTime)
TotalProcessTime = 0.0
For n = 0 To CType((NumberOfImages - 1), Integer)
MIL.MbufImportSequence(SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_LOAD, MIL.M_NULL, MilImage, MIL.M_DEFAULT, 1, MIL.M_READ)
MIL.MbufCopy(MilImage, MilDisplayImage)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, StartTime)
MIL.MimLocatePeak1d(MilContext, MilImage, MilLocatePeak, LINE_WIDTH_AVERAGE, LINE_WIDTH_DELTA, MIN_CONTRAST, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.MimDraw(MIL.M_DEFAULT, MilLocatePeak, MIL.M_NULL, MilPosYImage, MIL.M_DRAW_DEPTH_MAP_ROW, n, MIL.M_NULL, MIL.M_FIXED_POINT + NB_FIXED_POINT)
MIL.MimDraw(MIL.M_DEFAULT, MilLocatePeak, MIL.M_NULL, MilValImage, MIL.M_DRAW_INTENSITY_MAP_ROW, n, MIL.M_NULL, MIL.M_FIXED_POINT + NB_FIXED_POINT)
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, EndTime)
TotalProcessTime += EndTime - StartTime
WaitTime = (1.0 / FrameRate) - (EndTime - PreviousTime)
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, PreviousTime)
Next n
MIL.MbufImportSequence(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)
Console.Write("{0} images processed in {1,7:0.00} s ({2,7:0.00} ms/image.)" + Constants.vbLf, NumberOfImages, TotalProcessTime, TotalProcessTime / CDbl(NumberOfImages) * 1000.0)
Console.Write("Press <Enter> to continue." + Constants.vbLf + Constants.vbLf)
Console.ReadKey()
Console.Write("The reconstructed images are being displayed." + Constants.vbLf)
For n = 0 To CType((NumberOfImages - 1), Integer)
MIL.MbufClear(MilImage, 0)
MIL.MimDraw(MIL.M_DEFAULT, MilPosYImage, MilValImage, MilImage, MIL.M_DRAW_PEAKS + MIL.M_1D_COLUMNS + MIL.M_LINES, CDbl(n), 1, MIL.M_FIXED_POINT + NB_FIXED_POINT)
MIL.MbufCopy(MilImage, MilDisplayImage)
Next n
Console.Write("Press <Enter> to continue." + Constants.vbLf + Constants.vbLf)
Console.ReadKey()
Dim DispHandle As IntPtr
DispHandle = MdepthD3DAlloc(MilPosYImage, MilValImage, D3D_DISPLAY_SIZE_X, D3D_DISPLAY_SIZE_Y, D3D_MESH_SCALING_X, D3D_MESH_SCALING_Y, D3D_MESH_SCALING_Z, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT, IntPtr.Zero)
If DispHandle <> IntPtr.Zero Then
Console.Write("The depth buffer is displayed using D3D." + Constants.vbLf)
MIL.MdispControl(MilDisplay, MIL.M_WINDOW_SHOW, MIL.M_DISABLE)
MdispD3DShow(DispHandle)
MdispD3DPrintHelp(DispHandle)
Console.Write("Press <Enter> to end." + Constants.vbLf)
Console.ReadKey()
MdispD3DHide(DispHandle)
MdispD3DFree(DispHandle)
Else
Console.Write("The depth buffer is displayed using MIL." + Constants.vbLf)
MIL.MimAllocResult(MilSystem, MIL.M_DEFAULT, MIL.M_STAT_LIST, MilExtreme)
MIL.MimStat(MilPosYImage, MilExtreme, MIL.M_MIN + MIL.M_MAX, MIL.M_NOT_EQUAL, &HFFFF, MIL.M_NULL)
MIL.MimGetResult(MilExtreme, MIL.M_MIN + MIL.M_TYPE_MIL_INT, ExtremePosY(0))
MIL.MimGetResult(MilExtreme, MIL.M_MAX + MIL.M_TYPE_MIL_INT, ExtremePosY(1))
MIL.MimFree(MilExtreme)
MIL.MbufFree(MilDisplayImage)
Dim RealSizeX As MIL_INT = 0
If D3D_MESH_SCALING_X > 0 Then
RealSizeX = CType((CDbl(SizeX) * D3D_MESH_SCALING_X), MIL_INT)
Else
RealSizeX = CType((CDbl(SizeX) * -D3D_MESH_SCALING_X), MIL_INT)
End If
MIL.MbufAlloc2d(MilSystem, RealSizeX, CType((CDbl(NumberOfImages) * D3D_MESH_SCALING_Y), MIL_INT), 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP, MilDisplayImage)
MIL.MdispSelect(MilDisplay, MilDisplayImage)
MIL.MimClip(MilPosYImage, MilPosYImage, MIL.M_GREATER, CDbl(ExtremePosY(1)), MIL.M_NULL, CDbl(ExtremePosY(1)), MIL.M_NULL)
MIL.MimArith(MilPosYImage, CDbl(ExtremePosY(0)), MilPosYImage, MIL.M_SUB_CONST)
MIL.MimArith(MilPosYImage, ((ExtremePosY(1) - ExtremePosY(0)) / 255) + 1, MilPosYImage, MIL.M_DIV_CONST)
MIL.MimResize(MilPosYImage, MilDisplayImage, MIL.M_FILL_DESTINATION, MIL.M_FILL_DESTINATION, MIL.M_BILINEAR)
Console.Write("Press <Enter> to end." + Constants.vbLf)
Console.ReadKey()
End If
MIL.MimFree(MilLocatePeak)
MIL.MimFree(MilContext)
MIL.MbufFree(MilImage)
MIL.MbufFree(MilDisplayImage)
MIL.MbufFree(MilPosYImage)
MIL.MbufFree(MilValImage)
MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL)
End Sub
End Class
End Namespace