using System;
using System.Text;
using System.Threading;
using Matrox.MatroxImagingLibrary;
namespace MimLocatePeak1d
{
class Program
{
private const string SEQUENCE_FILE = MIL.M_IMAGE_PATH + "HandWithLaser.avi";
private const int LINE_WIDTH_AVERAGE = 20;
private const int LINE_WIDTH_DELTA = 20;
private const double MIN_CONTRAST = 100.0;
private const int NB_FIXED_POINT = 4;
private const double M3D_MESH_SCALING_X = 1.0;
private const double M3D_MESH_SCALING_Y = 4.0;
private const double M3D_MESH_SCALING_Z = -0.13;
static int Main(string[] args)
{
MIL_ID MilApplication = MIL.M_NULL;
MIL_ID MilSystem = MIL.M_NULL;
MIL_ID MilDisplay = MIL.M_NULL;
MIL_ID MilDisplayImage = MIL.M_NULL;
MIL_ID MilGraList = MIL.M_NULL;
MIL_ID MilImage = MIL.M_NULL;
MIL_ID MilPosYImage = MIL.M_NULL;
MIL_ID MilValImage = MIL.M_NULL;
MIL_ID MilContext = MIL.M_NULL;
MIL_ID MilLocatePeak = MIL.M_NULL;
MIL_ID MilStatContext = MIL.M_NULL;
MIL_ID MilExtreme = MIL.M_NULL;
MIL_INT SizeX = 0;
MIL_INT SizeY = 0;
MIL_INT NumberOfImages = 0;
double FrameRate = 0.0;
MIL_INT n = 0;
double PreviousTime = 0.0;
double StartTime = 0.0;
double EndTime = 0.0;
double TotalProcessTime = 0.0;
double WaitTime = 0.0;
MIL_INT[] ExtremePosY = new MIL_INT[] { 0, 0 };
MIL.MappAllocDefault(MIL.M_DEFAULT, ref MilApplication, ref MilSystem, ref MilDisplay, MIL.M_NULL, MIL.M_NULL);
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_SIZE_X, ref SizeX);
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_SIZE_Y, ref SizeY);
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_NUMBER_OF_IMAGES, ref NumberOfImages);
MIL.MbufDiskInquire(SEQUENCE_FILE, MIL.M_FRAME_RATE, ref FrameRate);
MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, ref MilImage);
MIL.MbufAlloc2d(MilSystem, SizeX, SizeY, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_DISP, ref MilDisplayImage);
MIL.MbufAlloc2d(MilSystem, SizeX, NumberOfImages, 16 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, ref MilPosYImage);
MIL.MbufAlloc2d(MilSystem, SizeX, NumberOfImages, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE + MIL.M_PROC, ref MilValImage);
MIL.MimAlloc(MilSystem, MIL.M_LOCATE_PEAK_1D_CONTEXT, MIL.M_DEFAULT, ref MilContext);
MIL.MimAllocResult(MilSystem, MIL.M_DEFAULT, MIL.M_LOCATE_PEAK_1D_RESULT, ref MilLocatePeak);
MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref MilGraList);
MIL.MdispSelect(MilDisplay, MilDisplayImage);
MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, MilGraList);
Console.WriteLine();
Console.WriteLine("EXTRACTING 3D IMAGE FROM A LASER LINE (SHEET-OF-LIGHT):");
Console.WriteLine("--------------------------------------------------------");
Console.WriteLine();
Console.WriteLine("The position of a laser line is being extracted from an image");
Console.WriteLine("to generate a depth image.");
MIL.MbufImportSequence(SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, 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, ref PreviousTime);
TotalProcessTime = 0.0;
for (n = 0; n < NumberOfImages; n++)
{
MIL.MbufImportSequence(SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_LOAD, MIL.M_NULL, ref MilImage, MIL.M_DEFAULT, 1, MIL.M_READ);
MIL.MbufCopy(MilImage, MilDisplayImage);
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, ref StartTime);
MIL.MimLocatePeak1d(MilContext, MilImage, MilLocatePeak, LINE_WIDTH_AVERAGE, LINE_WIDTH_DELTA, MIN_CONTRAST, MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, MIL.M_COLOR_RED);
MIL.MgraClear(MIL.M_DEFAULT, MilGraList);
MIL.MimDraw(MIL.M_DEFAULT, MilLocatePeak, MIL.M_NULL, MilGraList, MIL.M_DRAW_PEAKS + MIL.M_CROSS, MIL.M_ALL, 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, ref EndTime);
TotalProcessTime += EndTime - StartTime;
WaitTime = (1.0 / FrameRate) - (EndTime - PreviousTime);
if (WaitTime > 0)
{
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_WAIT, ref WaitTime);
}
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, ref PreviousTime);
}
MIL.MgraClear(MIL.M_DEFAULT, MilGraList);
MIL.MbufImportSequence(SEQUENCE_FILE, MIL.M_DEFAULT, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_CLOSE);
Console.WriteLine("{0} images processed in {1,7:f2} s ({2,7:f2} ms/image).",
(int)NumberOfImages, TotalProcessTime,
TotalProcessTime / NumberOfImages * 1000.0);
Console.WriteLine("Press <Enter> to continue.");
Console.WriteLine();
Console.ReadKey();
Console.WriteLine("The reconstructed images are being displayed.");
int VisualizationDelayMsec = 10;
for (n = 0; n < NumberOfImages; n++)
{
MIL.MbufClear(MilImage, 0);
MIL.MimDraw(MIL.M_DEFAULT, MilPosYImage, MilValImage, MilImage, MIL.M_DRAW_PEAKS + MIL.M_1D_COLUMNS + MIL.M_LINES, n, 1, MIL.M_FIXED_POINT + NB_FIXED_POINT);
MIL.MbufCopy(MilImage, MilDisplayImage);
Thread.Sleep(VisualizationDelayMsec);
}
Console.WriteLine("Press <Enter> to continue.");
Console.WriteLine();
Console.ReadKey();
MIL_ID MilDisplay3D = Alloc3dDisplayId(MilSystem);
if (MilDisplay3D != MIL.M_NULL)
{
MIL.McalUniform(MilPosYImage, 0.0, 0.0, M3D_MESH_SCALING_X, M3D_MESH_SCALING_Y, 0.0, MIL.M_DEFAULT);
MIL.McalControl(MilPosYImage, MIL.M_GRAY_LEVEL_SIZE_Z, M3D_MESH_SCALING_Z);
MIL_ID ContainerId = MIL.MbufAllocContainer(MilSystem, MIL.M_PROC | MIL.M_DISP, MIL.M_DEFAULT, MIL.M_NULL);
MIL.MbufConvert3d(MilPosYImage, ContainerId, MIL.M_NULL, MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL_ID Reflectance = MIL.MbufAllocComponent(ContainerId, 1, SizeX, NumberOfImages, 8 + MIL.M_UNSIGNED, MIL.M_IMAGE, MIL.M_COMPONENT_REFLECTANCE, MIL.M_NULL);
MIL.MbufCopy(MilValImage, Reflectance);
Console.WriteLine("The depth buffer is displayed using 3D MIL.");
Console.WriteLine("Press <R> on the display window to stop/start the rotation.");
Console.WriteLine();
MIL.MdispControl(MilDisplay, MIL.M_WINDOW_SHOW, MIL.M_DISABLE);
MIL.M3ddispSelect(MilDisplay3D, ContainerId, MIL.M_SELECT, MIL.M_DEFAULT);
AutoRotate3dDisplay(MilDisplay3D);
Console.WriteLine("Press <Enter> to end.");
Console.ReadKey();
MIL.M3ddispFree(MilDisplay3D);
MIL.MbufFree(ContainerId);
}
else
{
Console.WriteLine("The depth buffer is displayed using 2D MIL.");
MIL.MimAlloc(MilSystem, MIL.M_STATISTICS_CONTEXT, MIL.M_DEFAULT, ref MilStatContext);
MIL.MimAllocResult(MilSystem, MIL.M_DEFAULT, MIL.M_STATISTICS_RESULT, ref MilExtreme);
MIL.MimControl(MilStatContext, MIL.M_STAT_MIN, MIL.M_ENABLE);
MIL.MimControl(MilStatContext, MIL.M_STAT_MAX, MIL.M_ENABLE);
MIL.MimControl(MilStatContext, MIL.M_CONDITION, MIL.M_NOT_EQUAL);
MIL.MimControl(MilStatContext, MIL.M_COND_LOW, 0xFFFF);
MIL.MimStatCalculate(MilStatContext, MilPosYImage, MilExtreme, MIL.M_DEFAULT);
MIL.MimGetResult(MilExtreme, MIL.M_STAT_MIN + MIL.M_TYPE_MIL_INT, ref ExtremePosY[0]);
MIL.MimGetResult(MilExtreme, MIL.M_STAT_MAX + MIL.M_TYPE_MIL_INT, ref ExtremePosY[1]);
MIL.MimFree(MilExtreme);
MIL.MimFree(MilStatContext);
MIL.MbufFree(MilDisplayImage);
MIL.MbufAlloc2d(MilSystem,
(MIL_INT)((double)SizeX * (M3D_MESH_SCALING_X > 0 ? M3D_MESH_SCALING_X : -M3D_MESH_SCALING_X)),
(MIL_INT)((double)NumberOfImages * M3D_MESH_SCALING_Y),
8 + MIL.M_UNSIGNED,
MIL.M_IMAGE + MIL.M_PROC + MIL.M_DISP,
ref MilDisplayImage);
MIL.MdispSelect(MilDisplay, MilDisplayImage);
MIL.MimClip(MilPosYImage, MilPosYImage, MIL.M_GREATER, ExtremePosY[1], MIL.M_NULL, ExtremePosY[1], MIL.M_NULL);
MIL.MimArith(MilPosYImage, ExtremePosY[0], MilPosYImage, MIL.M_SUB_CONST);
MIL.MimArith(MilPosYImage, ((ExtremePosY[1] - ExtremePosY[0]) / 255.0) + 1, MilPosYImage, MIL.M_DIV_CONST);
MIL.MimResize(MilPosYImage, MilDisplayImage, MIL.M_FILL_DESTINATION, MIL.M_FILL_DESTINATION, MIL.M_BILINEAR);
Console.WriteLine("Press <Enter> to end.");
Console.ReadKey();
}
MIL.MimFree(MilLocatePeak);
MIL.MimFree(MilContext);
MIL.MbufFree(MilImage);
MIL.MgraFree(MilGraList);
MIL.MbufFree(MilDisplayImage);
MIL.MbufFree(MilPosYImage);
MIL.MbufFree(MilValImage);
MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL);
return 0;
}
private static MIL_ID Alloc3dDisplayId(MIL_ID MilSystem)
{
MIL.MappControl(MIL.M_DEFAULT, MIL.M_ERROR, MIL.M_PRINT_DISABLE);
MIL_ID MilDisplay3D = 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)
{
Console.WriteLine();
Console.WriteLine("The current system does not support the 3D display.");
Console.WriteLine();
}
return MilDisplay3D;
}
private static void AutoRotate3dDisplay(MIL_ID MilDisplay)
{
MIL.M3ddispControl(MilDisplay, MIL.M_AUTO_ROTATE, MIL.M_ENABLE);
}
}
}