'
'
'
'
'
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Matrox.MatroxImagingLibrary
Namespace Mcal
Friend Class Program
Private Const RUN_LINEAR_CALIBRATION_EXAMPLE As Integer = MIL.M_YES
Private Const RUN_TSAI_CALIBRATION_EXAMPLE As Integer = MIL.M_YES
Private Const RUN_PARTIAL_GRID_CALIBRATION_EXAMPLE As Integer = MIL.M_YES
Private Const GRID_OFFSET_X As Integer = 0
Private Const GRID_OFFSET_Y As Integer = 0
Private Const GRID_OFFSET_Z As Integer = 0
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))
Console.WriteLine("CALIBRATION MODULE:")
Console.WriteLine("-------------------")
Console.WriteLine()
If RUN_LINEAR_CALIBRATION_EXAMPLE = MIL.M_YES Then
LinearInterpolationCalibration(MilSystem, MilDisplay)
End If
If RUN_TSAI_CALIBRATION_EXAMPLE = MIL.M_YES Then
TsaiCalibration(MilSystem, MilDisplay)
End If
If RUN_PARTIAL_GRID_CALIBRATION_EXAMPLE = MIL.M_YES Then
PartialGridCalibration(MilSystem, MilDisplay)
End If
MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL)
End Sub
Private Const GRID_IMAGE_FILE As String = MIL.M_IMAGE_PATH & "CalGrid.mim"
Private Const BOARD_IMAGE_FILE As String = MIL.M_IMAGE_PATH & "CalBoard.mim"
Private Const GRID_ROW_SPACING As Integer = 1
Private Const GRID_COLUMN_SPACING As Integer = 1
Private Const GRID_ROW_NUMBER As Integer = 18
Private Const GRID_COLUMN_NUMBER As Integer = 25
Private Const MEAS_BOX_POS_X1 As Integer = 55
Private Const MEAS_BOX_POS_Y1 As Integer = 24
Private Const MEAS_BOX_WIDTH1 As Integer = 7
Private Const MEAS_BOX_HEIGHT1 As Integer = 425
Private Const MEAS_BOX_POS_X2 As Integer = 225
Private Const MEAS_BOX_POS_Y2 As Integer = 11
Private Const MEAS_BOX_WIDTH2 As Integer = 7
Private Const MEAS_BOX_HEIGHT2 As Integer = 450
Private Const WIDTH_APPROXIMATION As Integer = 410
Private Const WIDTH_VARIATION As Integer = 25
Private Const MIN_EDGE_VALUE As Integer = 5
Private Shared Sub LinearInterpolationCalibration(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID)
Dim MilImage As MIL_ID = MIL.M_NULL
Dim MilOverlayImage As MIL_ID = MIL.M_NULL
Dim MilCalibration As MIL_ID = MIL.M_NULL
Dim MeasMarker1 As MIL_ID = MIL.M_NULL
Dim MeasMarker2 As MIL_ID = MIL.M_NULL
Dim WorldDistance1 As Double = 0.0
Dim WorldDistance2 As Double = 0.0
Dim PixelDistance1 As Double = 0.0
Dim PixelDistance2 As Double = 0.0
Dim PosX1 As Double = 0.0
Dim PosY1 As Double = 0.0
Dim PosX2 As Double = 0.0
Dim PosY2 As Double = 0.0
Dim PosX3 As Double = 0.0
Dim PosY3 As Double = 0.0
Dim PosX4 As Double = 0.0
Dim PosY4 As Double = 0.0
Dim CalibrationStatus As MIL_INT = 0
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
MIL.MbufRestore(GRID_IMAGE_FILE, MilSystem, MilImage)
MIL.MdispSelect(MilDisplay, MilImage)
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY, MIL.M_ENABLE)
MIL.MdispInquire(MilDisplay, MIL.M_OVERLAY_ID, MilOverlayImage)
Console.WriteLine()
Console.WriteLine("LINEAR INTERPOLATION CALIBRATION:")
Console.WriteLine("---------------------------------")
Console.WriteLine()
Console.WriteLine("The displayed grid has been grabbed with a high distortion")
Console.WriteLine("camera and will be used to calibrate the camera.")
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.McalAlloc(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, MilCalibration)
MIL.McalGrid(MilCalibration, MilImage, GRID_OFFSET_X, GRID_OFFSET_Y, GRID_OFFSET_Z, GRID_ROW_NUMBER, GRID_COLUMN_NUMBER, GRID_ROW_SPACING, GRID_COLUMN_SPACING, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.McalInquire(MilCalibration, MIL.M_CALIBRATION_STATUS + MIL.M_TYPE_MIL_INT, CalibrationStatus)
If CalibrationStatus = MIL.M_CALIBRATED Then
MIL.McalTransformImage(MilImage, MilImage, MilCalibration, MIL.M_BILINEAR Or MIL.M_OVERSCAN_CLEAR, MIL.M_DEFAULT, MIL.M_DEFAULT)
Console.WriteLine("The camera has been calibrated and the image of the grid")
Console.WriteLine("has been transformed to remove its distortions.")
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.MbufLoad(BOARD_IMAGE_FILE, MilImage)
MIL.McalAssociate(MilCalibration, MilImage, MIL.M_DEFAULT)
MIL.MmeasAllocMarker(MilSystem, MIL.M_STRIPE, MIL.M_DEFAULT, MeasMarker1)
MIL.MmeasAllocMarker(MilSystem, MIL.M_STRIPE, MIL.M_DEFAULT, MeasMarker2)
MIL.MmeasSetMarker(MeasMarker1, MIL.M_BOX_ORIGIN, MEAS_BOX_POS_X1, MEAS_BOX_POS_Y1)
MIL.MmeasSetMarker(MeasMarker1, MIL.M_BOX_SIZE, MEAS_BOX_WIDTH1, MEAS_BOX_HEIGHT1)
MIL.MmeasSetMarker(MeasMarker2, MIL.M_BOX_ORIGIN, MEAS_BOX_POS_X2, MEAS_BOX_POS_Y2)
MIL.MmeasSetMarker(MeasMarker2, MIL.M_BOX_SIZE, MEAS_BOX_WIDTH2, MEAS_BOX_HEIGHT2)
MIL.MmeasSetMarker(MeasMarker1, MIL.M_ORIENTATION, MIL.M_HORIZONTAL, MIL.M_NULL)
MIL.MmeasSetMarker(MeasMarker2, MIL.M_ORIENTATION, MIL.M_HORIZONTAL, MIL.M_NULL)
MIL.MmeasSetMarker(MeasMarker1, MIL.M_EDGEVALUE_MIN, MIN_EDGE_VALUE, MIL.M_NULL)
MIL.MmeasSetScore(MeasMarker1, MIL.M_STRENGTH_SCORE, _
0.0, _
0.0, _
MIL.M_MAX_POSSIBLE_VALUE, _
MIL.M_MAX_POSSIBLE_VALUE, _
MIL.M_DEFAULT, _
MIL.M_DEFAULT, _
MIL.M_DEFAULT)
'
'
MIL.MmeasSetScore(MeasMarker1, MIL.M_STRIPE_WIDTH_SCORE, _
WIDTH_APPROXIMATION - WIDTH_VARIATION, _
WIDTH_APPROXIMATION + WIDTH_VARIATION, _
WIDTH_APPROXIMATION + WIDTH_VARIATION, _
WIDTH_APPROXIMATION + WIDTH_VARIATION, _
MIL.M_DEFAULT, _
MIL.M_PIXEL, _
MIL.M_DEFAULT)
MIL.MmeasSetMarker(MeasMarker2, MIL.M_EDGEVALUE_MIN, MIN_EDGE_VALUE, MIL.M_NULL)
MIL.MmeasSetScore(MeasMarker2, MIL.M_STRENGTH_SCORE, _
0.0, _
0.0, _
MIL.M_MAX_POSSIBLE_VALUE, _
MIL.M_MAX_POSSIBLE_VALUE, _
MIL.M_DEFAULT, _
MIL.M_DEFAULT, _
MIL.M_DEFAULT)
MIL.MmeasSetScore(MeasMarker2, MIL.M_STRIPE_WIDTH_SCORE, _
WIDTH_APPROXIMATION - WIDTH_VARIATION, _
WIDTH_APPROXIMATION + WIDTH_VARIATION, _
WIDTH_APPROXIMATION + WIDTH_VARIATION, _
WIDTH_APPROXIMATION + WIDTH_VARIATION, _
MIL.M_DEFAULT, _
MIL.M_PIXEL, _
MIL.M_DEFAULT)
MIL.MmeasFindMarker(MIL.M_DEFAULT, MilImage, MeasMarker1, MIL.M_STRIPE_WIDTH + MIL.M_POSITION)
MIL.MmeasFindMarker(MIL.M_DEFAULT, MilImage, MeasMarker2, MIL.M_STRIPE_WIDTH + MIL.M_POSITION)
MIL.MmeasGetResult(MeasMarker1, MIL.M_STRIPE_WIDTH, WorldDistance1)
MIL.MmeasGetResult(MeasMarker2, MIL.M_STRIPE_WIDTH, WorldDistance2)
MIL.MmeasSetMarker(MeasMarker1, MIL.M_RESULT_OUTPUT_UNITS, MIL.M_PIXEL, MIL.M_NULL)
MIL.MmeasSetMarker(MeasMarker2, MIL.M_RESULT_OUTPUT_UNITS, MIL.M_PIXEL, MIL.M_NULL)
MIL.MmeasGetResult(MeasMarker1, MIL.M_STRIPE_WIDTH, PixelDistance1)
MIL.MmeasGetResult(MeasMarker2, MIL.M_STRIPE_WIDTH, PixelDistance2)
MIL.MmeasGetResult(MeasMarker1, MIL.M_POSITION + MIL.M_EDGE_FIRST, PosX1, PosY1)
MIL.MmeasGetResult(MeasMarker1, MIL.M_POSITION + MIL.M_EDGE_SECOND, PosX2, PosY2)
MIL.MmeasGetResult(MeasMarker2, MIL.M_POSITION + MIL.M_EDGE_FIRST, PosX3, PosY3)
MIL.MmeasGetResult(MeasMarker2, MIL.M_POSITION + MIL.M_EDGE_SECOND, PosX4, PosY4)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_YELLOW)
MIL.MmeasDraw(MIL.M_DEFAULT, MeasMarker1, MilOverlayImage, MIL.M_DRAW_WIDTH, MIL.M_DEFAULT, MIL.M_RESULT)
MIL.MmeasDraw(MIL.M_DEFAULT, MeasMarker2, MilOverlayImage, MIL.M_DRAW_WIDTH, MIL.M_DEFAULT, MIL.M_RESULT)
MIL.MgraBackColor(MIL.M_DEFAULT, MIL.M_COLOR_BLACK)
MIL.MgraText(MIL.M_DEFAULT, MilOverlayImage, CInt(Fix(PosX1 + 0.5 - 40)), CInt(Fix((PosY1 + 0.5) + ((PosY2 - PosY1) / 2.0))), " Distance 1 ")
MIL.MgraText(MIL.M_DEFAULT, MilOverlayImage, CInt(Fix(PosX3 + 0.5 - 40)), CInt(Fix((PosY3 + 0.5) + ((PosY4 - PosY3) / 2.0))), " Distance 2 ")
Console.WriteLine("A distorted image grabbed with the same camera was loaded and")
Console.WriteLine("calibrated measurements were done to evaluate the board dimensions.")
Console.WriteLine()
Console.WriteLine("========================================================")
Console.WriteLine(" Distance 1 Distance 2 ")
Console.WriteLine("--------------------------------------------------------")
Console.WriteLine(" Calibrated unit: {0,8:0.00} cm {1,6:0.00} cm ", WorldDistance1, WorldDistance2)
Console.WriteLine(" Uncalibrated unit: {0,8:0.00} pixels {1,6:0.00} pixels", PixelDistance1, PixelDistance2)
Console.WriteLine("========================================================")
Console.WriteLine()
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
MIL.MbufLoad(BOARD_IMAGE_FILE, MilImage)
MIL.McalTransformImage(MilImage, MilImage, MilCalibration, MIL.M_BILINEAR + MIL.M_OVERSCAN_CLEAR, MIL.M_DEFAULT, MIL.M_DEFAULT)
Console.WriteLine("The image was corrected to remove its distortions.")
MIL.MmeasFree(MeasMarker1)
MIL.MmeasFree(MeasMarker2)
Else
Console.WriteLine("Calibration generated an exception.")
Console.WriteLine("See User Guide to resolve the situation.")
Console.WriteLine()
End If
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.McalFree(MilCalibration)
MIL.MbufFree(MilImage)
End Sub
Private Const GRID_ORIGINAL_IMAGE_FILE As String = MIL.M_IMAGE_PATH & "CalGridOriginal.mim"
Private Const OBJECT_ORIGINAL_IMAGE_FILE As String = MIL.M_IMAGE_PATH & "CalObjOriginal.mim"
Private Const OBJECT_MOVED_IMAGE_FILE As String = MIL.M_IMAGE_PATH & "CalObjMoved.mim"
Private Const GRID_ORG_ROW_SPACING As Double = 1.5
Private Const GRID_ORG_COLUMN_SPACING As Double = 1.5
Private Const GRID_ORG_ROW_NUMBER As Integer = 12
Private Const GRID_ORG_COLUMN_NUMBER As Integer = 13
Private Const GRID_ORG_OFFSET_X As Integer = 0
Private Const GRID_ORG_OFFSET_Y As Integer = 0
Private Const GRID_ORG_OFFSET_Z As Integer = 0
Private Const ENCODER_TRANSLATION_X As Double = 0.817
Private Const ENCODER_TRANSLATION_Y As Double = 13.293
Private Const ENCODER_TRANSLATION_Z As Double = -14.06
Private Const ENCODER_ROTATION_Y As Double = 354.207
Private Const ENCODER_ROTATION_X As Double = 317.467
Private Const ENCODER_ROTATION_Z As Double = 281.969
Private Const MEASURED_CIRCLE_LABEL As Integer = 1
Private Const RING1_POS1_X As Double = 2.3
Private Const RING1_POS1_Y As Double = 3.9
Private Const RING2_POS1_X As Double = 10.7
Private Const RING2_POS1_Y As Double = 11.1
Private Const RING1_POS2_X As Double = 8.6
Private Const RING1_POS2_Y As Double = 2.5
Private Const RING2_POS2_X As Double = 7.9
Private Const RING2_POS2_Y As Double = 13.2
Private Const RING_START_RADIUS As Double = 1.25
Private Const RING_END_RADIUS As Double = 2.3
Private Const RING_THICKNESS As Double = 0.175
Private Const STEP_THICKNESS As Double = 4.0
Private Shared ReadOnly REGION_COLOR As Integer = MIL.M_RGB888(0, 100, 255)
Private Shared ReadOnly FEATURE_COLOR As Integer = MIL.M_RGB888(255, 0, 255)
Private Shared Sub TsaiCalibration(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID)
Dim MilImage As MIL_ID = MIL.M_NULL
Dim MilCalibration As MIL_ID = MIL.M_NULL
Dim CalibrationStatus As MIL_INT = 0
MIL.MbufRestore(GRID_ORIGINAL_IMAGE_FILE, MilSystem, MilImage)
MIL.MdispSelect(MilDisplay, MilImage)
Console.WriteLine()
Console.WriteLine("TSAI BASED CALIBRATION:")
Console.WriteLine("-----------------------")
Console.WriteLine()
Console.WriteLine("The displayed grid has been grabbed with a high perspective")
Console.WriteLine("camera and will be used to calibrate the camera.")
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.McalAlloc(MilSystem, MIL.M_TSAI_BASED, MIL.M_DEFAULT, MilCalibration)
MIL.McalGrid(MilCalibration, _
MilImage, _
GRID_ORG_OFFSET_X, _
GRID_ORG_OFFSET_Y, _
GRID_ORG_OFFSET_Z, _
GRID_ORG_ROW_NUMBER, _
GRID_ORG_COLUMN_NUMBER, _
GRID_ORG_ROW_SPACING, _
GRID_ORG_COLUMN_SPACING, _
MIL.M_DEFAULT, _
MIL.M_DEFAULT)
MIL.McalInquire(MilCalibration, MIL.M_CALIBRATION_STATUS + MIL.M_TYPE_MIL_INT, CalibrationStatus)
If CalibrationStatus = MIL.M_CALIBRATED Then
Console.WriteLine("The camera has been calibrated.")
Console.WriteLine()
ShowCameraInformation(MilCalibration)
MIL.MbufLoad(OBJECT_ORIGINAL_IMAGE_FILE, MilImage)
SetCalibrationOffset(MilCalibration, -RING_THICKNESS, MilImage)
Console.Write("First measured circle at z = {0:f3} cm. ", -RING_THICKNESS)
MeasureRing(MilSystem, MilDisplay, MilImage, RING1_POS1_X, RING1_POS1_Y)
SetCalibrationOffset(MilCalibration, -(STEP_THICKNESS + RING_THICKNESS), MilImage)
Console.Write("Second measured circle at z = {0:f3} cm. ", -(STEP_THICKNESS + RING_THICKNESS))
MeasureRing(MilSystem, MilDisplay, MilImage, RING2_POS1_X, RING2_POS1_Y)
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
MIL.McalSetCoordinateSystem(MilCalibration, _
MIL.M_TOOL_COORDINATE_SYSTEM, _
MIL.M_ABSOLUTE_COORDINATE_SYSTEM, _
MIL.M_ROTATION_YXZ Or MIL.M_ASSIGN, _
MIL.M_NULL, _
ENCODER_ROTATION_Y, _
ENCODER_ROTATION_X, _
ENCODER_ROTATION_Z, _
MIL.M_DEFAULT)
MIL.McalSetCoordinateSystem(MilCalibration, _
MIL.M_TOOL_COORDINATE_SYSTEM, _
MIL.M_ABSOLUTE_COORDINATE_SYSTEM, _
MIL.M_TRANSLATION Or MIL.M_COMPOSE_WITH_CURRENT, _
MIL.M_NULL, _
ENCODER_TRANSLATION_X, _
ENCODER_TRANSLATION_Y, _
ENCODER_TRANSLATION_Z, _
MIL.M_DEFAULT)
MIL.MbufLoad(OBJECT_MOVED_IMAGE_FILE, MilImage)
Console.WriteLine("Calibration module moved camera position and camera ")
Console.WriteLine("orientation according to known encoder transformation.")
Console.WriteLine()
ShowCameraInformation(MilCalibration)
SetCalibrationOffset(MilCalibration, -RING_THICKNESS, MilImage)
Console.Write("First measured circle at z = {0:f3} cm. ", -RING_THICKNESS)
MeasureRing(MilSystem, MilDisplay, MilImage, RING1_POS2_X, RING1_POS2_Y)
SetCalibrationOffset(MilCalibration, -(STEP_THICKNESS + RING_THICKNESS), MilImage)
Console.Write("Second measured circle at z = {0:f3} cm. ", -(STEP_THICKNESS + RING_THICKNESS))
MeasureRing(MilSystem, MilDisplay, MilImage, RING2_POS2_X, RING2_POS2_Y)
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
Else
Console.WriteLine("Calibration generated an exception.")
Console.WriteLine("See User Guide to resolve the situation.")
Console.WriteLine()
End If
MIL.McalFree(MilCalibration)
MIL.MbufFree(MilImage)
End Sub
Private Shared Sub SetCalibrationOffset(ByVal MilCalibration As MIL_ID, ByVal ZOffset As Double, ByVal MilImage As MIL_ID)
MIL.McalSetCoordinateSystem(MilCalibration, MIL.M_RELATIVE_COORDINATE_SYSTEM, MIL.M_ABSOLUTE_COORDINATE_SYSTEM, MIL.M_TRANSLATION + MIL.M_ASSIGN, MIL.M_NULL, 0, 0, ZOffset, MIL.M_DEFAULT)
MIL.McalAssociate(MilCalibration, MilImage, MIL.M_DEFAULT)
End Sub
Private Shared Sub MeasureRing(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID, ByVal MilImage As MIL_ID, ByVal MeasureRingX As Double, ByVal MeasureRingY As Double)
Dim MilMetrolContext As MIL_ID = MIL.M_NULL
Dim MilMetrolResult As MIL_ID = MIL.M_NULL
Dim MilOverlayImage As MIL_ID = MIL.M_NULL
Dim Value As Double = 0.0
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY, MIL.M_ENABLE)
MIL.MdispInquire(MilDisplay, MIL.M_OVERLAY_ID, MilOverlayImage)
MIL.MmetAlloc(MilSystem, MIL.M_DEFAULT, MilMetrolContext)
MIL.MmetAllocResult(MilSystem, MIL.M_DEFAULT, MilMetrolResult)
MIL.MmetAddFeature(MilMetrolContext, MIL.M_MEASURED, MIL.M_CIRCLE, MEASURED_CIRCLE_LABEL, MIL.M_DEFAULT, CType(MIL.M_NULL, IntPtr), CType(MIL.M_NULL, IntPtr), 0, MIL.M_DEFAULT)
MIL.MmetSetRegion(MilMetrolContext, MIL.M_FEATURE_LABEL(MEASURED_CIRCLE_LABEL), MIL.M_DEFAULT, MIL.M_RING, MeasureRingX, MeasureRingY, RING_START_RADIUS, RING_END_RADIUS, MIL.M_NULL, MIL.M_NULL)
MIL.MmetCalculate(MilMetrolContext, MilImage, MilMetrolResult, MIL.M_DEFAULT)
MIL.MgraColor(MIL.M_DEFAULT, REGION_COLOR)
MIL.MmetDraw(MIL.M_DEFAULT, MilMetrolResult, MilOverlayImage, MIL.M_DRAW_REGION, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.MgraColor(MIL.M_DEFAULT, FEATURE_COLOR)
MIL.MmetDraw(MIL.M_DEFAULT, MilMetrolResult, MilOverlayImage, MIL.M_DRAW_FEATURE, MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.MmetGetResult(MilMetrolResult, MIL.M_FEATURE_LABEL(MEASURED_CIRCLE_LABEL), MIL.M_RADIUS, Value)
Console.WriteLine("Measured Radius: {0:0.000} cm", Value)
MIL.MmetFree(MilMetrolResult)
MIL.MmetFree(MilMetrolContext)
End Sub
Private Shared Sub ShowCameraInformation(ByVal MilCalibration As MIL_ID)
Dim CameraPosX As Double = 0.0
Dim CameraPosY As Double = 0.0
Dim CameraPosZ As Double = 0.0
Dim CameraYaw As Double = 0.0
Dim CameraPitch As Double = 0.0
Dim CameraRoll As Double = 0.0
MIL.McalGetCoordinateSystem(MilCalibration, MIL.M_CAMERA_COORDINATE_SYSTEM, MIL.M_ABSOLUTE_COORDINATE_SYSTEM, MIL.M_TRANSLATION, CType(MIL.M_NULL, IntPtr), CameraPosX, CameraPosY, CameraPosZ, CType(MIL.M_NULL, IntPtr))
MIL.McalGetCoordinateSystem(MilCalibration, MIL.M_CAMERA_COORDINATE_SYSTEM, MIL.M_ABSOLUTE_COORDINATE_SYSTEM, MIL.M_ROTATION_YXZ, CType(MIL.M_NULL, IntPtr), CameraYaw, CameraPitch, CameraRoll, CType(MIL.M_NULL, IntPtr))
Console.WriteLine("Camera Position in cm: (x, y, z) ({0:0.00}, {1:0.00}, {2:0.00})", CameraPosX, CameraPosY, CameraPosZ)
Console.WriteLine("Camera Orientation in degrees: (yaw, pitch, roll) ({0:0.00}, {1:0.00}, {2:0.00})", CameraYaw, CameraPitch, CameraRoll)
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
End Sub
Private Const PARTIAL_GRID_IMAGE_FILE As String = MIL.M_IMAGE_PATH & "PartialGrid.mim"
Private Const CORRECTED_SIZE_X As Double = 60.0
Private Const CORRECTED_SIZE_Y As Double = 50.0
Private Const CORRECTED_OFFSET_X As Double = -35.0
Private Const CORRECTED_OFFSET_Y As Double = -5.0
Private Const CORRECTED_IMAGE_SIZE_X As Integer = 512
Shared Sub PartialGridCalibration(ByVal MilSystem As MIL_ID, ByVal MilDisplay As MIL_ID)
Dim MilImage As MIL_ID = MIL.M_NULL
Dim MilCorrectedImage As MIL_ID = MIL.M_NULL
Dim MilGraList As MIL_ID = MIL.M_NULL
Dim MilCalibration As MIL_ID = MIL.M_NULL
Dim CalibrationStatus, ImageType, CorrectedImageSizeY As MIL_INT
Dim RowSpacing, ColumnSpacing, CorrectedPixelSize As Double
Dim UnitName As New StringBuilder()
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_DEFAULT)
MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, MilGraList)
MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, MilGraList)
MIL.MbufRestore(PARTIAL_GRID_IMAGE_FILE, MilSystem, MilImage)
MIL.MbufInquire(MilImage, MIL.M_TYPE, ImageType)
MIL.MdispSelect(MilDisplay, MilImage)
Console.WriteLine()
Console.WriteLine("PARTIAL GRID CALIBRATION:")
Console.WriteLine("-------------------------")
Console.WriteLine()
Console.WriteLine("A camera will be calibrated using a rectangular grid that")
Console.WriteLine("is only partially visible in the camera
Console.WriteLine("The 2D code in the center is used as a fiducial to retrieve")
Console.WriteLine("the characteristics of the calibration grid.")
Console.WriteLine("Press <Enter> to continue.")
Console.ReadKey()
MIL.McalAlloc(MilSystem, MIL.M_TSAI_BASED, MIL.M_DEFAULT, MilCalibration)
MIL.McalControl(MilCalibration, MIL.M_GRID_PARTIAL, MIL.M_ENABLE)
MIL.McalControl(MilCalibration, MIL.M_GRID_FIDUCIAL, MIL.M_DATAMATRIX)
MIL.McalGrid(MilCalibration, _
MilImage, _
GRID_OFFSET_X, _
GRID_OFFSET_Y, _
GRID_OFFSET_Z, _
MIL.M_UNKNOWN, _
MIL.M_UNKNOWN, _
MIL.M_FROM_FIDUCIAL, _
MIL.M_FROM_FIDUCIAL, _
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.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_RED)
MIL.McalDraw(MIL.M_DEFAULT, MilCalibration, MilGraList, MIL.M_DRAW_ABSOLUTE_COORDINATE_SYSTEM,
MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_CYAN)
MIL.McalDraw(MIL.M_DEFAULT, MilCalibration, MilGraList, MIL.M_DRAW_FIDUCIAL_BOX,
MIL.M_DEFAULT, MIL.M_DEFAULT)
MIL.McalInquire(MilCalibration, MIL.M_ROW_SPACING, RowSpacing)
MIL.McalInquire(MilCalibration, MIL.M_COLUMN_SPACING, ColumnSpacing)
MIL.McalInquire(MilCalibration, MIL.M_GRID_UNIT_SHORT_NAME, UnitName)
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_RED)
MIL.MgraControl(MIL.M_DEFAULT, MIL.M_INPUT_UNITS, MIL.M_DISPLAY)
DrawGridInfo(MilGraList, "Row spacing", RowSpacing, 0, UnitName.ToString())
DrawGridInfo(MilGraList, "Col spacing", ColumnSpacing, 1, UnitName.ToString())
Console.WriteLine()
Console.WriteLine("The camera has been calibrated.")
Console.WriteLine()
Console.WriteLine("The grid information read is displayed.")
Console.WriteLine("Press <Enter> to continue.")
Console.WriteLine()
Console.ReadKey()
CorrectedPixelSize = CORRECTED_SIZE_X / CORRECTED_IMAGE_SIZE_X
CorrectedImageSizeY = CType(CORRECTED_SIZE_Y / CorrectedPixelSize, MIL_INT)
MIL.MbufAlloc2d(MilSystem, CORRECTED_IMAGE_SIZE_X, CorrectedImageSizeY, ImageType, MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP, MilCorrectedImage)
MIL.McalUniform(MilCorrectedImage, CORRECTED_OFFSET_X, CORRECTED_OFFSET_Y, CorrectedPixelSize, CorrectedPixelSize, 0.0, MIL.M_DEFAULT)
MIL.McalTransformImage(MilImage, _
MilCorrectedImage, _
MilCalibration, _
MIL.M_BILINEAR + MIL.M_OVERSCAN_CLEAR, _
MIL.M_DEFAULT, _
MIL.M_WARP_IMAGE + MIL.M_USE_DESTINATION_CALIBRATION)
MIL.MgraClear(MIL.M_DEFAULT, MilGraList)
MIL.MdispSelect(MilDisplay, MilCorrectedImage)
Console.WriteLine("A sub-region of the grid was selected and transformed")
Console.WriteLine("to remove the distortions.")
Console.WriteLine("The sub-region dimensions and position are:")
Console.WriteLine(" Size X : {0,3:g3} {1}", CORRECTED_SIZE_X, UnitName)
Console.WriteLine(" Size Y : {0,3:g3} {1}", CORRECTED_SIZE_Y, UnitName)
Console.WriteLine(" Offset X: {0,3:g3} {1}", CORRECTED_OFFSET_X, UnitName)
Console.WriteLine(" Offset Y: {0,3:g3} {1}", CORRECTED_OFFSET_Y, UnitName)
Console.WriteLine("Press <Enter> to quit.")
Console.WriteLine()
Console.ReadKey()
MIL.MbufFree(MilCorrectedImage)
Else
Console.WriteLine("Calibration generated an exception.")
Console.WriteLine("See User Guide to resolve the situation.")
Console.WriteLine()
Console.WriteLine("Press <Enter> to quit.")
Console.WriteLine()
End If
MIL.McalFree(MilCalibration)
MIL.MbufFree(MilImage)
MIL.MgraFree(MilGraList)
End Sub
Private Const LINE_HEIGHT As Integer = 16
Shared Sub DrawGridInfo(ByVal MilGraList As MIL_ID, _
ByVal InfoTag As String, _
ByVal Value As Double, _
ByVal LineOffsetY As MIL_INT, _
ByVal Units As String)
Dim Info As String = String.Format("{0}: {1:g3} {2}", InfoTag, Value, Units)
MIL.MgraText(MIL.M_DEFAULT, MilGraList, 0, LineOffsetY * LINE_HEIGHT, Info)
End Sub
End Class
End Namespace