using System;
using System.Collections.Generic;
using System.Text;
using Matrox.MatroxImagingLibrary;
namespace MBead
{
class Program
{
private static readonly MIL_INT USER_POSITION_COLOR = MIL.M_COLOR_RED;
private static readonly MIL_INT USER_TEMPLATE_COLOR = MIL.M_COLOR_CYAN;
private static readonly MIL_INT TRAINED_BEAD_WIDTH_COLOR = MIL.M_RGB888(255, 128, 0);
private static readonly MIL_INT MODEL_FINDER_COLOR = MIL.M_COLOR_GREEN;
private static readonly MIL_INT COORDINATE_SYSTEM_COLOR = MIL.M_RGB888(164, 164, 0);
private static readonly MIL_INT RESULT_SEARCH_BOX_COLOR = MIL.M_COLOR_CYAN;
private static readonly MIL_INT PASS_BEAD_WIDTH_COLOR = MIL.M_COLOR_GREEN;
private static readonly MIL_INT PASS_BEAD_POSITION_COLOR = MIL.M_COLOR_GREEN;
private static readonly MIL_INT FAIL_NOT_FOUND_COLOR = MIL.M_COLOR_RED;
private static readonly MIL_INT FAIL_SMALL_WIDTH_COLOR = MIL.M_RGB888(255, 128, 0);
private static readonly MIL_INT FAIL_EDGE_OFFSET_COLOR = MIL.M_COLOR_RED;
static void Main(string[] args)
{
MIL_ID MilApplication = MIL.M_NULL;
MIL_ID MilSystem = MIL.M_NULL;
MIL_ID MilDisplay = MIL.M_NULL;
MIL.MappAllocDefault(MIL.M_DEFAULT, ref MilApplication, ref MilSystem, ref MilDisplay, MIL.M_NULL, MIL.M_NULL);
FixturedBeadExample(MilSystem, MilDisplay);
PredefinedBeadExample(MilSystem, MilDisplay);
MIL.MappFreeDefault(MilApplication, MilSystem, MilDisplay, MIL.M_NULL, MIL.M_NULL);
}
private static readonly string IMAGE_FILE_TRAINING = MIL.M_IMAGE_PATH + "BeadTraining.mim";
private static readonly string IMAGE_FILE_TARGET = MIL.M_IMAGE_PATH + "BeadTarget.mim";
private const int NUMBER_OF_TRAINING_POINTS = 13;
private static readonly double[] TrainingPointsX = new double[NUMBER_OF_TRAINING_POINTS] { 180, 280, 400, 430, 455, 415, 370, 275, 185, 125, 105, 130, 180 };
private static readonly double[] TrainingPointsY = new double[NUMBER_OF_TRAINING_POINTS] { 190, 215, 190, 200, 260, 330, 345, 310, 340, 305, 265, 200, 190 };
private const double MAX_ANGLE_CORRECTION_VALUE = 20.0;
private const double MAX_DEVIATION_OFFSET_VALUE = 25.0;
private const double WIDTH_DELTA_NEG_VALUE = 2.0;
private const int MODEL_ORIGIN_X = 145;
private const int MODEL_ORIGIN_Y = 115;
private const int MODEL_SIZE_X = 275;
private const int MODEL_SIZE_Y = 60;
private static void FixturedBeadExample(MIL_ID MilSystem, MIL_ID MilDisplay)
{
MIL_ID MilGraList = MIL.M_NULL;
MIL_ID MilImageTraining = MIL.M_NULL;
MIL_ID MilImageTarget = MIL.M_NULL;
MIL_ID MilBeadContext = MIL.M_NULL;
MIL_ID MilBeadResult = MIL.M_NULL;
MIL_ID MilModelFinderContext = MIL.M_NULL;
MIL_ID MilModelFinderResult = MIL.M_NULL;
MIL_ID MilFixturingOffset = MIL.M_NULL;
double NominalWidth = 0.0;
double AvWidth = 0.0;
double GapCov = 0.0;
double MaxGap = 0.0;
double Score = 0.0;
MIL.MbufRestore(IMAGE_FILE_TRAINING, MilSystem, ref MilImageTraining);
MIL.MbufRestore(IMAGE_FILE_TARGET, MilSystem, ref MilImageTarget);
MIL.MdispSelect(MilDisplay, MilImageTraining);
MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref MilGraList);
MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, MilGraList);
Console.Write("\nFIXTURED BEAD INSPECTION:\n");
Console.Write("-------------------------\n\n");
Console.Write("This program performs a bead inspection on a mechanical part.\n");
Console.Write("In the first step, a bead template context is trained using an ");
Console.Write("image.\nIn the second step, a mechanical part, at an arbitrary ");
Console.Write("angle and with\na defective bead, is inspected.\n");
Console.Write("Press <Enter> to continue.\n\n");
Console.ReadKey();
MIL.MbeadAlloc(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, ref MilBeadContext);
MIL.MbeadAllocResult(MilSystem, MIL.M_DEFAULT, ref MilBeadResult);
MIL.MbeadTemplate(MilBeadContext, MIL.M_ADD, MIL.M_DEFAULT, MIL.M_TEMPLATE_LABEL(1),
NUMBER_OF_TRAINING_POINTS, TrainingPointsX, TrainingPointsY, MIL.M_NULL, MIL.M_DEFAULT);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TEMPLATE_INPUT_UNITS, MIL.M_WORLD);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_ANGLE_ACCURACY_MAX_DEVIATION, MAX_ANGLE_CORRECTION_VALUE);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_OFFSET_MAX, MAX_DEVIATION_OFFSET_VALUE);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_WIDTH_DELTA_NEG, WIDTH_DELTA_NEG_VALUE);
MIL.MgraColor(MIL.M_DEFAULT, USER_TEMPLATE_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadContext, MilGraList, MIL.M_DRAW_POSITION_POLYLINE,
MIL.M_USER, MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, USER_POSITION_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadContext, MilGraList, MIL.M_DRAW_POSITION,
MIL.M_USER, MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
Console.Write("The initial points specified by the user (in red) are\n");
Console.Write("used to train the bead information from an image.\n");
Console.Write("Press <Enter> to continue.\n\n");
Console.ReadKey();
MIL.McalUniform(MilImageTraining, 0, 0, 1, 1, 0, MIL.M_DEFAULT);
MIL.MbeadTrain(MilBeadContext, MilImageTraining, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, TRAINED_BEAD_WIDTH_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadContext, MilGraList, MIL.M_DRAW_WIDTH,
MIL.M_TRAINED, MIL.M_TEMPLATE_LABEL(1), MIL.M_ALL, MIL.M_DEFAULT);
MIL.MbeadInquire(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TRAINED_WIDTH_NOMINAL, ref NominalWidth);
Console.Write("The template has been trained and is displayed in orange.\n");
Console.Write("Its nominal trained width is {0:#.##} pixels.\n\n", NominalWidth);
MIL.MmodAlloc(MilSystem, MIL.M_GEOMETRIC, MIL.M_DEFAULT, ref MilModelFinderContext);
MIL.MmodAllocResult(MilSystem, MIL.M_DEFAULT, ref MilModelFinderResult);
MIL.MmodDefine(MilModelFinderContext, MIL.M_IMAGE, MilImageTraining,
MODEL_ORIGIN_X, MODEL_ORIGIN_Y, MODEL_SIZE_X, MODEL_SIZE_Y);
MIL.MmodPreprocess(MilModelFinderContext, MIL.M_DEFAULT);
MIL.McalAlloc(MilSystem, MIL.M_FIXTURING_OFFSET, MIL.M_DEFAULT, ref MilFixturingOffset);
MIL.McalFixture(MIL.M_NULL, MilFixturingOffset, MIL.M_LEARN_OFFSET, MIL.M_MODEL_MOD,
MilModelFinderContext, 0, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, MODEL_FINDER_COLOR);
MIL.MmodDraw(MIL.M_DEFAULT, MilModelFinderContext, MilGraList, MIL.M_DRAW_BOX + MIL.M_DRAW_POSITION,
MIL.M_DEFAULT, MIL.M_ORIGINAL);
Console.Write("A Model Finder model (in green) is also defined to\n");
Console.Write("further fixture the bead verification operation.\n");
Console.Write("Press <Enter> to continue.\n\n");
Console.ReadKey();
MIL.MgraClear(MIL.M_DEFAULT, MilGraList);
MIL.MdispSelect(MilDisplay, MilImageTarget);
MIL.MmodFind(MilModelFinderContext, MilImageTarget, MilModelFinderResult);
MIL.MgraColor(MIL.M_DEFAULT, MODEL_FINDER_COLOR);
MIL.MmodDraw(MIL.M_DEFAULT, MilModelFinderResult, MilGraList, MIL.M_DRAW_BOX + MIL.M_DRAW_POSITION,
MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL.McalFixture(MilImageTarget, MilFixturingOffset, MIL.M_MOVE_RELATIVE, MIL.M_RESULT_MOD,
MilModelFinderResult, 0, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, COORDINATE_SYSTEM_COLOR);
MIL.McalDraw(MIL.M_DEFAULT, MIL.M_NULL, MilGraList, MIL.M_DRAW_RELATIVE_COORDINATE_SYSTEM,
MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL.MbeadVerify(MilBeadContext, MilImageTarget, MilBeadResult, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, RESULT_SEARCH_BOX_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadResult, MilGraList, MIL.M_DRAW_SEARCH_BOX, MIL.M_ALL,
MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
Console.Write("The mechanical part's position and angle (in green) were ");
Console.Write("located\nusing Model Finder, and the bead's search boxes ");
Console.Write("(in cyan) were\npositioned accordingly.\n");
Console.Write("Press <Enter> to continue.\n\n");
Console.ReadKey();
MIL.MgraClear(MIL.M_DEFAULT, MilGraList);
MIL.MgraColor(MIL.M_DEFAULT, COORDINATE_SYSTEM_COLOR);
MIL.McalDraw(MIL.M_DEFAULT, MIL.M_NULL, MilGraList, MIL.M_DRAW_RELATIVE_COORDINATE_SYSTEM,
MIL.M_DEFAULT, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, PASS_BEAD_WIDTH_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadResult, MilGraList, MIL.M_DRAW_WIDTH, MIL.M_PASS,
MIL.M_TEMPLATE_LABEL(1), MIL.M_ALL, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, FAIL_NOT_FOUND_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadResult, MilGraList, MIL.M_DRAW_SEARCH_BOX,
MIL.M_FAIL_NOT_FOUND, MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, FAIL_SMALL_WIDTH_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadResult, MilGraList, MIL.M_DRAW_SEARCH_BOX,
MIL.M_FAIL_WIDTH_MIN, MIL.M_TEMPLATE_LABEL(1), MIL.M_ALL, MIL.M_DEFAULT);
MIL.MbeadGetResult(MilBeadResult, MIL.M_TEMPLATE_LABEL(1), MIL.M_GENERAL, MIL.M_SCORE, ref Score);
MIL.MbeadGetResult(MilBeadResult, MIL.M_TEMPLATE_LABEL(1), MIL.M_GENERAL, MIL.M_GAP_COVERAGE, ref GapCov);
MIL.MbeadGetResult(MilBeadResult, MIL.M_TEMPLATE_LABEL(1), MIL.M_GENERAL, MIL.M_WIDTH_AVERAGE, ref AvWidth);
MIL.MbeadGetResult(MilBeadResult, MIL.M_TEMPLATE_LABEL(1), MIL.M_GENERAL, MIL.M_GAP_MAX_LENGTH, ref MaxGap);
Console.Write("The bead 'has been inspected:\n");
Console.Write(" -Passing bead sections (green) cover {0:0.00}% of the bead\n", Score);
Console.Write(" -Missing bead sections (red) cover {0:0.00}% of the bead\n", GapCov);
Console.Write(" -Sections outside the specified width tolerances are drawn in orange\n");
Console.Write(" -The bead's average width is {0:0.00} pixels\n", AvWidth);
Console.Write(" -The bead's longest gap section is {0:0.00} pixels\n\n", MaxGap);
Console.Write("Press <Enter> to continue.\n");
Console.ReadKey();
MIL.MmodFree(MilModelFinderContext);
MIL.MmodFree(MilModelFinderResult);
MIL.MbeadFree(MilBeadContext);
MIL.MbeadFree(MilBeadResult);
MIL.McalFree(MilFixturingOffset);
MIL.MbufFree(MilImageTraining);
MIL.MbufFree(MilImageTarget);
MIL.MgraFree(MilGraList);
}
private static readonly string CAP_FILE_TARGET = MIL.M_IMAGE_PATH + "Cap.mim";
private const double CIRCLE_CENTER_X = 330.0;
private const double CIRCLE_CENTER_Y = 230.0;
private const double CIRCLE_RADIUS = 120.0;
private const double EDGE_THRESHOLD_VALUE = 25.0;
private const double MAX_CONTOUR_DEVIATION_OFFSET = 5.0;
private const double MAX_CONTOUR_FOUND_OFFSET = 25.0;
private static void PredefinedBeadExample(MIL_ID MilSystem, MIL_ID MilDisplay)
{
MIL_ID MilOverlayImage = MIL.M_NULL;
MIL_ID MilImageTarget = MIL.M_NULL;
MIL_ID MilBeadContext = MIL.M_NULL;
MIL_ID MilBeadResult = MIL.M_NULL;
double MaximumOffset = 0.0;
MIL.MbufRestore(CAP_FILE_TARGET, MilSystem, ref MilImageTarget);
MIL.MdispSelect(MilDisplay, MilImageTarget);
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY, MIL.M_ENABLE);
MIL.MdispInquire(MilDisplay, MIL.M_OVERLAY_ID, ref MilOverlayImage);
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_TRANSPARENT_COLOR);
Console.Write("\nPREDEFINED BEAD INSPECTION:\n");
Console.Write("---------------------------\n\n");
Console.Write("This program performs a bead inspection of a bottle\n");
Console.Write("cap's contour using a predefined circular bead.\n");
Console.Write("Press <Enter> to continue.\n\n");
Console.ReadKey();
MIL.MbeadAlloc(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, ref MilBeadContext);
MIL.MbeadAllocResult(MilSystem, MIL.M_DEFAULT, ref MilBeadResult);
MIL.MbeadTemplate(MilBeadContext, MIL.M_ADD, MIL.M_BEAD_EDGE, MIL.M_TEMPLATE_LABEL(1),
0, MIL.M_NULL, MIL.M_NULL, MIL.M_NULL, MIL.M_DEFAULT);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TRAINING_PATH, MIL.M_CIRCLE);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TEMPLATE_CIRCLE_CENTER_X, CIRCLE_CENTER_X);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TEMPLATE_CIRCLE_CENTER_Y, CIRCLE_CENTER_Y);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TEMPLATE_CIRCLE_RADIUS, CIRCLE_RADIUS);
MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_THRESHOLD_VALUE, EDGE_THRESHOLD_VALUE);
MIL.MbeadControl(MilBeadContext, MIL.M_ALL, MIL.M_WIDTH_NOMINAL_MODE, MIL.M_USER_DEFINED);
MIL.MbeadControl(MilBeadContext, MIL.M_ALL, MIL.M_FAIL_WARNING_OFFSET, MAX_CONTOUR_FOUND_OFFSET);
MIL.MbeadControl(MilBeadContext, MIL.M_ALL, MIL.M_OFFSET_MAX, MAX_CONTOUR_DEVIATION_OFFSET);
MIL.MgraColor(MIL.M_DEFAULT, USER_TEMPLATE_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadContext, MilOverlayImage, MIL.M_DRAW_POSITION,
MIL.M_USER, MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
MIL.MbeadTrain(MilBeadContext, MIL.M_NULL, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, TRAINED_BEAD_WIDTH_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadContext, MilOverlayImage, MIL.M_DRAW_SEARCH_BOX,
MIL.M_TRAINED, MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
Console.Write("A circular template that was parametrically defined by the user\n");
Console.Write("is displayed (in cyan). The template has been trained and the resulting\n");
Console.Write("search is displayed (in orange).\n");
Console.Write("Press <Enter> to continue.\n\n");
Console.ReadKey();
MIL.MbeadVerify(MilBeadContext, MilImageTarget, MilBeadResult, MIL.M_DEFAULT);
MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_TRANSPARENT_COLOR);
MIL.MgraColor(MIL.M_DEFAULT, PASS_BEAD_POSITION_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadResult, MilOverlayImage, MIL.M_DRAW_POSITION, MIL.M_PASS,
MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
MIL.MgraColor(MIL.M_DEFAULT, FAIL_EDGE_OFFSET_COLOR);
MIL.MbeadDraw(MIL.M_DEFAULT, MilBeadResult, MilOverlayImage, MIL.M_DRAW_POSITION, MIL.M_FAIL_OFFSET,
MIL.M_ALL, MIL.M_ALL, MIL.M_DEFAULT);
MIL.MbeadGetResult(MilBeadResult, MIL.M_TEMPLATE_LABEL(1), MIL.M_GENERAL, MIL.M_OFFSET_MAX, ref MaximumOffset);
Console.Write("The bottle cap shape has been inspected:\n");
Console.Write(" -Sections outside the specified offset tolerance are drawn in red\n");
Console.Write(" -The maximum offset value is {0:0.00} pixels.\n\n", MaximumOffset);
Console.Write("Press <Enter> to terminate.\n");
Console.ReadKey();
MIL.MbeadFree(MilBeadContext);
MIL.MbeadFree(MilBeadResult);
MIL.MbufFree(MilImageTarget);
}
}
}