Esempio n. 1
0
        private static void FixturedBeadExample(MIL_ID MilSystem, MIL_ID MilDisplay)
        {
            MIL_ID MilGraList            = MIL.M_NULL;  // Graphic list identifier.
            MIL_ID MilImageTraining      = MIL.M_NULL;  // Image buffer identifier.
            MIL_ID MilImageTarget        = MIL.M_NULL;  // Image buffer identifier.
            MIL_ID MilBeadContext        = MIL.M_NULL;  // Bead context identifier.
            MIL_ID MilBeadResult         = MIL.M_NULL;  // Bead result identifier.
            MIL_ID MilModelFinderContext = MIL.M_NULL;  // Model finder context identifier.
            MIL_ID MilModelFinderResult  = MIL.M_NULL;  // Model finder result identifier.
            MIL_ID MilFixturingOffset    = MIL.M_NULL;  // Fixturing offset identifier.

            double NominalWidth = 0.0;                  // Nominal width result value.
            double AvWidth      = 0.0;                  // Average width result value.
            double GapCov       = 0.0;                  // Gap coverage result value.
            double MaxGap       = 0.0;                  // Maximum gap result value.
            double Score        = 0.0;                  // Bead score result value.

            // Restore source images into an automatically allocated image buffers.
            MIL.MbufRestore(IMAGE_FILE_TRAINING, MilSystem, ref MilImageTraining);
            MIL.MbufRestore(IMAGE_FILE_TARGET, MilSystem, ref MilImageTarget);

            // Display the training image buffer.
            MIL.MdispSelect(MilDisplay, MilImageTraining);

            // Allocate a graphic list to hold the subpixel annotations to draw.
            MIL.MgraAllocList(MilSystem, MIL.M_DEFAULT, ref MilGraList);

            // Associate the graphic list to the display for annotations.
            MIL.MdispControl(MilDisplay, MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, MilGraList);

            // Original template image.
            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();

            // Allocate a MIL bead context.
            MIL.MbeadAlloc(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, ref MilBeadContext);

            // Allocate a MIL bead result.
            MIL.MbeadAllocResult(MilSystem, MIL.M_DEFAULT, ref MilBeadResult);

            // Add bead templates
            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);

            // Set template input units to world units
            MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_TEMPLATE_INPUT_UNITS, MIL.M_WORLD);

            // Set the bead 'edge type' search properties
            MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_ANGLE_ACCURACY_MAX_DEVIATION, MAX_ANGLE_CORRECTION_VALUE);

            // Set the maximum valid bead deformation.
            MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_OFFSET_MAX, MAX_DEVIATION_OFFSET_VALUE);

            // Set the valid bead stripe minimum width criterion.
            MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_WIDTH_DELTA_NEG, WIDTH_DELTA_NEG_VALUE);

            // Display the bead polyline.
            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);

            // Display the bead training points.
            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);

            // Pause to show the template image and user points.
            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();

            // Set a 1:1 calibration to the training image.
            MIL.McalUniform(MilImageTraining, 0, 0, 1, 1, 0, MIL.M_DEFAULT);

            // Train the bead context.
            MIL.MbeadTrain(MilBeadContext, MilImageTraining, MIL.M_DEFAULT);

            // Display the trained bead.
            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);

            // Retrieve the trained nominal width.
            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);

            // Define model to further fixture the bead template.
            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);

            // Preprocess the model.
            MIL.MmodPreprocess(MilModelFinderContext, MIL.M_DEFAULT);

            // Allocate a fixture object.
            MIL.McalAlloc(MilSystem, MIL.M_FIXTURING_OFFSET, MIL.M_DEFAULT, ref MilFixturingOffset);

            // Learn the relative offset of the model.
            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);

            // Display the model.
            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();

            // Clear the overlay annotation.
            MIL.MgraClear(MIL.M_DEFAULT, MilGraList);

            // Display the target image buffer.
            MIL.MdispSelect(MilDisplay, MilImageTarget);

            // Find the location of the fixture using Model Finder.
            MIL.MmodFind(MilModelFinderContext, MilImageTarget, MilModelFinderResult);

            // Display the found model occurrence.
            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);

            // Apply fixture offset to the target image.
            MIL.McalFixture(MilImageTarget, MilFixturingOffset, MIL.M_MOVE_RELATIVE, MIL.M_RESULT_MOD,
                            MilModelFinderResult, 0, MIL.M_DEFAULT, MIL.M_DEFAULT, MIL.M_DEFAULT);

            // Display the relative coordinate system.
            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);

            // Perform the inspection of the bead in the fixtured target image.
            MIL.MbeadVerify(MilBeadContext, MilImageTarget, MilBeadResult, MIL.M_DEFAULT);

            // Display the result search boxes.
            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();

            // Clear the overlay annotation.
            MIL.MgraClear(MIL.M_DEFAULT, MilGraList);

            // Display the moved relative coordinate system.
            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);

            // Display the pass bead sections.
            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);

            // Display the missing bead sections.
            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);

            // Display bead sections which do not meet the minimum width criteria.
            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);

            // Retrieve and display general bead results.
            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);

            // Pause to show the result.
            Console.Write("Press <Enter> to continue.\n");
            Console.ReadKey();

            // Free all allocations.
            MIL.MmodFree(MilModelFinderContext);
            MIL.MmodFree(MilModelFinderResult);
            MIL.MbeadFree(MilBeadContext);
            MIL.MbeadFree(MilBeadResult);
            MIL.McalFree(MilFixturingOffset);
            MIL.MbufFree(MilImageTraining);
            MIL.MbufFree(MilImageTarget);
            MIL.MgraFree(MilGraList);
        }
Esempio n. 2
0
        private static void PredefinedBeadExample(MIL_ID MilSystem, MIL_ID MilDisplay)
        {
            MIL_ID MilOverlayImage = MIL.M_NULL; // Overlay buffer identifier.
            MIL_ID MilImageTarget  = MIL.M_NULL; // Image buffer identifier.
            MIL_ID MilBeadContext  = MIL.M_NULL; // Bead context identifier.
            MIL_ID MilBeadResult   = MIL.M_NULL; // Bead result identifier.

            double MaximumOffset = 0.0;          // Maximum offset result value.

            // Restore target image into an automatically allocated image buffers.
            MIL.MbufRestore(CAP_FILE_TARGET, MilSystem, ref MilImageTarget);

            // Display the training image buffer.
            MIL.MdispSelect(MilDisplay, MilImageTarget);

            // Prepare the overlay for annotations.
            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);

            // Original template image.
            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();

            // Allocate a MIL bead context.
            MIL.MbeadAlloc(MilSystem, MIL.M_DEFAULT, MIL.M_DEFAULT, ref MilBeadContext);

            // Allocate a MIL bead result.
            MIL.MbeadAllocResult(MilSystem, MIL.M_DEFAULT, ref MilBeadResult);

            // Add the bead templates.
            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);

            // Set the bead shape properties.
            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);

            // Set the edge threshold value to extract the object shape.
            MIL.MbeadControl(MilBeadContext, MIL.M_TEMPLATE_LABEL(1), MIL.M_THRESHOLD_VALUE, EDGE_THRESHOLD_VALUE);

            // Using the default fixed user defined nominal edge width.
            MIL.MbeadControl(MilBeadContext, MIL.M_ALL, MIL.M_WIDTH_NOMINAL_MODE, MIL.M_USER_DEFINED);

            // Set the maximal expected contour deformation.
            MIL.MbeadControl(MilBeadContext, MIL.M_ALL, MIL.M_FOUND_OFFSET_MAX, MAX_CONTOUR_FOUND_OFFSET);

            // Set the maximum valid bead deformation.
            MIL.MbeadControl(MilBeadContext, MIL.M_ALL, MIL.M_OFFSET_MAX, MAX_CONTOUR_DEVIATION_OFFSET);

            // Display the bead in the overlay image.
            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);

            // The bead template is entirely defined and is trained without sample image.
            MIL.MbeadTrain(MilBeadContext, MIL.M_NULL, MIL.M_DEFAULT);

            // Display the trained bead.
            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);

            // Pause to show the template image and user points.
            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();

            // Perform the inspection of the bead in the fixtured target image.
            MIL.MbeadVerify(MilBeadContext, MilImageTarget, MilBeadResult, MIL.M_DEFAULT);

            // Clear the overlay annotation.
            MIL.MdispControl(MilDisplay, MIL.M_OVERLAY_CLEAR, MIL.M_TRANSPARENT_COLOR);

            // Display the pass bead sections.
            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);

            // Display the offset bead sections.
            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);

            // Retrieve and display general bead results.
            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);

            // Pause to show the result.
            Console.Write("Press <Enter> to terminate.\n");
            Console.ReadKey();

            // Free all allocations.
            MIL.MbeadFree(MilBeadContext);
            MIL.MbeadFree(MilBeadResult);
            MIL.MbufFree(MilImageTarget);
        }