// 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(); }
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(); }
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); }
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); } }