예제 #1
0
    // Main procedure
    private void action()
    {
        // Local iconic variables

        HObject ho_Image, ho_Rectangle, ho_ImageReduced;
        HObject ho_ModelContours, ho_ShowContours, ho_ModelContour;
        HObject ho_MeasureContour, ho_ResultContours = null, ho_Contour = null;
        HObject ho_UsedEdges = null, ho_Cross = null;

        // Local control variables

        HTuple hv_ImageFiles = null, hv_Width = null;
        HTuple hv_Height = null, hv_WindowHandle = new HTuple();
        HTuple hv_Area = null, hv_RowRefer = null, hv_ColRefer = null;
        HTuple hv_ModelID = null, hv_HomMat2D = null, hv_MetrologyHandle = null;
        HTuple hv_Line = null, hv_LineIndices = null, hv_Row = null;
        HTuple hv_Column = null, hv_i = null, hv_RowFound = new HTuple();
        HTuple hv_ColFound = new HTuple(), hv_AngleFound = new HTuple();
        HTuple hv_ScoreFound = new HTuple(), hv_UsedRow = new HTuple();
        HTuple hv_UsedColumn = new HTuple(), hv_Angle = new HTuple();
        HTuple hv_Degree = new HTuple();

        // Initialize local and output iconic variables
        HOperatorSet.GenEmptyObj(out ho_Image);
        HOperatorSet.GenEmptyObj(out ho_Rectangle);
        HOperatorSet.GenEmptyObj(out ho_ImageReduced);
        HOperatorSet.GenEmptyObj(out ho_ModelContours);
        HOperatorSet.GenEmptyObj(out ho_ShowContours);
        HOperatorSet.GenEmptyObj(out ho_ModelContour);
        HOperatorSet.GenEmptyObj(out ho_MeasureContour);
        HOperatorSet.GenEmptyObj(out ho_ResultContours);
        HOperatorSet.GenEmptyObj(out ho_Contour);
        HOperatorSet.GenEmptyObj(out ho_UsedEdges);
        HOperatorSet.GenEmptyObj(out ho_Cross);
        //dev_close_window(...);
        //**读取图片所在路径**
        list_image_files("Image", "default", new HTuple(), out hv_ImageFiles);
        ho_Image.Dispose();
        HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles.TupleSelect(0));
        HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
        //dev_open_window(...);
        HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin");
        HOperatorSet.SetLineWidth(hv_ExpDefaultWinHandle, 2);
        HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);

        //创建模板
        ho_Rectangle.Dispose();
        HOperatorSet.GenRectangle1(out ho_Rectangle, 400, 570, 550, 700);
        ho_ImageReduced.Dispose();
        HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);
        HOperatorSet.AreaCenter(ho_ImageReduced, out hv_Area, out hv_RowRefer, out hv_ColRefer);
        HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-10)).TupleRad()
                                      , (new HTuple(20)).TupleRad(), "auto", "auto", "use_polarity", "auto", "auto",
                                      out hv_ModelID);
        ho_ModelContours.Dispose();
        HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID, 1);
        HOperatorSet.VectorAngleToRigid(0, 0, 0, hv_RowRefer, hv_ColRefer, 0, out hv_HomMat2D);
        ho_ShowContours.Dispose();
        HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ShowContours, hv_HomMat2D);
        HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
        HOperatorSet.DispObj(ho_ShowContours, hv_ExpDefaultWinHandle);

        //创建测量模板
        HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandle);
        HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandle, hv_Width, hv_Height);

        //从左向右在矩形上边缘画一条直线*
        hv_Line    = new HTuple();
        hv_Line[0] = 445;
        hv_Line[1] = 600;
        hv_Line[2] = 445;
        hv_Line[3] = 670;
        HOperatorSet.AddMetrologyObjectGeneric(hv_MetrologyHandle, "line", hv_Line, 25,
                                               5, 1, 30, new HTuple(), new HTuple(), out hv_LineIndices);
        ho_ModelContour.Dispose();
        HOperatorSet.GetMetrologyObjectModelContour(out ho_ModelContour, hv_MetrologyHandle,
                                                    "all", 1.5);
        ho_MeasureContour.Dispose();
        HOperatorSet.GetMetrologyObjectMeasures(out ho_MeasureContour, hv_MetrologyHandle,
                                                "all", "all", out hv_Row, out hv_Column);

        //把测量的位置和模板的位置关联起来
        HOperatorSet.SetMetrologyModelParam(hv_MetrologyHandle, "reference_system", ((hv_RowRefer.TupleConcat(
                                                                                          hv_ColRefer))).TupleConcat(0));
        HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_LineIndices, "measure_transition",
                                             "positive");
        HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_LineIndices, "measure_select",
                                             "first");
        HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_LineIndices, "measure_length1",
                                             25);
        HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_LineIndices, "measure_length2",
                                             5);
        HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_LineIndices, "measure_threshold",
                                             15);
        HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_LineIndices, "min_score",
                                             0.3);

        for (hv_i = 0; (int)hv_i <= (int)((new HTuple(hv_ImageFiles.TupleLength())) - 1); hv_i = (int)hv_i + 1)
        {
            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles.TupleSelect(hv_i));
            HOperatorSet.FindShapeModel(ho_Image, hv_ModelID, (new HTuple(-10)).TupleRad()
                                        , (new HTuple(20)).TupleRad(), 0.3, 1, 0.5, "least_squares", 0, 0.75, out hv_RowFound,
                                        out hv_ColFound, out hv_AngleFound, out hv_ScoreFound);
            if ((int)(new HTuple((new HTuple(1)).TupleEqual(new HTuple(hv_RowFound.TupleLength()
                                                                       )))) != 0)
            {
                HOperatorSet.HomMat2dIdentity(out hv_HomMat2D);
                HOperatorSet.HomMat2dRotate(hv_HomMat2D, hv_AngleFound, 0, 0, out hv_HomMat2D);
                HOperatorSet.HomMat2dTranslate(hv_HomMat2D, hv_RowFound - 0, hv_ColFound - 0,
                                               out hv_HomMat2D);
                ho_ResultContours.Dispose();
                HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ResultContours,
                                                   hv_HomMat2D);
                HOperatorSet.AlignMetrologyModel(hv_MetrologyHandle, hv_RowFound, hv_ColFound,
                                                 hv_AngleFound);
                //应用测量
                HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);
                //获取结果
                ho_Contour.Dispose();
                HOperatorSet.GetMetrologyObjectMeasures(out ho_Contour, hv_MetrologyHandle,
                                                        "all", "all", out hv_Row, out hv_Column);
                HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "used_edges",
                                                      "row", out hv_UsedRow);
                HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "used_edges",
                                                      "column", out hv_UsedColumn);
                ho_UsedEdges.Dispose();
                HOperatorSet.GenCrossContourXld(out ho_UsedEdges, hv_UsedRow, hv_UsedColumn,
                                                10, (new HTuple(45)).TupleRad());
                ho_ResultContours.Dispose();
                HOperatorSet.GetMetrologyObjectResultContour(out ho_ResultContours, hv_MetrologyHandle,
                                                             "all", "all", 1.5);
                ho_Cross.Dispose();
                HOperatorSet.GenCrossContourXld(out ho_Cross, hv_RowFound, hv_ColFound, 40,
                                                hv_AngleFound);
                HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
                HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
                HOperatorSet.DispObj(ho_Cross, hv_ExpDefaultWinHandle);
                HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
                HOperatorSet.DispObj(ho_ResultContours, hv_ExpDefaultWinHandle);

                HOperatorSet.AngleLx(hv_UsedRow.TupleSelect(1), hv_UsedColumn.TupleSelect(
                                         1), hv_UsedRow.TupleSelect(6), hv_UsedColumn.TupleSelect(6), out hv_Angle);
                HOperatorSet.TupleDeg(hv_Angle, out hv_Degree);
                disp_message(hv_ExpDefaultWinHandle, "定位成功!", "window", 12, 12, "black",
                             "true");

                disp_message(hv_ExpDefaultWinHandle, ((((new HTuple("定位区域中心坐标") + "(") + hv_RowFound) + new HTuple(",")) + hv_ColFound) + ")",
                             "window", 32, 12, "black", "true");
                HOperatorSet.TupleDeg(hv_AngleFound, out hv_Degree);
                disp_message(hv_ExpDefaultWinHandle, ("相对模板角度为" + hv_Degree) + "°", "window",
                             52, 12, "black", "true");
            }
            else
            {
                disp_message(hv_ExpDefaultWinHandle, "没有找到模板", "window", hv_Row, hv_Column,
                             "black", "true");
            }
            HDevelopStop();
        }
        HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);
        HOperatorSet.ClearShapeModel(hv_ModelID);


        ho_Image.Dispose();
        ho_Rectangle.Dispose();
        ho_ImageReduced.Dispose();
        ho_ModelContours.Dispose();
        ho_ShowContours.Dispose();
        ho_ModelContour.Dispose();
        ho_MeasureContour.Dispose();
        ho_ResultContours.Dispose();
        ho_Contour.Dispose();
        ho_UsedEdges.Dispose();
        ho_Cross.Dispose();
    }
    // Main procedure
    private void action()
    {
        // Local iconic variables

        HObject ho_Image, ho_Rectangle, ho_ImageReduced;
        HObject ho_Region, ho_ResultContour = null, ho_ContCircle = null;
        HObject ho_Contour = null, ho_Cross = null;

        // Local control variables

        HTuple hv_WindowHandle = null, hv_Width = null;
        HTuple hv_Height = null, hv_MetrologyHandle = null, hv_LineRow1 = null;
        HTuple hv_LineColumn1 = null, hv_LineRow2 = null, hv_LineColumn2 = null;
        HTuple hv_Tolerance = null, hv_Index1 = null, hv_Rows = null;
        HTuple hv_Columns = null, hv_I = null, hv_LineParameter = new HTuple();
        HTuple hv_Angle = new HTuple(), hv_Row = new HTuple();
        HTuple hv_Column = new HTuple(), hv_IsOverlapping1 = new HTuple();
        HTuple hv_Orientation1 = new HTuple(), hv_Orientation2 = new HTuple();
        HTuple hv_MRow = new HTuple(), hv_MColumn = new HTuple();

        // Initialize local and output iconic variables
        HOperatorSet.GenEmptyObj(out ho_Image);
        HOperatorSet.GenEmptyObj(out ho_Rectangle);
        HOperatorSet.GenEmptyObj(out ho_ImageReduced);
        HOperatorSet.GenEmptyObj(out ho_Region);
        HOperatorSet.GenEmptyObj(out ho_ResultContour);
        HOperatorSet.GenEmptyObj(out ho_ContCircle);
        HOperatorSet.GenEmptyObj(out ho_Contour);
        HOperatorSet.GenEmptyObj(out ho_Cross);
        try
        {
            //This program shows how to detect the edges of a diamond
            //with subpixel accuracy and calculate the angle between them.
            //
            //In contrast to the example measure_diamond.hdev,
            //this example uses a metrology model to measure the edges.
            //
            //First, the top of the diamond is roughly segmented
            //to align the metrology objects.
            //Then, the metrology model is applied and returns the
            //parameters of the fitted lines.
            //Finally, the angle between the two lines is computed.
            //
            //Display initializations
            dev_update_off();
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.CloseWindow(HDevWindowStack.Pop());
            }
            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, "diamond/diamond_01");
            dev_open_window_fit_image(ho_Image, 0, 0, -1, -1, out hv_WindowHandle);
            set_display_font(hv_WindowHandle, 16, "mono", "true", "false");
            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
            //
            //Create the metrology model data structure
            HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandle);
            //The image size is set in advance to speed up the
            //first call of apply_metrology_model.
            HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandle, hv_Width, hv_Height);
            //Define the parameters of the metrology line objects
            hv_LineRow1       = new HTuple();
            hv_LineRow1[0]    = 155;
            hv_LineRow1[1]    = 155;
            hv_LineColumn1    = new HTuple();
            hv_LineColumn1[0] = 400;
            hv_LineColumn1[1] = 400;
            hv_LineRow2       = new HTuple();
            hv_LineRow2[0]    = 290;
            hv_LineRow2[1]    = 290;
            hv_LineColumn2    = new HTuple();
            hv_LineColumn2[0] = 230;
            hv_LineColumn2[1] = 570;
            hv_Tolerance      = 20;
            //
            //Create two metrology line objects and set parameters
            HOperatorSet.AddMetrologyObjectLineMeasure(hv_MetrologyHandle, hv_LineRow1,
                                                       hv_LineColumn1, hv_LineRow2, hv_LineColumn2, hv_Tolerance, 10, 1, 20, new HTuple(),
                                                       new HTuple(), out hv_Index1);
            //Create region of interest for the alignment
            ho_Rectangle.Dispose();
            HOperatorSet.GenRectangle1(out ho_Rectangle, (hv_LineRow1.TupleSelect(0)) - 40,
                                       (hv_LineColumn1.TupleSelect(0)) - 50, (hv_LineRow1.TupleSelect(0)) + 20, (hv_LineColumn1.TupleSelect(
                                                                                                                     0)) + 50);
            //Change the reference coordinate system in which the
            //metrology model is given to be situated at the top of the diamond
            ho_ImageReduced.Dispose();
            HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);
            ho_Region.Dispose();
            HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 128, 255);
            HOperatorSet.GetRegionPoints(ho_Region, out hv_Rows, out hv_Columns);
            HOperatorSet.SetMetrologyModelParam(hv_MetrologyHandle, "reference_system",
                                                ((((hv_Rows.TupleSelect(0))).TupleConcat(hv_Columns.TupleSelect(0)))).TupleConcat(
                                                    0));
            //
            //Main loop
            //
            for (hv_I = 1; (int)hv_I <= 5; hv_I = (int)hv_I + 1)
            {
                ho_Image.Dispose();
                HOperatorSet.ReadImage(out ho_Image, "diamond/diamond_" + (hv_I.TupleString(
                                                                               "02")));
                //Roughly segment the diamond's position
                ho_ImageReduced.Dispose();
                HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);
                ho_Region.Dispose();
                HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 128, 255);
                //Extract the top of the diamond
                HOperatorSet.GetRegionPoints(ho_Region, out hv_Rows, out hv_Columns);
                //
                //Use the top of the diamond to align the metrology model in
                //the current image
                //
                HOperatorSet.AlignMetrologyModel(hv_MetrologyHandle, hv_Rows.TupleSelect(
                                                     0), hv_Columns.TupleSelect(0), 0);
                //
                //
                //Perform the measurement for both lines in one call
                //
                HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);
                //
                //Access results
                //
                HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "result_type",
                                                      "all_param", out hv_LineParameter);
                HOperatorSet.AngleLl(hv_LineParameter.TupleSelect(0), hv_LineParameter.TupleSelect(
                                         1), hv_LineParameter.TupleSelect(2), hv_LineParameter.TupleSelect(3),
                                     hv_LineParameter.TupleSelect(4), hv_LineParameter.TupleSelect(5), hv_LineParameter.TupleSelect(
                                         6), hv_LineParameter.TupleSelect(7), out hv_Angle);
                hv_Angle = hv_Angle.TupleDeg();
                //
                //Display results
                //
                //Create line contours
                ho_ResultContour.Dispose();
                HOperatorSet.GetMetrologyObjectResultContour(out ho_ResultContour, hv_MetrologyHandle,
                                                             "all", "all", 1.5);
                HOperatorSet.IntersectionLines(hv_LineParameter.TupleSelect(0), hv_LineParameter.TupleSelect(
                                                   1), hv_LineParameter.TupleSelect(2), hv_LineParameter.TupleSelect(3),
                                               hv_LineParameter.TupleSelect(4), hv_LineParameter.TupleSelect(5), hv_LineParameter.TupleSelect(
                                                   6), hv_LineParameter.TupleSelect(7), out hv_Row, out hv_Column, out hv_IsOverlapping1);
                //Calculate the orientation of the two lines
                HOperatorSet.LineOrientation(hv_LineParameter.TupleSelect(0), hv_LineParameter.TupleSelect(
                                                 1), hv_LineParameter.TupleSelect(2), hv_LineParameter.TupleSelect(3),
                                             out hv_Orientation1);
                if ((int)(new HTuple(hv_Orientation1.TupleGreater(0))) != 0)
                {
                    hv_Orientation1 = hv_Orientation1 - ((new HTuple(180)).TupleRad());
                }
                HOperatorSet.LineOrientation(hv_LineParameter.TupleSelect(4), hv_LineParameter.TupleSelect(
                                                 5), hv_LineParameter.TupleSelect(6), hv_LineParameter.TupleSelect(7),
                                             out hv_Orientation2);
                //
                //Visualize the angle between the lines
                ho_ContCircle.Dispose();
                HOperatorSet.GenCircleContourXld(out ho_ContCircle, hv_Row, hv_Column, 100,
                                                 hv_Orientation1, hv_Orientation2, "positive", 1);
                //Get the used measure regions and the measured points
                //for visualization
                ho_Contour.Dispose();
                HOperatorSet.GetMetrologyObjectMeasures(out ho_Contour, hv_MetrologyHandle,
                                                        "all", "all", out hv_MRow, out hv_MColumn);
                ho_Cross.Dispose();
                HOperatorSet.GenCrossContourXld(out ho_Cross, hv_MRow, hv_MColumn, 6, (new HTuple(45)).TupleRad()
                                                );
                //Display everything
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetLineWidth(HDevWindowStack.GetActive(), 1);
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetColor(HDevWindowStack.GetActive(), "yellow");
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_Contour, HDevWindowStack.GetActive());
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_Cross, HDevWindowStack.GetActive());
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetLineWidth(HDevWindowStack.GetActive(), 2);
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green");
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_ResultContour, HDevWindowStack.GetActive());
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetColor(HDevWindowStack.GetActive(), "blue");
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_ContCircle, HDevWindowStack.GetActive());
                }
                disp_message(hv_WindowHandle, ("Angle = " + (hv_Angle.TupleString(".5"))) + "бу",
                             "window", 12, 12, "black", "true");
                if ((int)(new HTuple(hv_I.TupleLess(5))) != 0)
                {
                    disp_continue_message(hv_WindowHandle, "black", "true");
                }
                // stop(); only in hdevelop
            }
            //Clean up memory
            HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);
        }
        catch (HalconException HDevExpDefaultException)
        {
            ho_Image.Dispose();
            ho_Rectangle.Dispose();
            ho_ImageReduced.Dispose();
            ho_Region.Dispose();
            ho_ResultContour.Dispose();
            ho_ContCircle.Dispose();
            ho_Contour.Dispose();
            ho_Cross.Dispose();

            throw HDevExpDefaultException;
        }
        ho_Image.Dispose();
        ho_Rectangle.Dispose();
        ho_ImageReduced.Dispose();
        ho_Region.Dispose();
        ho_ResultContour.Dispose();
        ho_ContCircle.Dispose();
        ho_Contour.Dispose();
        ho_Cross.Dispose();
    }
예제 #3
0
        private void Camera3()
        {
            c2s = Module.SerializableTool.FromByFile <Module.Camera2Serializable>("cam2.sol");
            //Image Acquisition 01: Code generated by Image Acquisition 01
            hv_ImageFiles = new HTuple();
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[0] = "G:/防火砖缺陷检测/Image_20201109161631787.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[1] = "G:/防火砖缺陷检测/Image_20201109161638427.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[2] = "G:/防火砖缺陷检测/Image_20201109161641675.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[3] = "G:/防火砖缺陷检测/Image_20201109161651523.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[4] = "G:/防火砖缺陷检测/Image_20201109161654667.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[5] = "G:/防火砖缺陷检测/Image_20201109161701411.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[6] = "G:/防火砖缺陷检测/Image_20201109161704812.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[7] = "G:/防火砖缺陷检测/Image_20201109161707571.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[8] = "G:/防火砖缺陷检测/Image_20201109161715763.bmp";
            if (hv_ImageFiles == null)
            {
                hv_ImageFiles = new HTuple();
            }
            hv_ImageFiles[9] = "G:/防火砖缺陷检测/Image_20201109161720699.bmp";

            for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_ImageFiles.TupleLength()
                                                                  )) - 1); hv_Index = (int)hv_Index + 1)
            {
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    ho_Image.Dispose();
                    HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles.TupleSelect(hv_Index));
                    HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
                    HOperatorSet.SetPart(hWindow_Final1.hWindowControl.HalconWindow, 0, 0, hv_Height, hv_Width);
                }
                ho_ImageEmphasize.Dispose();

                HOperatorSet.Emphasize(ho_Image, out ho_ImageEmphasize, hv_Width, hv_Height,
                                       1);
                HOperatorSet.DispObj(ho_Image, hWindow_Final1.hWindowControl.HalconWindow);
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    HOperatorSet.FindScaledShapeModel(ho_Image, c2s.Modle, (new HTuple(0)).TupleRad()
                                                      , (new HTuple(360)).TupleRad(), 0.7, 1.3, 0.6, 0, 0.5, "none", 0, 0.3,
                                                      out hv_Row3, out hv_Column3, out hv_Angle3, out hv_Scale, out hv_Score);
                }
                HOperatorSet.TupleLength(hv_Score, out hv_Length);
                if ((int)(new HTuple(hv_Length.TupleEqual(0))) != 0)
                {
                    //disp_message(hWindow_Final1.hWindowControl.HalconWindow, "failed!!!!!!!!!!!!!!!", "window", 20,
                    //    20, "black", "true");
                    //disp_continue_message(hWindow_Final1.hWindowControl.HalconWindow, "black", "true");
                    ////wait_seconds (2)
                    //HDevelopStop();
                }
                else
                {
                    //hom_mat2d_identity (HomMat2DIdentity)
                    //hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
                    //hom_mat2d_rotate (HomMat2DTranslate, Angle, Row, Column, HomMat2DRotate)
                    //hom_mat2d_scale (HomMat2DRotate, Scale, Scale, Row, Column, HomMat2DScale)
                    //affine_trans_contour_xld (ModelContours, ModelTrans, HomMat2DScale)
                    //dev_display (ModelTrans)
                    //下面开始测量尺寸

                    HOperatorSet.AlignMetrologyModel(c2s.MetrologyHandle, hv_Row3, hv_Column3,
                                                     hv_Angle3);

                    ho_ModelContour.Dispose();
                    HOperatorSet.GetMetrologyObjectModelContour(out ho_ModelContour, c2s.MetrologyHandle,
                                                                "all", 1.5);
                    //向图像应用测量模型
                    HOperatorSet.ApplyMetrologyModel(ho_Image, c2s.MetrologyHandle);
                    //获取测量卡尺
                    ho_Contour1.Dispose();
                    HOperatorSet.GetMetrologyObjectMeasures(out ho_Contour1, c2s.MetrologyHandle,
                                                            "all", "all", out hv_Row, out hv_Column);
                    HOperatorSet.TupleLength(hv_Score, out hv_Length);
                    if ((int)(new HTuple(hv_Length.TupleEqual(0))) != 0)
                    {
                    }
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, "all", "all", "used_edges",
                                                          "row", out hv_UsedRow);
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, "all", "all", "used_edges",
                                                          "column", out hv_UsedColumn);
                    using (HDevDisposeHelper dh = new HDevDisposeHelper())
                    {
                        ho_UsedEdges.Dispose();
                        HOperatorSet.GenCrossContourXld(out ho_UsedEdges, hv_UsedRow, hv_UsedColumn,
                                                        10, (new HTuple(45)).TupleRad());
                    }
                    //提取矩形边的长度
                    hv_RectIndices = 0;
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                          "all", "result_type", "length1", out hv_Length1R);
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                          "all", "result_type", "length2", out hv_Length2R);
                    //中心坐标及角度
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                          "all", "result_type", "row", out hv_Parameter);
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                          "all", "result_type", "column", out hv_Parameter1);
                    HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                          "all", "result_type", "phi", out hv_Parameter2);
                    HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "red");
                    using (HDevDisposeHelper dh = new HDevDisposeHelper())
                    {
                        ho_Cross2.Dispose();
                        HOperatorSet.GenCrossContourXld(out ho_Cross2, hv_Parameter, hv_Parameter1,
                                                        20, (new HTuple(45)).TupleRad());
                    }
                    //提取直线
                    //get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', ParamLine1)
                    //get_metrology_object_result_contour (Contour, MetrologyHandle, 0, 'all', 1.5)
                    ho_ResultContours.Dispose();
                    HOperatorSet.GetMetrologyObjectResultContour(out ho_ResultContours, c2s.MetrologyHandle,
                                                                 "all", "all", 1.5);
                    HOperatorSet.DispObj(ho_ImageEmphasize, hWindow_Final1.hWindowControl.HalconWindow);
                    HOperatorSet.SetLineWidth(hWindow_Final1.hWindowControl.HalconWindow, 1);
                    HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "light gray");
                    HOperatorSet.DispObj(ho_Contour1, hWindow_Final1.hWindowControl.HalconWindow);
                    HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "green");
                    HOperatorSet.SetLineWidth(hWindow_Final1.hWindowControl.HalconWindow, 2);
                    HOperatorSet.DispObj(ho_ResultContours, hWindow_Final1.hWindowControl.HalconWindow);
                    HOperatorSet.SetLineWidth(hWindow_Final1.hWindowControl.HalconWindow, 1);
                    HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "white");
                    HOperatorSet.DispObj(ho_UsedEdges, hWindow_Final1.hWindowControl.HalconWindow);
                    ho_Image.Dispose();
                }
            }
            hv_ImageFiles.Dispose();
            GC.Collect();
        }
예제 #4
0
        public bool FindMark(string FileName, out double centerRow, out double centerCol, out double angle)
        {
            bool result = false;

            if (hv_ModelID == null)
            {
                GenMarkModel(out hv_ModelID, out ho_ModelContours, out hv_MetrologyHandle);
            }

            HObject ho_Image;
            HObject ho_ResultContours = null, ho_Contour = null;
            HObject ho_UsedEdges = null, ho_Cross = null;

            HTuple hv_RowFound = new HTuple(), hv_ColFound = new HTuple(), hv_AngleFound = new HTuple();
            HTuple hv_ScoreFound = new HTuple();
            HTuple hv_HomMat2D = null;
            HTuple hv_Column = null, hv_Row = null;

            HTuple hv_UsedColumn = new HTuple(), hv_UsedRow = new HTuple();
            HTuple hv_Angle = new HTuple(), hv_Degree = new HTuple();

            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_ResultContours);
            HOperatorSet.GenEmptyObj(out ho_Contour);
            HOperatorSet.GenEmptyObj(out ho_UsedEdges);
            HOperatorSet.GenEmptyObj(out ho_Cross);

            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, FileName);
            HOperatorSet.FindShapeModel(ho_Image, hv_ModelID, (new HTuple(-10)).TupleRad()
                                        , (new HTuple(20)).TupleRad(), 0.3, 1, 0.5, "least_squares", 0, 0.75, out hv_RowFound,
                                        out hv_ColFound, out hv_AngleFound, out hv_ScoreFound);
            if ((int)(new HTuple((new HTuple(1)).TupleEqual(new HTuple(hv_RowFound.TupleLength()
                                                                       )))) != 0)
            {
                HOperatorSet.HomMat2dIdentity(out hv_HomMat2D);
                HOperatorSet.HomMat2dRotate(hv_HomMat2D, hv_AngleFound, 0, 0, out hv_HomMat2D);
                HOperatorSet.HomMat2dTranslate(hv_HomMat2D, hv_RowFound - 0, hv_ColFound - 0,
                                               out hv_HomMat2D);
                ho_ResultContours.Dispose();
                HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ResultContours,
                                                   hv_HomMat2D);

                HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
                HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "red");
                HOperatorSet.DispObj(ho_ResultContours, hv_ExpDefaultWinHandle);

                HOperatorSet.AlignMetrologyModel(hv_MetrologyHandle, hv_RowFound, hv_ColFound,
                                                 hv_AngleFound);
                //应用测量
                HOperatorSet.ApplyMetrologyModel(ho_Image, hv_MetrologyHandle);
                //获取结果
                ho_Contour.Dispose();
                HOperatorSet.GetMetrologyObjectMeasures(out ho_Contour, hv_MetrologyHandle,
                                                        "all", "all", out hv_Row, out hv_Column);

                HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "used_edges",
                                                      "row", out hv_UsedRow);
                HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "used_edges",
                                                      "column", out hv_UsedColumn);
                ho_UsedEdges.Dispose();
                HOperatorSet.GenCrossContourXld(out ho_UsedEdges, hv_UsedRow, hv_UsedColumn,
                                                10, (new HTuple(45)).TupleRad());
                ho_ResultContours.Dispose();
                HOperatorSet.GetMetrologyObjectResultContour(out ho_ResultContours, hv_MetrologyHandle,
                                                             "all", "all", 1.5);


                ho_Cross.Dispose();
                HOperatorSet.GenCrossContourXld(out ho_Cross, hv_RowFound, hv_ColFound, 40,
                                                hv_AngleFound);
                //HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
                //HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
                //HOperatorSet.DispObj(ho_Cross, hv_ExpDefaultWinHandle);
                //HOperatorSet.SetColor(hv_ExpDefaultWinHandle, "green");
                //HOperatorSet.DispObj(ho_ResultContours, hv_ExpDefaultWinHandle);

                HOperatorSet.AngleLx(hv_UsedRow.TupleSelect(1), hv_UsedColumn.TupleSelect(
                                         1), hv_UsedRow.TupleSelect(6), hv_UsedColumn.TupleSelect(6), out hv_Angle);
                HOperatorSet.TupleDeg(hv_Angle, out hv_Degree);
                //disp_message(hv_ExpDefaultWinHandle, "定位成功!", "window", 12, 12, "black",
                //    "true");


                disp_message(hv_ExpDefaultWinHandle, ((((((new HTuple("mark位置:") + "[ ") + hv_RowFound) + new HTuple(",")) + hv_ColFound) + new HTuple(",")) + hv_Degree) + "° ]",
                             "window", 32, 12, "black", "true");
                //相对模板角度
                //HOperatorSet.TupleDeg(hv_AngleFound, out hv_Degree);
                //disp_message(hv_ExpDefaultWinHandle, ("相对模板角度为" + hv_Degree) + "°", "window",
                //    52, 12, "black", "true");

                centerRow = hv_RowFound;
                centerCol = hv_ColFound;
                angle     = hv_Degree;

                result = true;
            }
            else
            {
                disp_message(hv_ExpDefaultWinHandle, "未识别到靶标", "window", hv_Row, hv_Column,
                             "black", "true");
                centerRow = centerCol = angle = 0;
            }

            ho_Image.Dispose();
            ho_ResultContours.Dispose();
            ho_Contour.Dispose();
            ho_UsedEdges.Dispose();
            ho_Cross.Dispose();

            return(result);
        }
예제 #5
0
        private void Run()
        {
            using (HDevDisposeHelper dh = new HDevDisposeHelper())
            {
                // ho_Image.Dispose();
                //HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles.TupleSelect(hv_Index));
                HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
                HOperatorSet.SetPart(hWindow_Final1.hWindowControl.HalconWindow, 0, 0, hv_Height, hv_Width);
            }
            ho_ImageEmphasize.Dispose();

            HOperatorSet.Emphasize(ho_Image, out ho_ImageEmphasize, hv_Width, hv_Height,
                                   1);
            //HOperatorSet.DispObj(ho_Image, hWindow_Final1.hWindowControl.HalconWindow);
            // hWindow_Final1.hWindowControl.HalconWindow.DispImage((HImage)ho_Image);
            using (HDevDisposeHelper dh = new HDevDisposeHelper())
            {
                HOperatorSet.FindScaledShapeModel(ho_Image, c2s.Modle, (new HTuple(0)).TupleRad()
                                                  , (new HTuple(360)).TupleRad(), 0.5, 5, 0.6, 0, 0.5, "none", 0, 0.3,
                                                  out hv_Row3, out hv_Column3, out hv_Angle3, out hv_Scale, out hv_Score);
            }
            HOperatorSet.TupleLength(hv_Score, out hv_Length);
            if ((int)(new HTuple(hv_Length.TupleEqual(0))) != 0)
            {
                //disp_message(hWindow_Final1.hWindowControl.HalconWindow, "failed!!!!!!!!!!!!!!!", "window", 20,
                //    20, "black", "true");
                //disp_continue_message(hWindow_Final1.hWindowControl.HalconWindow, "black", "true");
                ////wait_seconds (2)
                //HDevelopStop();
            }
            else
            {
                //hom_mat2d_identity (HomMat2DIdentity)
                //hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
                //hom_mat2d_rotate (HomMat2DTranslate, Angle, Row, Column, HomMat2DRotate)
                //hom_mat2d_scale (HomMat2DRotate, Scale, Scale, Row, Column, HomMat2DScale)
                //affine_trans_contour_xld (ModelContours, ModelTrans, HomMat2DScale)
                //dev_display (ModelTrans)
                //下面开始测量尺寸

                HOperatorSet.AlignMetrologyModel(c2s.MetrologyHandle, hv_Row3, hv_Column3,
                                                 hv_Angle3);

                ho_ModelContour.Dispose();
                HOperatorSet.GetMetrologyObjectModelContour(out ho_ModelContour, c2s.MetrologyHandle,
                                                            "all", 1.5);
                //向图像应用测量模型
                HOperatorSet.ApplyMetrologyModel(ho_Image, c2s.MetrologyHandle);
                //获取测量卡尺
                ho_Contour1.Dispose();
                HOperatorSet.GetMetrologyObjectMeasures(out ho_Contour1, c2s.MetrologyHandle,
                                                        "all", "all", out hv_Row, out hv_Column);
                HOperatorSet.TupleLength(hv_Score, out hv_Length);
                if ((int)(new HTuple(hv_Length.TupleEqual(0))) != 0)
                {
                }
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, "all", "all", "used_edges",
                                                      "row", out hv_UsedRow);
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, "all", "all", "used_edges",
                                                      "column", out hv_UsedColumn);
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    ho_UsedEdges.Dispose();
                    HOperatorSet.GenCrossContourXld(out ho_UsedEdges, hv_UsedRow, hv_UsedColumn,
                                                    10, (new HTuple(45)).TupleRad());
                }
                //提取矩形边的长度
                hv_RectIndices = 0;
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                      "all", "result_type", "length1", out hv_Length1R);
                seqGray.Length1 = hv_Length1R.Length > 0? hv_Length1R.D : 0D;
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                      "all", "result_type", "length2", out hv_Length2R);
                seqGray.Length2 = hv_Length2R.Length > 0 ? hv_Length2R.D : 0D;
                //中心坐标及角度
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                      "all", "result_type", "row", out hv_Parameter);
                seqGray.CenterX = hv_Parameter.Length > 0 ? hv_Parameter.D : 0D;;
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                      "all", "result_type", "column", out hv_Parameter1);
                seqGray.CenterY = hv_Parameter1 > 0 ? hv_Parameter1.D : 0D;
                HOperatorSet.GetMetrologyObjectResult(c2s.MetrologyHandle, hv_RectIndices,
                                                      "all", "result_type", "phi", out hv_Parameter2);
                seqGray.Rotate = hv_Parameter2 > 0 ? hv_Parameter2.D : 0D;
                HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "red");
                using (HDevDisposeHelper dh = new HDevDisposeHelper())
                {
                    ho_Cross2.Dispose();
                    HOperatorSet.GenCrossContourXld(out ho_Cross2, hv_Parameter, hv_Parameter1,
                                                    20, (new HTuple(45)).TupleRad());
                }
                //提取直线
                //get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', ParamLine1)
                //get_metrology_object_result_contour (Contour, MetrologyHandle, 0, 'all', 1.5)
                ho_ResultContours.Dispose();
                HOperatorSet.GetMetrologyObjectResultContour(out ho_ResultContours, c2s.MetrologyHandle,
                                                             "all", "all", 1.5);
                HOperatorSet.DispObj(ho_ImageEmphasize, hWindow_Final1.hWindowControl.HalconWindow);
                HOperatorSet.SetLineWidth(hWindow_Final1.hWindowControl.HalconWindow, 1);
                HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "light gray");
                HOperatorSet.DispObj(ho_Contour1, hWindow_Final1.hWindowControl.HalconWindow);
                HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "green");
                HOperatorSet.SetLineWidth(hWindow_Final1.hWindowControl.HalconWindow, 2);
                HOperatorSet.DispObj(ho_ResultContours, hWindow_Final1.hWindowControl.HalconWindow);
                HOperatorSet.SetLineWidth(hWindow_Final1.hWindowControl.HalconWindow, 1);
                HOperatorSet.SetColor(hWindow_Final1.hWindowControl.HalconWindow, "white");
                HOperatorSet.DispObj(ho_UsedEdges, hWindow_Final1.hWindowControl.HalconWindow);
            }
        }