public void add_samples(HObject ho_Regions, HTuple hv_GMMHandle, HTuple hv_Class) { // Local iconic variables HObject ho_ConnectedRegions = null, ho_SelectedRegions = null; HObject ho_Region = null; // Local control variables HTuple hv_Number = null, hv_J = null, hv_Features = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.CountObj(ho_Regions, out hv_Number); HTuple end_val1 = hv_Number; HTuple step_val1 = 1; for (hv_J = 1; hv_J.Continue(end_val1, step_val1); hv_J = hv_J.TupleAdd(step_val1)) { ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Regions, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", 1000, 100000); ho_Region.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions, out ho_Region, hv_J); get_features(ho_Region, out hv_Features); HOperatorSet.AddSampleClassGmm(hv_GMMHandle, hv_Features, hv_Class, 0); } ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Region.Dispose(); return; }
public void disp_obj_class(HObject ho_Regions, HTuple hv_Classes) { // Local iconic variables HObject ho_Region = null; // Local control variables HTuple hv_Number = null, hv_Colors = null; HTuple hv_J = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.CountObj(ho_Regions, out hv_Number); hv_Colors = new HTuple(); hv_Colors[0] = "yellow"; hv_Colors[1] = "magenta"; hv_Colors[2] = "green"; HTuple end_val2 = hv_Number; HTuple step_val2 = 1; for (hv_J = 1; hv_J.Continue(end_val2, step_val2); hv_J = hv_J.TupleAdd(step_val2)) { ho_Region.Dispose(); HOperatorSet.SelectObj(ho_Regions, out ho_Region, hv_J); HOperatorSet.SetColor(hv_ExpDefaultWinHandle, hv_Colors.TupleSelect(hv_Classes.TupleSelect(hv_J - 1))); HOperatorSet.DispObj(ho_Region, hv_ExpDefaultWinHandle); } ho_Region.Dispose(); return; }
private void ModelSearch(HTuple hv_ModelID, int i, out HTuple hv_Row, out HTuple hv_Column) { // Local iconic variables HTuple hv_num = new HTuple(), hv_a = new HTuple(); HTuple hv_Seconds1 = new HTuple(); HTuple hv_Angle = new HTuple(), hv_Score = new HTuple(); HTuple hv_Seconds2 = new HTuple(), hv_Time = new HTuple(); HTuple hv_HeightWin = null, hv_WidthWin = null, hv_n = 1; HOperatorSet.GenEmptyObj(out ho_GrayImage); HOperatorSet.GenEmptyObj(out ho_Circle); HOperatorSet.GenEmptyObj(out ho_Image); hv_Row = null; hv_Column = null; // stop(); only in hdevelop //********************************************** //********************************************** //设置模板完成开始匹配 ho_Image.Dispose(); HOperatorSet.ReadImage(out ho_Image, ("acA2500-14gc0" + i) + ".bmp"); ho_GrayImage.Dispose(); HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImage); HOperatorSet.CountSeconds(out hv_Seconds1); HOperatorSet.FindShapeModel(ho_Image, hv_ModelID, (new HTuple(0)).TupleRad() , (new HTuple(360)).TupleRad(), 0.8, 15, 0.2, "none", 0, 0.9, out hv_Row, out hv_Column, out hv_Angle, out hv_Score); HOperatorSet.CountSeconds(out hv_Seconds2); hv_Time = 1000.0 * (hv_Seconds2 - hv_Seconds1); HOperatorSet.GetImageSize(ho_Image, out hv_HeightWin, out hv_WidthWin); // 获取输入图像的尺寸 HOperatorSet.SetPart(hWindowControl1.HalconWindow, 0, 0, hv_WidthWin, hv_HeightWin); //将获得的图像铺满整个窗口 HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow); HOperatorSet.SetColor(hWindowControl1.HalconWindow, "yellow"); HOperatorSet.SetLineWidth(hWindowControl1.HalconWindow, 1); HOperatorSet.SetLineWidth(hWindowControl1.HalconWindow, 3); HOperatorSet.SetColor(hWindowControl1.HalconWindow, "green"); HOperatorSet.SetDraw(hWindowControl1.HalconWindow, "margin"); hv_num = new HTuple(hv_Row.TupleLength()); HTuple end_val35 = hv_num - 1; HTuple step_val35 = 1; for (hv_a = 0; hv_a.Continue(end_val35, step_val35); hv_a = hv_a.TupleAdd(step_val35)) { ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_Row.TupleSelect(hv_a), hv_Column.TupleSelect( hv_a), 220); HOperatorSet.DispObj(ho_Circle, hWindowControl1.HalconWindow); } double d = hv_Time[0]; txtNumber.Text = hv_num.ToString(); txtTime.Text = d.ToString("0.##"); ho_GrayImage.Dispose(); ho_Image.Dispose(); ho_Circle.Dispose(); }
private void btn_extract_Click(object sender, EventArgs e) { if (hDisplay1.GetSearchRegions().Count == 0) { MessageBox.Show("请先添加搜索区域"); return; } HTuple hv_Number; HObject _roi = hDisplay1.GetSearchRegions().ElementAt(0); HObject _region = new HObject(); HObject _imagereduced = new HObject(); HObject ho_ObjectSelected = new HObject(); HOperatorSet.ReduceDomain(m_image, _roi, out _imagereduced); HOperatorSet.Threshold(_imagereduced, out _region, m_OcrParam.GrayMin, m_OcrParam.GrayMax); HOperatorSet.Connection(_region, out _region); HOperatorSet.SelectShape(_region, out _region, "area", "and", m_OcrParam.AreaMin, m_OcrParam.AreaMax); HOperatorSet.CountObj(_region, out hv_Number); HTuple hv_Index = new HTuple(); List <RegionX> _listregionx = new List <RegionX>(); for (hv_Index = 1; hv_Index.Continue(hv_Number, 1); hv_Index = hv_Index.TupleAdd(1)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(_region, out ho_ObjectSelected, hv_Index); RegionX _hregion = new RegionX(ho_ObjectSelected.CopyObj(1, -1), "green"); _listregionx.Add(_hregion); } DelegateUIControl.GetInstance().UpdateHDisplay("FormSetHDisplay", m_image, _listregionx, null); }
public void GetRegionPoints(HObject ho_Regions, HTuple hv_Tolerance, out HTuple hv_Rows, out HTuple hv_Cols, out HTuple hv_BreakPoints) { // Local iconic variables HObject ho_RegionUnion, ho_ConnectedRegions; HObject ho_ObjectSelected = null; // Local control variables HTuple hv_Num = null, hv_Index = null, hv_Rows0 = new HTuple(); HTuple hv_Columns0 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_RegionUnion); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_ObjectSelected); try { ho_RegionUnion.Dispose(); HOperatorSet.Union1(ho_Regions, out ho_RegionUnion); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionUnion, out ho_ConnectedRegions); HOperatorSet.CountObj(ho_ConnectedRegions, out hv_Num); hv_Rows = new HTuple(); hv_Cols = new HTuple(); hv_BreakPoints = new HTuple(); HTuple end_val8 = hv_Num; HTuple step_val8 = 1; for (hv_Index = 1; hv_Index.Continue(end_val8, step_val8); hv_Index = hv_Index.TupleAdd(step_val8)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_ConnectedRegions, out ho_ObjectSelected, hv_Index); HOperatorSet.GetRegionPolygon(ho_ObjectSelected, hv_Tolerance, out hv_Rows0, out hv_Columns0); hv_Rows = hv_Rows.TupleConcat(hv_Rows0); hv_Cols = hv_Cols.TupleConcat(hv_Columns0); hv_BreakPoints = hv_BreakPoints.TupleConcat(new HTuple(hv_Rows0.TupleLength() )); } ho_RegionUnion.Dispose(); ho_ConnectedRegions.Dispose(); ho_ObjectSelected.Dispose(); return; } catch (HalconException HDevExpDefaultException) { ho_RegionUnion.Dispose(); ho_ConnectedRegions.Dispose(); ho_ObjectSelected.Dispose(); throw HDevExpDefaultException; } }
// Main procedure private void action() { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_NewImage, ho_Image, ho_ImageSelected = null; HObject ho_Image1 = null; // Local control variables HTuple hv_AcqHandle = null, hv_ChannelCount = null; HTuple hv_Index = null, hv_Pointer = new HTuple(), hv_Type = new HTuple(); HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_NewImage); HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_ImageSelected); HOperatorSet.GenEmptyObj(out ho_Image1); //Image Acquisition 01: Code generated by Image Acquisition 01 ho_NewImage.Dispose(); HOperatorSet.GenEmptyObj(out ho_NewImage); HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", "[0] Integrated Camera", 0, -1, out hv_AcqHandle); HOperatorSet.GrabImageStart(hv_AcqHandle, -1); //Image Acquisition 01: Do something ho_Image.Dispose(); HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1); HOperatorSet.CountChannels(ho_Image, out hv_ChannelCount); HTuple end_val7 = hv_ChannelCount; HTuple step_val7 = 1; for (hv_Index = 1; hv_Index.Continue(end_val7, step_val7); hv_Index = hv_Index.TupleAdd(step_val7)) { ho_ImageSelected.Dispose(); HOperatorSet.AccessChannel(ho_Image, out ho_ImageSelected, hv_Index); HOperatorSet.GetImagePointer1(ho_ImageSelected, out hv_Pointer, out hv_Type, out hv_Width, out hv_Height); ho_Image1.Dispose(); HOperatorSet.GenImage1(out ho_Image1, "byte", hv_Width, hv_Height, hv_Pointer); { HObject ExpTmpOutVar_0; HOperatorSet.AppendChannel(ho_NewImage, ho_Image1, out ExpTmpOutVar_0); ho_NewImage.Dispose(); ho_NewImage = ExpTmpOutVar_0; } } HOperatorSet.CloseFramegrabber(hv_AcqHandle); ho_NewImage.Dispose(); ho_Image.Dispose(); ho_ImageSelected.Dispose(); ho_Image1.Dispose(); }
/// <summary> /// 测试小球OKNG的方法 /// </summary> /// <param name="hv_liudao">小球所在位置</param> /// <param name="hv_channels">流道信息</param> /// <param name="hv_liudaoR">小球直径(像素值)</param> /// <param name="hv_myLength">小球标准直径(像素值)</param> /// <param name="hv_myThreashod">小球阈值范围</param> /// <param name="hv_myResult">是否都是好的</param> /// <param name="hv_NGLengths">NG小球直径</param> /// <param name="hv_NGChls">NG小球所在流道</param> public void testOKNG2(HTuple hv_liudao, HTuple hv_channels, HTuple hv_liudaoR, HTuple hv_myLength, HTuple hv_myThreashod, out HTuple hv_myResult, out HTuple hv_NGLengths, out HTuple hv_NGChls) { // Local iconic variables // Local control variables HTuple hv_num = null, hv_num2 = null, hv_Index1 = null; HTuple hv_Index2 = new HTuple(), hv_lll = new HTuple(); HTuple hv_ff1 = new HTuple(), hv_ff2 = new HTuple(), hv_ff = new HTuple(); // Initialize local and output iconic variables hv_myResult = 1; hv_num = new HTuple(hv_liudao.TupleLength()); hv_num2 = new HTuple(hv_channels.TupleLength()); hv_NGChls = new HTuple(); hv_NGLengths = new HTuple(); HTuple end_val8 = hv_num - 1; HTuple step_val8 = 1; for (hv_Index1 = 0; hv_Index1.Continue(end_val8, step_val8); hv_Index1 = hv_Index1.TupleAdd(step_val8)) { HTuple end_val9 = hv_num2; HTuple step_val9 = 1; for (hv_Index2 = 1; hv_Index2.Continue(end_val9, step_val9); hv_Index2 = hv_Index2.TupleAdd(step_val9)) { if ((int)(new HTuple(((hv_liudao.TupleSelect(hv_Index1))).TupleLess(hv_channels.TupleSelect( hv_Index2)))) != 0) { break; } } hv_lll = hv_Index2 - 1; hv_ff1 = new HTuple(((hv_liudaoR.TupleSelect(hv_Index1))).TupleGreater((hv_myLength.TupleSelect( hv_lll)) - (hv_myThreashod.TupleSelect(hv_lll)))); hv_ff2 = new HTuple(((hv_liudaoR.TupleSelect(hv_Index1))).TupleLess((hv_myLength.TupleSelect( hv_lll)) + (hv_myThreashod.TupleSelect(hv_lll)))); hv_ff = hv_ff1.TupleAnd(hv_ff2); if ((int)(hv_ff) != 0) { } else { hv_NGChls = hv_NGChls.TupleConcat(hv_Index2); hv_NGLengths = hv_NGLengths.TupleConcat(hv_liudaoR.TupleSelect(hv_Index1)); } hv_myResult = hv_myResult.TupleAnd(hv_ff); } return; }
public void classify(HObject ho_Regions, HTuple hv_GMMHandle, out HTuple hv_Classes1) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_Region = null, ho_ConnectedRegions = null; HObject ho_SelectedRegions = null; // Local control variables HTuple hv_Number = null, hv_J = null, hv_Features = new HTuple(); HTuple hv_ClassID = new HTuple(), hv_ClassProb = new HTuple(); HTuple hv_Density = new HTuple(), hv_KSigmaProb = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.CountObj(ho_Regions, out hv_Number); hv_Classes1 = new HTuple(); HTuple end_val2 = hv_Number; HTuple step_val2 = 1; for (hv_J = 1; hv_J.Continue(end_val2, step_val2); hv_J = hv_J.TupleAdd(step_val2)) { ho_Region.Dispose(); HOperatorSet.SelectObj(ho_Regions, out ho_Region, hv_J); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Regions, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", 1000, 100000); { HObject ExpTmpOutVar_0; HOperatorSet.SelectObj(ho_Region, out ExpTmpOutVar_0, hv_J); ho_Region.Dispose(); ho_Region = ExpTmpOutVar_0; } get_features(ho_SelectedRegions, out hv_Features); HOperatorSet.ClassifyClassGmm(hv_GMMHandle, hv_Features, 1, out hv_ClassID, out hv_ClassProb, out hv_Density, out hv_KSigmaProb); HOperatorSet.EvaluateClassGmm(hv_GMMHandle, hv_Features, out hv_ClassProb, out hv_Density, out hv_KSigmaProb); hv_Classes1 = hv_Classes1.TupleConcat(hv_ClassID); } ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); return; }
public void myStringToRegular(HTuple hv_standardText, out HTuple hv_getRegular) { HTuple hv_regularModel = null, hv_Length = null; HTuple hv_Index2 = null, hv_Index3 = new HTuple(), hv_Selected = new HTuple(); HTuple hv_Matches = new HTuple(), hv_Length2 = new HTuple(); // Initialize local and output iconic variables hv_getRegular = ""; hv_regularModel = new HTuple(); hv_regularModel[0] = "[0-9]"; hv_regularModel[1] = "[A-Z]"; hv_regularModel[2] = "[a-z]"; hv_regularModel[3] = "."; HOperatorSet.TupleStrlen(hv_standardText, out hv_Length); HTuple end_val5 = hv_Length - 1; HTuple step_val5 = 1; for (hv_Index2 = 0; hv_Index2.Continue(end_val5, step_val5); hv_Index2 = hv_Index2.TupleAdd(step_val5)) { for (hv_Index3 = 0; (int)hv_Index3 <= 3; hv_Index3 = (int)hv_Index3 + 1) { HOperatorSet.TupleStrBitSelect(hv_standardText, hv_Index2, out hv_Selected); HOperatorSet.TupleRegexpMatch(hv_Selected, hv_regularModel.TupleSelect(hv_Index3), out hv_Matches); HOperatorSet.TupleStrlen(hv_Matches, out hv_Length2); if ((int)(new HTuple(hv_Length2.TupleEqual(1))) != 0) { if ((int)(new HTuple(((hv_regularModel.TupleSelect(hv_Index3))).TupleNotEqual("."))) != 0) { hv_getRegular = hv_getRegular + (hv_regularModel.TupleSelect(hv_Index3)); break; } else { hv_getRegular = hv_getRegular + hv_Selected; } } } } return; }
private FitLineResult fitline(HObject contoursSplit) { FitLineResult result = new FitLineResult() { Col1 = new HTuple(), Row1 = new HTuple(), Col2 = new HTuple(), Row2 = new HTuple(), }; //fitLine HTuple number, rowBegin, colBegin, rowEnd, colEnd, nr, nc, dist; HObject objectSelected; HOperatorSet.GenEmptyObj(out objectSelected); HTuple distance, preDistance = 0.0; var fitlineContourAlgorithm = (mMeasAssist != null) ? new HTuple(mMeasAssist.FitLineAlgorithm) : _algorithm; HOperatorSet.CountObj(contoursSplit, out number); for (HTuple hv_i = 1; hv_i.Continue(number, 1); hv_i = hv_i.TupleAdd(1)) { HOperatorSet.SelectObj(contoursSplit, out objectSelected, hv_i); HOperatorSet.FitLineContourXld(objectSelected , fitlineContourAlgorithm, _maxNumPoints, _clippingEndPoints, _iterations, _clippingFactor, out rowBegin, out colBegin, out rowEnd, out colEnd, out nr, out nc, out dist); HOperatorSet.DistancePp(rowBegin, colBegin, rowEnd, colEnd, out distance); if (distance > preDistance) { preDistance = new HTuple(distance); //Answer result = new FitLineResult() { Row1 = new HTuple(rowBegin), Col1 = new HTuple(colBegin), Row2 = new HTuple(rowEnd), Col2 = new HTuple(colEnd), }; } } return(result); }
private static void scale_image_range(HObject ho_Image, out HObject ho_ImageScaled, HTuple hv_Min, HTuple hv_Max) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_SelectedChannel = null, ho_LowerRegion = null; HObject ho_UpperRegion = null; // Local copy input parameter variables HObject ho_Image_COPY_INP_TMP; ho_Image_COPY_INP_TMP = ho_Image.CopyObj(1, -1); // Local control variables HTuple hv_LowerLimit = new HTuple(), hv_UpperLimit = new HTuple(); HTuple hv_Mult = null, hv_Add = null, hv_Channels = null; HTuple hv_Index = null, hv_MinGray = new HTuple(), hv_MaxGray = new HTuple(); HTuple hv_Range = new HTuple(); HTuple hv_Max_COPY_INP_TMP = hv_Max.Clone(); HTuple hv_Min_COPY_INP_TMP = hv_Min.Clone(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ImageScaled); HOperatorSet.GenEmptyObj(out ho_SelectedChannel); HOperatorSet.GenEmptyObj(out ho_LowerRegion); HOperatorSet.GenEmptyObj(out ho_UpperRegion); //Convenience procedure to scale the gray values of the //input image Image from the interval [Min,Max] //to the interval [0,255] (default). //Gray values < 0 or > 255 (after scaling) are clipped. // //If the image shall be scaled to an interval different from [0,255], //this can be achieved by passing tuples with 2 values [From, To] //as Min and Max. //Example: //scale_image_range(Image:ImageScaled:[100,50],[200,250]) //maps the gray values of Image from the interval [100,200] to [50,250]. //All other gray values will be clipped. // //input parameters: //Image: the input image //Min: the minimum gray value which will be mapped to 0 // If a tuple with two values is given, the first value will // be mapped to the second value. //Max: The maximum gray value which will be mapped to 255 // If a tuple with two values is given, the first value will // be mapped to the second value. // //output parameter: //ImageScale: the resulting scaled image // if ((int)(new HTuple((new HTuple(hv_Min_COPY_INP_TMP.TupleLength())).TupleEqual( 2))) != 0) { hv_LowerLimit = hv_Min_COPY_INP_TMP[1]; hv_Min_COPY_INP_TMP = hv_Min_COPY_INP_TMP[0]; } else { hv_LowerLimit = 0.0; } if ((int)(new HTuple((new HTuple(hv_Max_COPY_INP_TMP.TupleLength())).TupleEqual( 2))) != 0) { hv_UpperLimit = hv_Max_COPY_INP_TMP[1]; hv_Max_COPY_INP_TMP = hv_Max_COPY_INP_TMP[0]; } else { hv_UpperLimit = 255.0; } // //Calculate scaling parameters hv_Mult = (((hv_UpperLimit - hv_LowerLimit)).TupleReal()) / (hv_Max_COPY_INP_TMP - hv_Min_COPY_INP_TMP); hv_Add = ((-hv_Mult) * hv_Min_COPY_INP_TMP) + hv_LowerLimit; // //Scale image { HObject ExpTmpOutVar_0; HOperatorSet.ScaleImage(ho_Image_COPY_INP_TMP, out ExpTmpOutVar_0, hv_Mult, hv_Add); ho_Image_COPY_INP_TMP.Dispose(); ho_Image_COPY_INP_TMP = ExpTmpOutVar_0; } // //Clip gray values if necessary //This must be done for each channel separately HOperatorSet.CountChannels(ho_Image_COPY_INP_TMP, out hv_Channels); HTuple end_val48 = hv_Channels; HTuple step_val48 = 1; for (hv_Index = 1; hv_Index.Continue(end_val48, step_val48); hv_Index = hv_Index.TupleAdd(step_val48)) { ho_SelectedChannel.Dispose(); HOperatorSet.AccessChannel(ho_Image_COPY_INP_TMP, out ho_SelectedChannel, hv_Index); HOperatorSet.MinMaxGray(ho_SelectedChannel, ho_SelectedChannel, 0, out hv_MinGray, out hv_MaxGray, out hv_Range); ho_LowerRegion.Dispose(); HOperatorSet.Threshold(ho_SelectedChannel, out ho_LowerRegion, ((hv_MinGray.TupleConcat( hv_LowerLimit))).TupleMin(), hv_LowerLimit); ho_UpperRegion.Dispose(); HOperatorSet.Threshold(ho_SelectedChannel, out ho_UpperRegion, hv_UpperLimit, ((hv_UpperLimit.TupleConcat(hv_MaxGray))).TupleMax()); { HObject ExpTmpOutVar_0; HOperatorSet.PaintRegion(ho_LowerRegion, ho_SelectedChannel, out ExpTmpOutVar_0, hv_LowerLimit, "fill"); ho_SelectedChannel.Dispose(); ho_SelectedChannel = ExpTmpOutVar_0; } { HObject ExpTmpOutVar_0; HOperatorSet.PaintRegion(ho_UpperRegion, ho_SelectedChannel, out ExpTmpOutVar_0, hv_UpperLimit, "fill"); ho_SelectedChannel.Dispose(); ho_SelectedChannel = ExpTmpOutVar_0; } if ((int)(new HTuple(hv_Index.TupleEqual(1))) != 0) { ho_ImageScaled.Dispose(); HOperatorSet.CopyObj(ho_SelectedChannel, out ho_ImageScaled, 1, 1); } else { { HObject ExpTmpOutVar_0; HOperatorSet.AppendChannel(ho_ImageScaled, ho_SelectedChannel, out ExpTmpOutVar_0 ); ho_ImageScaled.Dispose(); ho_ImageScaled = ExpTmpOutVar_0; } } } ho_Image_COPY_INP_TMP.Dispose(); ho_SelectedChannel.Dispose(); ho_LowerRegion.Dispose(); ho_UpperRegion.Dispose(); return; }
//DateTime t1, t2, t3, t4,t5,t6,t7; private void action() { // Local iconic variables HObject ho_GrayImage, ho_Image1; HObject ho_Image2, ho_Image3, ho_ImageResult1, ho_ImageResult2; HObject ho_ImageResult3, ho_im, ho_Region, ho_RegionConnection; HObject ho_RegionSelected, ho_RegionDilation, ho_RegionFillUp; HObject ho_RegionDifference, ho_ConnectedRegions1, ho_SelectedRegions1; HObject ho_Contour_JiaoQuanOuter, ho_Circle, ho_Contour_JiaoQuanInner; HObject ho_Region_WaiKuang, ho_RegionFillUp_WaiKuang, ho_ConnectedRegions_WaiKuang; HObject ho_SelectedRegions_WaiKuang, ho_Contour_WaiKuang; HObject ho_Image33; // Local control variables HTuple hv_Area2 = null, hv_Row = null, hv_Column = null; HTuple hv_AreaRegionSelected = null, hv_RowRegionSelected = null; HTuple hv_ColumnRegionSelected = null, hv_NumRegion = null; HTuple hv_ContourCount_JiaoQuanOuter = null, hv_RowFit_JiaoQuanOuter = null; HTuple hv_ColumnFit_JiaoQuanOuter = null, hv_RadiusFit_JiaoQuanOuter = null; HTuple hv_StartPhi = null, hv_EndPhi = null, hv_PointOrder = null; HTuple hv_RowSmallest_JiaoQuanOuter = null, hv_ColumnSmallest_JiaoQuanOuter = null; HTuple hv_RadiusSmallest_JiaoQuanOuter = null, hv_RowInner_JiaoQuanOuter = null; HTuple hv_ColumnInner_JiaoQuanOuter = null, hv_RadiusInner_JiaoQuanOuter = null; HTuple hv_RadiusRatio_JiaoQuanOuter = null, hv_Row_JiaoQuanOuter = null; HTuple hv_Col_JiaoQuanOuter = null, hv_GapAbsAll_JiaoQuanOuter = null; HTuple hv_i = null, hv_Distance1 = new HTuple(), hv_GapAbs = new HTuple(); HTuple hv_Sorted = new HTuple(), hv_MaxGap_JiaoQuanOuter = null; HTuple hv_ContourCount_JiaoQuanInner = null, hv_RowFit_JiaoQuanInner = null; HTuple hv_ColumnFit_JiaoQuanInner = null, hv_RadiusFit_JiaoQuanInner = null; HTuple hv_RowSmallest_JiaoQuanInner = null, hv_ColumnSmallest_JiaoQuanInner = null; HTuple hv_RadiusSmallest_JiaoQuanInner = null, hv_RowInner_JiaoQuanInner = null; HTuple hv_ColumnInner_JiaoQuanInner = null, hv_RadiusInner_JiaoQuanInner = null; HTuple hv_RadiusRatio_JiaoQuanInner = null, hv_Row_JiaoQuanInner = null; HTuple hv_Col_JiaoQuanInner = null, hv_GapAbsAll_JiaoQuanInner = null; HTuple hv_MaxGap_JiaoQuanInner = null, hv_ContourCount_WaiKuang = null; HTuple hv_RowFit_WaiKuang = null, hv_ColumnFit_WaiKuang = null; HTuple hv_RadiusFit_WaiKuang = null, hv_RowSmallest_WaiKuang = null; HTuple hv_ColumnSmallest_WaiKuang = null, hv_RadiusSmallest_WaiKuang = null; HTuple hv_RowInner_WaiKuang = null, hv_ColumnInner_WaiKuang = null; HTuple hv_RadiusInner_WaiKuang = null, hv_RadiusRatio_WaiKuang = null; HTuple hv_Row_WaiKuang = null, hv_Col_WaiKuang = null; HTuple hv_GapAbsAll_WaiKuang = null, hv_MaxGap_WaiKuang = null; HTuple hv_NumConnected = null, hv_NumHoles = null, hv_Area_JiaoQuan = null; HTuple hv_Row_JiaoQuan = null, hv_Column_JiaoQuan = null; HTuple hv_Area_JiaoQuanOuter = null, hv_Column_JiaoQuanOuter = null; HTuple hv_Area_JiaoQuanInner = null, hv_Column_JiaoQuanInner = null; HTuple hv_a = null, hv_hd = null, hv_Deviation = null; //HTuple hv_result = new HTuple(); // Initialize local and output iconic variables //HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_GrayImage); HOperatorSet.GenEmptyObj(out ho_Image1); HOperatorSet.GenEmptyObj(out ho_Image2); HOperatorSet.GenEmptyObj(out ho_Image3); HOperatorSet.GenEmptyObj(out ho_ImageResult1); HOperatorSet.GenEmptyObj(out ho_ImageResult2); HOperatorSet.GenEmptyObj(out ho_ImageResult3); HOperatorSet.GenEmptyObj(out ho_im); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionConnection); HOperatorSet.GenEmptyObj(out ho_RegionSelected); HOperatorSet.GenEmptyObj(out ho_RegionDilation); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_RegionDifference); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions1); HOperatorSet.GenEmptyObj(out ho_Contour_JiaoQuanOuter); HOperatorSet.GenEmptyObj(out ho_Circle); HOperatorSet.GenEmptyObj(out ho_Contour_JiaoQuanInner); HOperatorSet.GenEmptyObj(out ho_Region_WaiKuang); HOperatorSet.GenEmptyObj(out ho_RegionFillUp_WaiKuang); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions_WaiKuang); HOperatorSet.GenEmptyObj(out ho_SelectedRegions_WaiKuang); HOperatorSet.GenEmptyObj(out ho_Contour_WaiKuang); HOperatorSet.GenEmptyObj(out ho_Image33); //t3 = DateTime.Now; try { ho_Image1.Dispose(); ho_Image2.Dispose(); ho_Image3.Dispose(); HOperatorSet.Decompose3(Image, out ho_Image1, out ho_Image2, out ho_Image3); ho_ImageResult1.Dispose(); ho_ImageResult2.Dispose(); ho_ImageResult3.Dispose(); HOperatorSet.TransFromRgb(ho_Image1, ho_Image2, ho_Image3, out ho_ImageResult1, out ho_ImageResult2, out ho_ImageResult3, "hls"); ho_ImageResult1.Dispose(); HOperatorSet.SubImage(ho_Image1, ho_Image2, out ho_ImageResult1, 1, 0); ho_im.Dispose(); HOperatorSet.MeanImage(ho_ImageResult1, out ho_im, 9, 9); ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageResult1, out ho_Region, 40, 255); //closing_circle (Region, Region, 3.5) ho_RegionConnection.Dispose(); HOperatorSet.Connection(ho_Region, out ho_RegionConnection); //select_shape (RegionConnection, RegionSelected, 'area', 'and', 10000, 9999999) ho_RegionSelected.Dispose(); HOperatorSet.SelectShapeStd(ho_RegionConnection, out ho_RegionSelected, "max_area", 70); ho_RegionDilation.Dispose(); HOperatorSet.DilationCircle(ho_RegionSelected, out ho_RegionDilation, 1.5); HOperatorSet.AreaCenter(ho_RegionDilation, out hv_Area2, out hv_Row, out hv_Column); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_RegionDilation, out ho_RegionFillUp); ho_RegionDifference.Dispose(); HOperatorSet.Difference(ho_RegionFillUp, ho_RegionDilation, out ho_RegionDifference); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionDifference, out ho_ConnectedRegions1); ho_SelectedRegions1.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions1, out ho_SelectedRegions1, "max_area", 70); //JiaoQuanOuter胶圈外圆:圆度、直径 HOperatorSet.AreaCenter(ho_RegionFillUp, out hv_AreaRegionSelected, out hv_RowRegionSelected, out hv_ColumnRegionSelected); hv_NumRegion = new HTuple(hv_AreaRegionSelected.TupleLength()); ho_Contour_JiaoQuanOuter.Dispose(); HOperatorSet.GenContourRegionXld(ho_RegionFillUp, out ho_Contour_JiaoQuanOuter, "border"); HOperatorSet.ContourPointNumXld(ho_Contour_JiaoQuanOuter, out hv_ContourCount_JiaoQuanOuter); HOperatorSet.FitCircleContourXld(ho_Contour_JiaoQuanOuter, "atukey", -1, 2, 0, 10, 1, out hv_RowFit_JiaoQuanOuter, out hv_ColumnFit_JiaoQuanOuter, out hv_RadiusFit_JiaoQuanOuter, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder); HOperatorSet.SmallestCircleXld(ho_Contour_JiaoQuanOuter, out hv_RowSmallest_JiaoQuanOuter, out hv_ColumnSmallest_JiaoQuanOuter, out hv_RadiusSmallest_JiaoQuanOuter); HOperatorSet.InnerCircle(ho_RegionFillUp, out hv_RowInner_JiaoQuanOuter, out hv_ColumnInner_JiaoQuanOuter, out hv_RadiusInner_JiaoQuanOuter); //*半径比值 of 外接圆和内切圆 hv_RadiusRatio_JiaoQuanOuter = hv_RadiusInner_JiaoQuanOuter / hv_RadiusSmallest_JiaoQuanOuter; //**Contour Point HOperatorSet.GetContourXld(ho_Contour_JiaoQuanOuter, out hv_Row_JiaoQuanOuter, out hv_Col_JiaoQuanOuter); hv_GapAbsAll_JiaoQuanOuter = new HTuple(); HTuple end_val51 = hv_ContourCount_JiaoQuanOuter - 1; HTuple step_val51 = 3; for (hv_i = 0; hv_i.Continue(end_val51, step_val51); hv_i = hv_i.TupleAdd(step_val51)) { HOperatorSet.DistancePp(hv_Row_JiaoQuanOuter.TupleSelect(hv_i), hv_Col_JiaoQuanOuter.TupleSelect( hv_i), hv_RowFit_JiaoQuanOuter, hv_ColumnFit_JiaoQuanOuter, out hv_Distance1); HOperatorSet.TupleAbs(hv_Distance1 - hv_RadiusFit_JiaoQuanOuter, out hv_GapAbs); hv_GapAbsAll_JiaoQuanOuter = hv_GapAbsAll_JiaoQuanOuter.TupleConcat(hv_GapAbs); HOperatorSet.TupleSort(hv_GapAbsAll_JiaoQuanOuter, out hv_Sorted); } hv_MaxGap_JiaoQuanOuter = hv_Sorted.TupleSelect(hv_ContourCount_JiaoQuanOuter - 1); //JiaoQuanInner胶圈内圆:圆度、直径 HOperatorSet.AreaCenter(ho_SelectedRegions1, out hv_AreaRegionSelected, out hv_RowRegionSelected, out hv_ColumnRegionSelected); hv_NumRegion = new HTuple(hv_AreaRegionSelected.TupleLength()); ho_Contour_JiaoQuanInner.Dispose(); HOperatorSet.GenContourRegionXld(ho_SelectedRegions1, out ho_Contour_JiaoQuanInner, "border"); HOperatorSet.ContourPointNumXld(ho_Contour_JiaoQuanInner, out hv_ContourCount_JiaoQuanInner); HOperatorSet.FitCircleContourXld(ho_Contour_JiaoQuanInner, "atukey", -1, 2, 0, 10, 1, out hv_RowFit_JiaoQuanInner, out hv_ColumnFit_JiaoQuanInner, out hv_RadiusFit_JiaoQuanInner, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder); ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_RowFit_JiaoQuanInner, hv_ColumnFit_JiaoQuanInner, hv_RadiusFit_JiaoQuanInner); HOperatorSet.SmallestCircleXld(ho_Contour_JiaoQuanInner, out hv_RowSmallest_JiaoQuanInner, out hv_ColumnSmallest_JiaoQuanInner, out hv_RadiusSmallest_JiaoQuanInner); //gen_circle (Circle1, RowSmallest_JiaoQuanInner, ColumnSmallest_JiaoQuanInner, RadiusSmallest_JiaoQuanInner) HOperatorSet.InnerCircle(ho_SelectedRegions1, out hv_RowInner_JiaoQuanInner, out hv_ColumnInner_JiaoQuanInner, out hv_RadiusInner_JiaoQuanInner); //gen_circle (Circle2, RowInner_JiaoQuanInner, ColumnInner_JiaoQuanInner, RadiusInner_JiaoQuanInner) //*半径比值 of 外接圆和内切圆 hv_RadiusRatio_JiaoQuanInner = hv_RadiusInner_JiaoQuanInner / hv_RadiusSmallest_JiaoQuanInner; //**Contour Point HOperatorSet.GetContourXld(ho_Contour_JiaoQuanInner, out hv_Row_JiaoQuanInner, out hv_Col_JiaoQuanInner); hv_GapAbsAll_JiaoQuanInner = new HTuple(); HTuple end_val89 = hv_ContourCount_JiaoQuanInner - 1; HTuple step_val89 = 3; for (hv_i = 0; hv_i.Continue(end_val89, step_val89); hv_i = hv_i.TupleAdd(step_val89)) { HOperatorSet.DistancePp(hv_Row_JiaoQuanInner.TupleSelect(hv_i), hv_Col_JiaoQuanInner.TupleSelect( hv_i), hv_RowFit_JiaoQuanInner, hv_ColumnFit_JiaoQuanInner, out hv_Distance1); HOperatorSet.TupleAbs(hv_Distance1 - hv_RadiusFit_JiaoQuanInner, out hv_GapAbs); hv_GapAbsAll_JiaoQuanInner = hv_GapAbsAll_JiaoQuanInner.TupleConcat(hv_GapAbs); HOperatorSet.TupleSort(hv_GapAbsAll_JiaoQuanInner, out hv_Sorted); } hv_MaxGap_JiaoQuanInner = hv_Sorted.TupleSelect(hv_ContourCount_JiaoQuanInner - 1); //外框外圆:圆度、直径 ho_GrayImage.Dispose(); HOperatorSet.Rgb1ToGray(Image, out ho_GrayImage); ho_Region_WaiKuang.Dispose(); HOperatorSet.Threshold(ho_GrayImage, out ho_Region_WaiKuang, 90, 255); ho_RegionFillUp_WaiKuang.Dispose(); HOperatorSet.FillUp(ho_Region_WaiKuang, out ho_RegionFillUp_WaiKuang); ho_ConnectedRegions_WaiKuang.Dispose(); HOperatorSet.Connection(ho_RegionFillUp_WaiKuang, out ho_ConnectedRegions_WaiKuang); ho_SelectedRegions_WaiKuang.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions_WaiKuang, out ho_SelectedRegions_WaiKuang, "max_area", 70); //smallest_circle (RegionFillUp_WaiKuang, Row2, Column2, Radius) //inner_circle (RegionFillUp_WaiKuang, Row3, Column3, Radius1) HOperatorSet.AreaCenter(ho_SelectedRegions_WaiKuang, out hv_AreaRegionSelected, out hv_RowRegionSelected, out hv_ColumnRegionSelected); hv_NumRegion = new HTuple(hv_AreaRegionSelected.TupleLength()); ho_Contour_WaiKuang.Dispose(); HOperatorSet.GenContourRegionXld(ho_SelectedRegions_WaiKuang, out ho_Contour_WaiKuang, "border"); HOperatorSet.ContourPointNumXld(ho_Contour_WaiKuang, out hv_ContourCount_WaiKuang); HOperatorSet.FitCircleContourXld(ho_Contour_WaiKuang, "atukey", -1, 2, 0, 10, 1, out hv_RowFit_WaiKuang, out hv_ColumnFit_WaiKuang, out hv_RadiusFit_WaiKuang, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder); ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_RowFit_WaiKuang, hv_ColumnFit_WaiKuang, hv_RadiusFit_WaiKuang); HOperatorSet.SmallestCircleXld(ho_Contour_WaiKuang, out hv_RowSmallest_WaiKuang, out hv_ColumnSmallest_WaiKuang, out hv_RadiusSmallest_WaiKuang); //gen_circle (Circle1, RowSmallest_WaiKuang, ColumnSmallest_WaiKuang, RadiusSmallest_WaiKuang) HOperatorSet.InnerCircle(ho_SelectedRegions_WaiKuang, out hv_RowInner_WaiKuang, out hv_ColumnInner_WaiKuang, out hv_RadiusInner_WaiKuang); //gen_circle (Circle2, RowInner_WaiKuang, ColumnInner_WaiKuang, RadiusInner_WaiKuang) //*半径比值 of 外接圆和内切圆 hv_RadiusRatio_WaiKuang = hv_RadiusInner_WaiKuang / hv_RadiusSmallest_WaiKuang; //**Contour Point HOperatorSet.GetContourXld(ho_Contour_WaiKuang, out hv_Row_WaiKuang, out hv_Col_WaiKuang); hv_GapAbsAll_WaiKuang = new HTuple(); HTuple end_val135 = hv_ContourCount_WaiKuang - 1; HTuple step_val135 = 3; for (hv_i = 0; hv_i.Continue(end_val135, step_val135); hv_i = hv_i.TupleAdd(step_val135)) { HOperatorSet.DistancePp(hv_Row_WaiKuang.TupleSelect(hv_i), hv_Col_WaiKuang.TupleSelect( hv_i), hv_RowFit_WaiKuang, hv_ColumnFit_WaiKuang, out hv_Distance1); HOperatorSet.TupleAbs(hv_Distance1 - hv_RadiusFit_WaiKuang, out hv_GapAbs); hv_GapAbsAll_WaiKuang = hv_GapAbsAll_WaiKuang.TupleConcat(hv_GapAbs); HOperatorSet.TupleSort(hv_GapAbsAll_WaiKuang, out hv_Sorted); } hv_MaxGap_WaiKuang = hv_Sorted.TupleSelect(hv_ContourCount_WaiKuang - 1); //脏污 HOperatorSet.ConnectAndHoles(ho_RegionSelected, out hv_NumConnected, out hv_NumHoles); HOperatorSet.AreaCenter(ho_RegionFillUp, out hv_Area_JiaoQuan, out hv_Row_JiaoQuan, out hv_Column_JiaoQuan); HOperatorSet.AreaCenter(ho_RegionSelected, out hv_Area_JiaoQuanOuter, out hv_Row_JiaoQuanOuter, out hv_Column_JiaoQuanOuter); HOperatorSet.AreaCenter(ho_SelectedRegions1, out hv_Area_JiaoQuanInner, out hv_Row_JiaoQuanInner, out hv_Column_JiaoQuanInner); hv_a = (hv_Area_JiaoQuan - hv_Area_JiaoQuanOuter) - hv_Area_JiaoQuanInner; ho_Image33.Dispose(); HOperatorSet.ReduceDomain(Image, ho_SelectedRegions1, out ho_Image33); HOperatorSet.Intensity(ho_SelectedRegions1, ho_Image33, out hv_hd, out hv_Deviation); HOperatorSet.Union1(ho_RegionDilation, out RegionToDisp); //Result HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("橡皮圆度-半径比"); hv_result = hv_result.TupleConcat(hv_RadiusRatio_JiaoQuanOuter.D); hv_result = hv_result.TupleConcat("橡皮圆度-最大值"); hv_result = hv_result.TupleConcat(hv_MaxGap_JiaoQuanOuter.D); hv_result = hv_result.TupleConcat("橡皮内孔圆度-半径比"); hv_result = hv_result.TupleConcat(hv_RadiusRatio_JiaoQuanInner.D); hv_result = hv_result.TupleConcat("橡皮内孔圆度-最大值"); hv_result = hv_result.TupleConcat(hv_MaxGap_JiaoQuanInner.D); hv_result = hv_result.TupleConcat("橡皮内孔面积"); hv_result = hv_result.TupleConcat(hv_Area_JiaoQuanInner.D); hv_result = hv_result.TupleConcat("橡皮面积"); hv_result = hv_result.TupleConcat(hv_Area_JiaoQuanOuter.D); hv_result = hv_result.TupleConcat("橡皮灰尘"); hv_result = hv_result.TupleConcat(hv_a.D); hv_result = hv_result.TupleConcat("外圆圆度-半径比"); hv_result = hv_result.TupleConcat(hv_RadiusRatio_WaiKuang.D); hv_result = hv_result.TupleConcat("外圆圆度-最大值"); hv_result = hv_result.TupleConcat(hv_MaxGap_WaiKuang.D); hv_result = hv_result.TupleConcat("外圆内圆直径"); hv_result = hv_result.TupleConcat(hv_RadiusInner_WaiKuang.D * pixeldist * 2); hv_result = hv_result.TupleConcat("外圆外圆直径"); hv_result = hv_result.TupleConcat(hv_RadiusSmallest_WaiKuang.D * pixeldist * 2); hv_result = hv_result.TupleConcat("内孔灰度"); hv_result = hv_result.TupleConcat(hv_hd.D); result = hv_result.Clone(); //t4 = DateTime.Now; } catch { HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("橡皮圆度-半径比"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("橡皮圆度-最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("橡皮内孔圆度-半径比"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("橡皮内孔圆度-最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("橡皮内孔面积"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("橡皮面积"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("橡皮灰尘"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("外圆圆度-半径比"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("外圆圆度-最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("外圆内圆直径"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("外圆外圆直径"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("内孔灰度"); hv_result = hv_result.TupleConcat(0); result = hv_result.Clone(); } finally { //ho_Image.Dispose(); ho_GrayImage.Dispose(); ho_Image1.Dispose(); ho_Image2.Dispose(); ho_Image3.Dispose(); ho_ImageResult1.Dispose(); ho_ImageResult2.Dispose(); ho_ImageResult3.Dispose(); ho_im.Dispose(); ho_Region.Dispose(); ho_RegionConnection.Dispose(); ho_RegionSelected.Dispose(); ho_RegionDilation.Dispose(); ho_RegionFillUp.Dispose(); ho_RegionDifference.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_Contour_JiaoQuanOuter.Dispose(); ho_Circle.Dispose(); ho_Contour_JiaoQuanInner.Dispose(); ho_Region_WaiKuang.Dispose(); ho_RegionFillUp_WaiKuang.Dispose(); ho_ConnectedRegions_WaiKuang.Dispose(); ho_SelectedRegions_WaiKuang.Dispose(); ho_Contour_WaiKuang.Dispose(); ho_Image33.Dispose(); algorithm.Region.Dispose(); } }
// Main procedure private void action() { // Local iconic variables HObject ho_Image = null, ho_ImageAffinTrans = null; // Local control variables HTuple hv_WindowHandle = new HTuple(), hv_DeviceIdentifier = null; HTuple hv_Index = null, hv_DeviceName = new HTuple(), hv_DeviceVendor = new HTuple(); HTuple hv_Message = new HTuple(), hv_DeviceIndex = null; HTuple hv_DeviceHandle = new HTuple(), hv_HomMat2DIdentity = new HTuple(); HTuple hv_HomMat2DScale = new HTuple(), hv_HomMat2D = new HTuple(); HTuple hv_Loops = new HTuple(), hv_Before = new HTuple(); HTuple hv_After = new HTuple(), hv_TimeGPU = new HTuple(); HTuple hv_Grayval = new HTuple(), hv_Pointer = new HTuple(); HTuple hv_Type = new HTuple(), hv_Width = new HTuple(); HTuple hv_Height = new HTuple(), hv_TimeGPUinclTransfer = new HTuple(); HTuple hv_TimeCPU = new HTuple(), hv_SpeedUp = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_ImageAffinTrans); try { //This example shows how to use compute devices with HALCON. // dev_update_off(); //dev_close_window(...); dev_open_window_fit_size(0, 0, 640, 480, -1, -1, out hv_WindowHandle); set_display_font(hv_ExpDefaultWinHandle, 16, "mono", "true", "false"); // //Get list of all available compute devices. HOperatorSet.QueryAvailableComputeDevices(out hv_DeviceIdentifier); // //End example if no device could be found. if ((int)(new HTuple((new HTuple(hv_DeviceIdentifier.TupleLength())).TupleEqual( 0))) != 0) { ho_Image.Dispose(); ho_ImageAffinTrans.Dispose(); return; } // //Display basic information on detected devices. disp_message(hv_ExpDefaultWinHandle, new HTuple(new HTuple("Found ") + (new HTuple(hv_DeviceIdentifier.TupleLength() ))) + " Compute Device(s):", "window", 12, 12, "black", "true"); for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_DeviceIdentifier.TupleLength() )) - 1); hv_Index = (int)hv_Index + 1) { HOperatorSet.GetComputeDeviceInfo(hv_DeviceIdentifier.TupleSelect(hv_Index), "name", out hv_DeviceName); HOperatorSet.GetComputeDeviceInfo(hv_DeviceIdentifier.TupleSelect(hv_Index), "vendor", out hv_DeviceVendor); if (hv_Message == null) { hv_Message = new HTuple(); } hv_Message[hv_Index] = (((("Device #" + hv_Index) + ": ") + hv_DeviceVendor) + " ") + hv_DeviceName; } disp_message(hv_ExpDefaultWinHandle, hv_Message, "window", 42, 12, "white", "false"); disp_continue_message(hv_ExpDefaultWinHandle, "black", "true"); HDevelopStop(); // //Perform a small benchmark for all devices. for (hv_DeviceIndex = 0; (int)hv_DeviceIndex <= (int)((new HTuple(hv_DeviceIdentifier.TupleLength() )) - 1); hv_DeviceIndex = (int)hv_DeviceIndex + 1) { HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle); disp_message(hv_ExpDefaultWinHandle, ("Activating Device #" + hv_DeviceIndex) + " and performing benchmark...", "window", 12, 12, "black", "true"); //Open device. HOperatorSet.OpenComputeDevice(hv_DeviceIdentifier.TupleSelect(hv_DeviceIndex), out hv_DeviceHandle); //Deactivate asynchronous execution to obtain reliable benchmarks. HOperatorSet.SetComputeDeviceParam(hv_DeviceHandle, "asynchronous_execution", "false"); //Call affine_trans_image on this device and measure the obtained speed-up. //Activate the compute device and perform the initialization of affine_trans_image. //If this is omitted, the initialization is performed with the first //call of affine_trans_image. HOperatorSet.InitComputeDevice(hv_DeviceHandle, "affine_trans_image"); HOperatorSet.ActivateComputeDevice(hv_DeviceHandle); //create benchmark input data ho_Image.Dispose(); HOperatorSet.ReadImage(out ho_Image, "rings_and_nuts"); HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dScale(hv_HomMat2DIdentity, 0.9, 0.9, 320, 240, out hv_HomMat2DScale); HOperatorSet.HomMat2dRotate(hv_HomMat2DScale, 0.78, 320, 240, out hv_HomMat2D); //Set number of benchmark loops. hv_Loops = 200; //One call to fill caches. ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(ho_Image, out ho_ImageAffinTrans, hv_HomMat2D, "constant", "false"); HOperatorSet.CountSeconds(out hv_Before); HTuple end_val50 = hv_Loops; HTuple step_val50 = 1; for (hv_Index = 1; hv_Index.Continue(end_val50, step_val50); hv_Index = hv_Index.TupleAdd(step_val50)) { ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(ho_Image, out ho_ImageAffinTrans, hv_HomMat2D, "constant", "false"); } HOperatorSet.CountSeconds(out hv_After); hv_TimeGPU = ((hv_After - hv_Before) * 1000.0) / hv_Loops; // //Perform a slightly modified version of this benchmark to include //host->device and device->host transfer. HOperatorSet.GetGrayval(ho_Image, 0, 0, out hv_Grayval); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(ho_Image, out ho_ImageAffinTrans, hv_HomMat2D, "constant", "false"); HOperatorSet.CountSeconds(out hv_Before); HTuple end_val61 = hv_Loops; HTuple step_val61 = 1; for (hv_Index = 1; hv_Index.Continue(end_val61, step_val61); hv_Index = hv_Index.TupleAdd(step_val61)) { //set_grayval ensures that Image must be transferred to the device again. HOperatorSet.SetGrayval(ho_Image, 0, 0, hv_Grayval); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(ho_Image, out ho_ImageAffinTrans, hv_HomMat2D, "constant", "false"); //get_image_pointer1 ensures that ImageAffinTrans is transferred back to host. HOperatorSet.GetImagePointer1(ho_ImageAffinTrans, out hv_Pointer, out hv_Type, out hv_Width, out hv_Height); } HOperatorSet.CountSeconds(out hv_After); hv_TimeGPUinclTransfer = ((hv_After - hv_Before) * 1000.0) / hv_Loops; // //Deactivate the device and perform the same benchmark on the CPU. HOperatorSet.DeactivateComputeDevice(hv_DeviceHandle); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(ho_Image, out ho_ImageAffinTrans, hv_HomMat2D, "constant", "false"); HOperatorSet.CountSeconds(out hv_Before); HTuple end_val75 = hv_Loops; HTuple step_val75 = 1; for (hv_Index = 1; hv_Index.Continue(end_val75, step_val75); hv_Index = hv_Index.TupleAdd(step_val75)) { ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(ho_Image, out ho_ImageAffinTrans, hv_HomMat2D, "constant", "false"); } HOperatorSet.CountSeconds(out hv_After); hv_TimeCPU = ((hv_After - hv_Before) * 1000.0) / hv_Loops; hv_SpeedUp = hv_TimeCPU / hv_TimeGPU; hv_Message = "affine_trans_image runtimes:"; if (hv_Message == null) { hv_Message = new HTuple(); } hv_Message[1] = ((("Compute Device #" + hv_DeviceIndex) + " (excl. transfer): ") + (hv_TimeGPU.TupleString( ".2f"))) + " ms"; if (hv_Message == null) { hv_Message = new HTuple(); } hv_Message[2] = ((("Compute Device #" + hv_DeviceIndex) + " (incl. transfer): ") + (hv_TimeGPUinclTransfer.TupleString( ".2f"))) + " ms"; if (hv_Message == null) { hv_Message = new HTuple(); } hv_Message[3] = ("CPU: " + (hv_TimeCPU.TupleString( ".2f"))) + " ms"; if (hv_Message == null) { hv_Message = new HTuple(); } hv_Message[4] = " "; if (hv_Message == null) { hv_Message = new HTuple(); } hv_Message[5] = "Potential speedup: " + (hv_SpeedUp.TupleString(".1f")); disp_message(hv_ExpDefaultWinHandle, hv_Message, "window", 42, 12, "white", "false"); if ((int)(new HTuple(hv_DeviceIndex.TupleLess((new HTuple(hv_DeviceIdentifier.TupleLength() )) - 1))) != 0) { disp_continue_message(hv_ExpDefaultWinHandle, "black", "true"); HDevelopStop(); } } } catch (HalconException HDevExpDefaultException) { ho_Image.Dispose(); ho_ImageAffinTrans.Dispose(); throw HDevExpDefaultException; } ho_Image.Dispose(); ho_ImageAffinTrans.Dispose(); }
// Local procedures //public void FitCirCle(HObject ho_image, HTuple hv_startangle, HTuple hv_endangle, // HTuple hv_bw, HTuple hv_num, HTuple hv_Radius, HTuple hv_colcenter, HTuple hv_rowcenter, // HTuple hv_len1, HTuple hv_len2, HTuple hv_sigma, HTuple hv_thresholdval, HTuple hv_transition, // HTuple hv_select, HTuple hv_windowhandle, HTuple hv_showrow, HTuple hv_showcol, // out HTuple hv_RowCircleCenterFit, out HTuple hv_ColumnCircleCenterFit, out HTuple hv_RadiusCircleCenterFit, // out HTuple hv_StartPhiCircleCenterFit, out HTuple hv_EndPhiCircleCenterFit, // out HTuple hv_PointOrderCircleCenterFit) //{ // // Local iconic variables // HObject ho_Rectangle = null, ho_RectangleSM = null; // HObject ho_ImageReduced = null, ho_Contour = null; // // Local control variables // HTuple hv_t1 = null, hv_rowedgearr = null; // HTuple hv_coledgearr = null, hv_step = null, hv_angle = null; // HTuple hv_x = new HTuple(), hv_y = new HTuple(), hv_anglerad = new HTuple(); // HTuple hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); // HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); // HTuple hv_width = new HTuple(), hv_high = new HTuple(); // HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); // HTuple hv_MeasureHandle = new HTuple(), hv_RowEdge = new HTuple(); // HTuple hv_ColumnEdge = new HTuple(), hv_Amplitude = new HTuple(); // HTuple hv_Distance = new HTuple(), hv_t2 = new HTuple(); // HTuple hv_t = new HTuple(), hv_msg = new HTuple(); // // Initialize local and output iconic variables // HOperatorSet.GenEmptyObj(out ho_Rectangle); // HOperatorSet.GenEmptyObj(out ho_RectangleSM); // HOperatorSet.GenEmptyObj(out ho_ImageReduced); // HOperatorSet.GenEmptyObj(out ho_Contour); // hv_RowCircleCenterFit = new HTuple(); // hv_ColumnCircleCenterFit = new HTuple(); // hv_RadiusCircleCenterFit = new HTuple(); // hv_StartPhiCircleCenterFit = new HTuple(); // hv_EndPhiCircleCenterFit = new HTuple(); // hv_PointOrderCircleCenterFit = new HTuple(); // try // { // HOperatorSet.CountSeconds(out hv_t1); // hv_rowedgearr = new HTuple(); // hv_coledgearr = new HTuple(); // hv_step = (((hv_startangle - hv_endangle)).TupleAbs()) / hv_num; // HTuple end_val4 = hv_endangle; // HTuple step_val4 = hv_step; // for (hv_angle = hv_startangle; hv_angle.Continue(end_val4, step_val4); hv_angle = hv_angle.TupleAdd(step_val4)) // { // HOperatorSet.SetDraw(hv_ExpDefaultWinHandle, "margin"); // hv_x = hv_colcenter + (hv_Radius * (((hv_angle.TupleRad())).TupleCos())); // hv_y = hv_rowcenter - (hv_Radius * (((hv_angle.TupleRad())).TupleSin())); // if ((int)(new HTuple(hv_bw.TupleEqual(1))) != 0) // { // hv_anglerad = ((hv_angle + 180)).TupleRad(); // } // else // { // hv_anglerad = hv_angle.TupleRad(); // } // ho_Rectangle.Dispose(); // HOperatorSet.GenRectangle2(out ho_Rectangle, hv_y, hv_x, hv_anglerad, hv_len1, // hv_len2); // HOperatorSet.SmallestRectangle1(ho_Rectangle, out hv_Row1, out hv_Column1, // out hv_Row2, out hv_Column2); // ho_RectangleSM.Dispose(); // HOperatorSet.GenRectangle1(out ho_RectangleSM, hv_Row1 - 1, hv_Column1 - 1, hv_Row2 + 1, // hv_Column2 + 1); // hv_width = (((hv_Column2 - hv_Column1)).TupleAbs()) + 2; // hv_high = (((hv_Row2 - hv_Row1)).TupleAbs()) + 2; // ho_ImageReduced.Dispose(); // HOperatorSet.ReduceDomain(ho_image, ho_RectangleSM, out ho_ImageReduced); // HOperatorSet.GetImageSize(ho_ImageReduced, out hv_Width, out hv_Height); // HOperatorSet.GenMeasureRectangle2(hv_y, hv_x, hv_anglerad, hv_len1, hv_len2, // hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle); // HOperatorSet.MeasurePos(ho_image, hv_MeasureHandle, hv_sigma, hv_thresholdval, // hv_transition, hv_select, out hv_RowEdge, out hv_ColumnEdge, out hv_Amplitude, // out hv_Distance); // HOperatorSet.CloseMeasure(hv_MeasureHandle); // HOperatorSet.DispRectangle2(hv_ExpDefaultWinHandle, hv_y, hv_x, hv_anglerad, // hv_len1, hv_len2); // if ((int)(new HTuple((new HTuple(hv_RowEdge.TupleLength())).TupleGreater( // 0))) != 0) // { // HOperatorSet.DispCross(hv_ExpDefaultWinHandle, hv_RowEdge, hv_ColumnEdge, // 36, 0); // hv_rowedgearr = hv_rowedgearr.TupleConcat(hv_RowEdge); // hv_coledgearr = hv_coledgearr.TupleConcat(hv_ColumnEdge); // } // } // if ((int)(new HTuple((new HTuple(hv_rowedgearr.TupleLength())).TupleGreater( // 3))) != 0) // { // ho_Contour.Dispose(); // HOperatorSet.GenContourPolygonXld(out ho_Contour, hv_rowedgearr, hv_coledgearr); // HOperatorSet.FitCircleContourXld(ho_Contour, "atukey", -1, 0, 0, 3, 2, out hv_RowCircleCenterFit, // out hv_ColumnCircleCenterFit, out hv_RadiusCircleCenterFit, out hv_StartPhiCircleCenterFit, // out hv_EndPhiCircleCenterFit, out hv_PointOrderCircleCenterFit); // HOperatorSet.DispCircle(hv_ExpDefaultWinHandle, hv_RowCircleCenterFit, hv_ColumnCircleCenterFit, // hv_RadiusCircleCenterFit); // HOperatorSet.CountSeconds(out hv_t2); // hv_t = hv_t2 - hv_t1; // hv_msg = (((hv_t + ",x:") + hv_ColumnCircleCenterFit) + ",y:") + hv_RowCircleCenterFit; // disp_message(hv_ExpDefaultWinHandle, hv_msg, "window", hv_showrow, hv_showcol, // "black", "true"); // } // ho_Rectangle.Dispose(); // ho_RectangleSM.Dispose(); // ho_ImageReduced.Dispose(); // ho_Contour.Dispose(); // return; // } // catch (HalconException HDevExpDefaultException) // { // ho_Rectangle.Dispose(); // ho_RectangleSM.Dispose(); // ho_ImageReduced.Dispose(); // ho_Contour.Dispose(); // throw HDevExpDefaultException; // } //} public bool FitCirCle(HObject ho_image, HTuple hv_startangle, HTuple hv_endangle, HTuple hv_bw, HTuple hv_num, HTuple hv_Radius, HTuple hv_colcenter, HTuple hv_rowcenter, HTuple hv_len1, HTuple hv_len2, HTuple hv_sigma, HTuple hv_thresholdval, HTuple hv_transition, HTuple hv_select, HTuple hv_windowhandle, HTuple hv_showrow, HTuple hv_showcol, out HTuple hv_RowCircleCenterFit, out HTuple hv_ColumnCircleCenterFit, out HTuple hv_RadiusCircleCenterFit, out HTuple hv_StartPhiCircleCenterFit, out HTuple hv_EndPhiCircleCenterFit, out HTuple hv_PointOrderCircleCenterFit) { // Local iconic variables HObject ho_Rectangle = null, ho_RectangleSM = null; HObject ho_ImageReduced = null, ho_Contour = null; // Local control variables HTuple hv_t1 = null, hv_rowedgearr = null; HTuple hv_coledgearr = null, hv_step = null, hv_angle = null; HTuple hv_anglerad = new HTuple(), hv_x = new HTuple(); HTuple hv_y = new HTuple(), hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); HTuple hv_width = new HTuple(), hv_high = new HTuple(); HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_MeasureHandle = new HTuple(), hv_RowEdge = new HTuple(); HTuple hv_ColumnEdge = new HTuple(), hv_Amplitude = new HTuple(); HTuple hv_Distance = new HTuple(), hv_t2 = new HTuple(); HTuple hv_t = new HTuple(), hv_msg = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_RectangleSM); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Contour); hv_RowCircleCenterFit = new HTuple(); hv_ColumnCircleCenterFit = new HTuple(); hv_RadiusCircleCenterFit = new HTuple(); hv_StartPhiCircleCenterFit = new HTuple(); hv_EndPhiCircleCenterFit = new HTuple(); hv_PointOrderCircleCenterFit = new HTuple(); hv_RowCircleCenterFit = 0; hv_ColumnCircleCenterFit = 0; hv_RadiusCircleCenterFit = 0; try { if (ho_image == null || !ho_image.IsInitialized()) { return(false); } HOperatorSet.CountSeconds(out hv_t1); hv_rowedgearr = new HTuple(); hv_coledgearr = new HTuple(); hv_step = (((hv_startangle - hv_endangle)).TupleAbs()) / hv_num; HTuple end_val4 = hv_endangle; HTuple step_val4 = hv_step; for (hv_angle = hv_startangle; hv_angle.Continue(end_val4, step_val4); hv_angle = hv_angle.TupleAdd(step_val4)) { HOperatorSet.SetDraw(hv_windowhandle, "margin"); try { hv_x = hv_colcenter + (hv_Radius * (((hv_angle.TupleRad())).TupleCos())); hv_y = hv_rowcenter - (hv_Radius * (((hv_angle.TupleRad())).TupleSin())); if ((int)(new HTuple(hv_bw.TupleEqual(1))) != 0) { hv_anglerad = ((hv_angle + 180)).TupleRad(); } else { hv_anglerad = hv_angle.TupleRad(); } ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_y, hv_x, hv_anglerad, hv_len1, hv_len2); HOperatorSet.SmallestRectangle1(ho_Rectangle, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); ho_RectangleSM.Dispose(); HOperatorSet.GenRectangle1(out ho_RectangleSM, hv_Row1 - 1, hv_Column1 - 1, hv_Row2 + 1, hv_Column2 + 1); hv_width = (((hv_Column2 - hv_Column1)).TupleAbs()) + 2; hv_high = (((hv_Row2 - hv_Row1)).TupleAbs()) + 2; ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_image, ho_RectangleSM, out ho_ImageReduced); HOperatorSet.GetImageSize(ho_ImageReduced, out hv_Width, out hv_Height); HOperatorSet.GenMeasureRectangle2(hv_y, hv_x, hv_anglerad, hv_len1, hv_len2, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle); HOperatorSet.MeasurePos(ho_ImageReduced, hv_MeasureHandle, hv_sigma, hv_thresholdval, hv_transition, hv_select, out hv_RowEdge, out hv_ColumnEdge, out hv_Amplitude, out hv_Distance); HOperatorSet.CloseMeasure(hv_MeasureHandle); //disp_rectangle2 (windowhandle, y, x, anglerad, len1, len2) if ((int)(new HTuple((new HTuple(hv_RowEdge.TupleLength())).TupleGreater( 0))) != 0) { //disp_cross (windowhandle, RowEdge, ColumnEdge, 36, 0) hv_rowedgearr = hv_rowedgearr.TupleConcat(hv_RowEdge); hv_coledgearr = hv_coledgearr.TupleConcat(hv_ColumnEdge); } } catch { continue; } } bool brtn = true; if ((int)(new HTuple((new HTuple(hv_rowedgearr.TupleLength())).TupleGreater( 3))) != 0) { if (hv_rowedgearr.Length * 0.7 > 3) { ho_Contour.Dispose(); HOperatorSet.SetColor(hv_windowhandle, "green"); HOperatorSet.GenContourPolygonXld(out ho_Contour, hv_rowedgearr, hv_coledgearr); HOperatorSet.FitCircleContourXld(ho_Contour, "atukey", -1, 0, 0, 15, 6, out hv_RowCircleCenterFit, out hv_ColumnCircleCenterFit, out hv_RadiusCircleCenterFit, out hv_StartPhiCircleCenterFit, out hv_EndPhiCircleCenterFit, out hv_PointOrderCircleCenterFit); HOperatorSet.DispCircle(hv_windowhandle, hv_RowCircleCenterFit, hv_ColumnCircleCenterFit, hv_RadiusCircleCenterFit); HOperatorSet.CountSeconds(out hv_t2); hv_t = hv_t2 - hv_t1; hv_msg = (((hv_t + ",x:") + hv_ColumnCircleCenterFit) + ",y:") + hv_RowCircleCenterFit; //disp_message(hv_ExpDefaultWinHandle, hv_msg, "window", hv_showrow, hv_showcol, // "black", "true"); HalconExternFunExport.disp_message(hv_windowhandle, hv_msg, "window", 100, 200, "green", "false"); _logger.Warn(m_strStepName + "找圆成功:" + hv_msg.S); brtn = true; } else { brtn = false; } } else { brtn = false; } ho_Rectangle.Dispose(); ho_RectangleSM.Dispose(); ho_ImageReduced.Dispose(); ho_Contour.Dispose(); return(brtn); } catch (HalconException HDevExpDefaultException) { ho_Rectangle.Dispose(); ho_RectangleSM.Dispose(); ho_ImageReduced.Dispose(); ho_Contour.Dispose(); _logger.Warn(m_strStepName + "找圆失败:" + HDevExpDefaultException.Message); // throw HDevExpDefaultException; return(false); } }
private void btn_TrainOcr_Click(object sender, EventArgs e) { if (hDisplay1.GetSearchRegions().Count == 0) { MessageBox.Show("请先添加搜索区域"); return; } if (string.IsNullOrEmpty(txt_CharacterTrained.Text)) { MessageBox.Show("请先填写要训练的字符"); return; } HTuple hv_Number; HObject _roi = hDisplay1.GetSearchRegions().ElementAt(0); HObject _region = new HObject(); HObject _imagereduced = new HObject(); HObject ho_ObjectSelected = new HObject(); HOperatorSet.ReduceDomain(m_image, _roi, out _imagereduced); HOperatorSet.Threshold(_imagereduced, out _region, m_OcrParam.GrayMin, m_OcrParam.GrayMax); HOperatorSet.Connection(_region, out _region); HOperatorSet.SelectShape(_region, out _region, "area", "and", m_OcrParam.AreaMin, m_OcrParam.AreaMax); if (cklb_SortRegionModle.GetItemChecked(0)) { HOperatorSet.SortRegion(_region, out _region, "character", "true", "row"); } else { HOperatorSet.SortRegion(_region, out _region, "character", "true", "column"); } HOperatorSet.CountObj(_region, out hv_Number); if (hv_Number.I == 0) { MessageBox.Show("分割字符为空"); return; } string[] _characterTrained = new string[] { }; _characterTrained = txt_CharacterTrained.Text.Split(','); if (_characterTrained.Length != hv_Number.I) { MessageBox.Show("字符区域与字符个数不相等"); return; } HTuple hv_Index = new HTuple(); List <RegionX> _listregionx = new List <RegionX>(); for (hv_Index = 1; hv_Index.Continue(hv_Number, 1); hv_Index = hv_Index.TupleAdd(1)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(_region, out ho_ObjectSelected, hv_Index); RegionX _hregion = new RegionX(ho_ObjectSelected.CopyObj(1, -1), "green"); _listregionx.Add(_hregion); } string path = string.Empty; string Foldername = string.Empty; string trffilepath = string.Empty; FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.ShowNewFolderButton = true; if (fbd.ShowDialog() == DialogResult.OK) { path = fbd.SelectedPath; if (!Directory.Exists(path)) { MessageBox.Show($"不存在 '{path}' 路径!"); return; } string[] _f = path.Split('\\'); Foldername = _f[_f.Length - 1]; trffilepath = path + "\\" + Foldername + ".trf"; } else { return; } HObject _characterRegion = new HObject(); HOperatorSet.GenEmptyObj(out _characterRegion); for (int i = 0; i < hv_Number.I; i++) { HOperatorSet.AppendOcrTrainf(_region[i + 1], m_image, _characterTrained[i], trffilepath); } HTuple _ocrhandle = new HTuple(); HTuple error = new HTuple(); HTuple errorlog = new HTuple(); HOperatorSet.CreateOcrClassMlp(m_TrainParam.CharacterWidth, m_TrainParam.CharacterHeiht, m_TrainParam.ZoomModle, "default", _characterTrained, 80, "none", 10, 42, out _ocrhandle); HOperatorSet.TrainfOcrClassMlp(_ocrhandle, trffilepath, 200, 1, 0.01, out error, out errorlog); HOperatorSet.WriteOcrTrainf(_region, m_image, _characterTrained, trffilepath); HOperatorSet.WriteOcrClassMlp(_ocrhandle, path + "\\" + Foldername); DelegateUIControl.GetInstance().UpdateHDisplay("FormSetHDisplay", m_image, _listregionx, null); }
private void action() { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_Rectangle, ho_ImageReduced; HObject ho_Region, ho_ConnectedRegions, ho_SelectedRegions; HObject ho_Rectangle1, ho_ImageRotate, ho_Region1, ho_RegionAffineTrans; HObject ho_Region2, ho_RegionUnionu, ho_RegionUniond, ho_Contours; HObject ho_SelectedContours, ho_SmoothedContours1, ho_ClippedContoursu; HObject ho_ClippedContoursd, ho_Rectangle2, ho_ClippedContoursuObjectSelected = null; HObject ho_ClippedContoursdObjectSelected = null, ho_Circle = null; HObject ho_Circle1 = null, ho_ConnectedRegions1, ho_SelectedRegions1; HObject ho_SortedRegionssdj, ho_Region3, ho_ConnectedRegions2; HObject ho_SelectedRegions2, ho_SortedRegionsxdj, ho_RegionLines = null; HObject ho_RegionAffineTrans1; // Local control variables HTuple hv_Width = null, hv_Height = null; HTuple hv_jd = null, hv_Row = null, hv_Column = null, hv_Phi = null; HTuple hv_Length1 = null, hv_Length2 = null, hv_HomMat2DIdentity = null; HTuple hv_HomMat2DRotate = null, hv_Row1 = null, hv_Column1 = null; HTuple hv_Row2 = null, hv_Column2 = null, hv_Rown = null; HTuple hv_Rowu = null, hv_Columnu = null, hv_Phiu = null; HTuple hv_Length1u = null, hv_Length2u = null, hv_MeasureHandleu = null; HTuple hv_GrayValuesu = null, hv_Sigmau = null, hv_Functionu = null; HTuple hv_SmoothedFunctionu = null, hv_FirstDerivativeu = null; HTuple hv_ZeroCrossingsu = null, hv_RowStartu = null, hv_ColStartu = null; HTuple hv_RowEndu = null, hv_ColEndu = null, hv_iu = null; HTuple hv_Rowd = null, hv_Columnd = null, hv_Phid = null; HTuple hv_Length1d = null, hv_Length2d = null, hv_MeasureHandled = null; HTuple hv_GrayValuesd = null, hv_Sigmad = null, hv_Functiond = null; HTuple hv_SmoothedFunctiond = null, hv_FirstDerivatived = null; HTuple hv_ZeroCrossingsd = null, hv_RowStartd = null, hv_ColStartd = null; HTuple hv_RowEndd = null, hv_ColEndd = null, hv_id = null; HTuple hv_RowIntuAll = null, hv_ColumnIntuAll = null, hv_u1 = null; HTuple hv_i = null, hv_Length = new HTuple(), hv_Indices1 = new HTuple(); HTuple hv_RowIntu = new HTuple(), hv_ColumnIntu = new HTuple(); HTuple hv_IsOverlappingu = new HTuple(), hv_RowIntdAll = null; HTuple hv_ColumnIntdAll = null, hv_j = null, hv_RowIntd = new HTuple(); HTuple hv_ColumnIntd = new HTuple(), hv_IsOverlappingd = new HTuple(); HTuple hv_Sortedu = null, hv_Sortedd = null, hv_RowIntuu = null; HTuple hv_ColumnIntuu = null, hv_RowIntud = null, hv_ColumnIntud = null; HTuple hv_uu = null, hv_ud = null, hv_ub1 = null, hv_RowIntdu = null; HTuple hv_ColumnIntdu = null, hv_RowIntdd = null, hv_ColumnIntdd = null; HTuple hv_du = null, hv_dd = null, hv_db1 = null, hv_Areasdj = null; HTuple hv_Rowsdj = null, hv_Columnsdj = null, hv_sdj = null; HTuple hv_Areaxdj = null, hv_Rowxdj = null, hv_Columnxdj = null; HTuple hv_xdj = null, hv_djsl1 = null, hv_djsl = null; HTuple hv_Mean1 = null, hv_Mean2 = null, hv_Mean3 = null; HTuple hv_Mean4 = null, hv_Columnuu = null, hv_Columndd = null; HTuple hv_AngleAll = null, hv_l = null, hv_Angle = new HTuple(); HTuple hv_DegAll = null, hv_Mean5 = null, hv_Mean8 = null; HTuple hv_Columnuum = null, hv_uum1 = null, hv_uus = null; HTuple hv_Columnddm = null, hv_ddm = null, hv_dds = null; HTuple hv_ColumnmArr = null, hv_Mean9 = null, hv_Mean10 = null; HTuple hv_Sorteda = null, hv_Ai = null, hv_Ax = null, hv_pixeldist = null; HTuple hv_L = null, hv_D = null, hv_Dmax = null, hv_Dmin = null; HTuple hv_d = null, hv_dmax = null, hv_dmin = null, hv_LS = null; HTuple hv_HomMat2DIdentity1 = null, hv_HomMat2DRotate1 = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_ImageRotate); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_RegionAffineTrans); HOperatorSet.GenEmptyObj(out ho_Region2); HOperatorSet.GenEmptyObj(out ho_RegionUnionu); HOperatorSet.GenEmptyObj(out ho_RegionUniond); HOperatorSet.GenEmptyObj(out ho_Contours); HOperatorSet.GenEmptyObj(out ho_SelectedContours); HOperatorSet.GenEmptyObj(out ho_SmoothedContours1); HOperatorSet.GenEmptyObj(out ho_ClippedContoursu); HOperatorSet.GenEmptyObj(out ho_ClippedContoursd); HOperatorSet.GenEmptyObj(out ho_Rectangle2); HOperatorSet.GenEmptyObj(out ho_ClippedContoursuObjectSelected); HOperatorSet.GenEmptyObj(out ho_ClippedContoursdObjectSelected); HOperatorSet.GenEmptyObj(out ho_Circle); HOperatorSet.GenEmptyObj(out ho_Circle1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions1); HOperatorSet.GenEmptyObj(out ho_SortedRegionssdj); HOperatorSet.GenEmptyObj(out ho_Region3); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions2); HOperatorSet.GenEmptyObj(out ho_SelectedRegions2); HOperatorSet.GenEmptyObj(out ho_SortedRegionsxdj); HOperatorSet.GenEmptyObj(out ho_RegionLines); HOperatorSet.GenEmptyObj(out ho_RegionAffineTrans1); HOperatorSet.Union1(algorithm.Region, out RegionToDisp); try { HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, DRow1m, DCol1m, DRow2m, DCol2m); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(Image, ho_Rectangle, out ho_ImageReduced); //* ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 0, 128); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions, out ho_SelectedRegions, "max_area", 70); //hv_jd = 0; HOperatorSet.SmallestRectangle2(ho_SelectedRegions, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); ho_Rectangle1.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle1, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); ho_ImageRotate.Dispose(); HOperatorSet.RotateImage(Image, out ho_ImageRotate, -(hv_Phi.TupleDeg()), "constant"); //* ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageRotate, out ho_Region1, 0, 128); //* HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity, -hv_Phi, hv_Height / 2, hv_Width / 2, out hv_HomMat2DRotate); ho_RegionAffineTrans.Dispose(); HOperatorSet.AffineTransRegion(ho_Rectangle1, out ho_RegionAffineTrans, hv_HomMat2DRotate, "nearest_neighbor"); HOperatorSet.SmallestRectangle1(ho_RegionAffineTrans, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); //*** ho_Region2.Dispose(); HOperatorSet.GenRegionPoints(out ho_Region2, hv_Row1, hv_Column1); ho_RegionUnionu.Dispose(); HOperatorSet.Union1(ho_Region2, out ho_RegionUnionu); ho_RegionUniond.Dispose(); HOperatorSet.Union1(ho_Region2, out ho_RegionUniond); ho_Contours.Dispose(); HOperatorSet.GenContourRegionXld(ho_Region1, out ho_Contours, "border"); ho_SelectedContours.Dispose(); HOperatorSet.SelectContoursXld(ho_Contours, out ho_SelectedContours, "contour_length", 20, 2000000, -1, 1); ho_SmoothedContours1.Dispose(); HOperatorSet.SmoothContoursXld(ho_SelectedContours, out ho_SmoothedContours1, 13); //* hv_Rown = (hv_Row1 + hv_Row2) / 2; ho_ClippedContoursu.Dispose(); HOperatorSet.ClipContoursXld(ho_SmoothedContours1, out ho_ClippedContoursu, hv_Row1, hv_Column1, hv_Rown, hv_Column2); ho_ClippedContoursd.Dispose(); HOperatorSet.ClipContoursXld(ho_SmoothedContours1, out ho_ClippedContoursd, hv_Rown, hv_Column1, hv_Row2, hv_Column2); hv_Rowu = (hv_Row1 + hv_Rown) / 2; hv_Columnu = (hv_Column1 + hv_Column2) / 2; hv_Phiu = 0; hv_Length1u = (hv_Column2 - hv_Column1) / 2; hv_Length2u = (hv_Rown - hv_Row1) / 2; //dev_set_draw ('margin') HOperatorSet.GenMeasureRectangle2(hv_Rowu, hv_Columnu, hv_Phiu, hv_Length1u, hv_Length2u, hv_Width, hv_Height, "bilinear", out hv_MeasureHandleu); ho_Rectangle2.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle2, hv_Rowu, hv_Columnu, hv_Phiu, hv_Length1u, hv_Length2u); HOperatorSet.MeasureProjection(ho_ImageRotate, hv_MeasureHandleu, out hv_GrayValuesu); hv_Sigmau = 5; HOperatorSet.CreateFunct1dArray(hv_GrayValuesu, out hv_Functionu); HOperatorSet.SmoothFunct1dGauss(hv_Functionu, hv_Sigmau, out hv_SmoothedFunctionu); HOperatorSet.DerivateFunct1d(hv_SmoothedFunctionu, "first", out hv_FirstDerivativeu); HOperatorSet.ZeroCrossingsFunct1d(hv_FirstDerivativeu, out hv_ZeroCrossingsu); hv_RowStartu = hv_Rowu - (hv_Length2u / 2); hv_ColStartu = (hv_Columnu - hv_Length1u) + hv_ZeroCrossingsu; hv_RowEndu = hv_Rowu + (hv_Length2u / 2); hv_ColEndu = (hv_Columnu - hv_Length1u) + hv_ZeroCrossingsu; hv_iu = new HTuple(hv_ZeroCrossingsu.TupleLength()); hv_Rowd = (hv_Rown + hv_Row2) / 2; hv_Columnd = (hv_Column1 + hv_Column2) / 2; hv_Phid = 0; hv_Length1d = (hv_Column2 - hv_Column1) / 2; hv_Length2d = (hv_Row2 - hv_Rown) / 2; HOperatorSet.GenMeasureRectangle2(hv_Rowd, hv_Columnd, hv_Phid, hv_Length1d, hv_Length2d, hv_Width, hv_Height, "bilinear", out hv_MeasureHandled); HOperatorSet.MeasureProjection(ho_ImageRotate, hv_MeasureHandled, out hv_GrayValuesd); // hv_Sigmad = 5; HOperatorSet.CreateFunct1dArray(hv_GrayValuesd, out hv_Functiond); HOperatorSet.SmoothFunct1dGauss(hv_Functiond, hv_Sigmad, out hv_SmoothedFunctiond); HOperatorSet.DerivateFunct1d(hv_SmoothedFunctiond, "first", out hv_FirstDerivatived); HOperatorSet.ZeroCrossingsFunct1d(hv_FirstDerivatived, out hv_ZeroCrossingsd); HOperatorSet.CloseMeasure(hv_MeasureHandleu); HOperatorSet.CloseMeasure(hv_MeasureHandled); hv_RowStartd = hv_Rowd - (hv_Length2d / 2); hv_ColStartd = (hv_Columnd - hv_Length1d) + hv_ZeroCrossingsd; hv_RowEndd = hv_Rowd + (hv_Length2d / 2); hv_ColEndd = (hv_Columnd - hv_Length1d) + hv_ZeroCrossingsd; hv_id = new HTuple(hv_ZeroCrossingsd.TupleLength()); hv_RowIntuAll = new HTuple(); hv_ColumnIntuAll = new HTuple(); hv_u1 = 0; HTuple end_val96 = hv_iu - 1; HTuple step_val96 = 1; for (hv_i = 0; hv_i.Continue(end_val96, step_val96); hv_i = hv_i.TupleAdd(step_val96)) { HOperatorSet.LengthXld(ho_ClippedContoursu, out hv_Length); HOperatorSet.TupleFind(hv_Length, hv_Length.TupleMax(), out hv_Indices1); ho_ClippedContoursuObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_ClippedContoursu, out ho_ClippedContoursuObjectSelected, hv_Indices1 + 1); HOperatorSet.IntersectionLineContourXld(ho_ClippedContoursuObjectSelected, hv_RowStartu, hv_ColStartu.TupleSelect(hv_i), hv_RowEndu, hv_ColEndu.TupleSelect( hv_i), out hv_RowIntu, out hv_ColumnIntu, out hv_IsOverlappingu); //*gen_cross_contour_xld (Cross1u, RowIntu, ColumnIntu, 12, 0)//根据每个输入点交叉的形状创键一个XLD轮廓(contour) hv_RowIntuAll = hv_RowIntuAll.TupleConcat(hv_RowIntu); hv_ColumnIntuAll = hv_ColumnIntuAll.TupleConcat(hv_ColumnIntu); hv_u1 = hv_u1 + 1; } hv_RowIntdAll = new HTuple(); hv_ColumnIntdAll = new HTuple(); HTuple end_val109 = hv_id - 1; HTuple step_val109 = 1; for (hv_j = 0; hv_j.Continue(end_val109, step_val109); hv_j = hv_j.TupleAdd(step_val109)) { HOperatorSet.LengthXld(ho_ClippedContoursd, out hv_Length); HOperatorSet.TupleFind(hv_Length, hv_Length.TupleMax(), out hv_Indices1); ho_ClippedContoursdObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_ClippedContoursd, out ho_ClippedContoursdObjectSelected, hv_Indices1 + 1); HOperatorSet.IntersectionLineContourXld(ho_ClippedContoursdObjectSelected, hv_RowStartd, hv_ColStartd.TupleSelect(hv_j), hv_RowEndd, hv_ColEndd.TupleSelect( hv_j), out hv_RowIntd, out hv_ColumnIntd, out hv_IsOverlappingd); //*gen_cross_contour_xld (Cross1d, RowIntd, ColumnIntd, 12, 0)//根据每个输入点交叉的形状创键一个XLD轮廓(contour) hv_RowIntdAll = hv_RowIntdAll.TupleConcat(hv_RowIntd); hv_ColumnIntdAll = hv_ColumnIntdAll.TupleConcat(hv_ColumnIntd); } //stop () HOperatorSet.TupleSort(hv_RowIntuAll, out hv_Sortedu); HOperatorSet.TupleSort(hv_RowIntdAll, out hv_Sortedd); hv_RowIntuu = new HTuple(); hv_ColumnIntuu = new HTuple(); hv_RowIntud = new HTuple(); hv_ColumnIntud = new HTuple(); hv_uu = 0; hv_ud = 0; for (hv_ub1 = 0; (int)hv_ub1 <= (int)((new HTuple(hv_Sortedu.TupleLength())) - 1); hv_ub1 = (int)hv_ub1 + 1) { if ((int)(new HTuple(((hv_RowIntuAll.TupleSelect(hv_ub1))).TupleLess(((((hv_Sortedu.TupleSelect( 0)) * 2) + (hv_Sortedu.TupleSelect((new HTuple(hv_Sortedu.TupleLength())) - 1))) / 3) + 3))) != 0) { hv_RowIntuu = hv_RowIntuu.TupleConcat(hv_RowIntuAll.TupleSelect(hv_ub1)); hv_ColumnIntuu = hv_ColumnIntuu.TupleConcat(hv_ColumnIntuAll.TupleSelect( hv_ub1)); ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_RowIntuAll.TupleSelect(hv_ub1), hv_ColumnIntuAll.TupleSelect(hv_ub1), 1); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_RegionUnionu, ho_Circle, out ExpTmpOutVar_0); ho_RegionUnionu.Dispose(); ho_RegionUnionu = ExpTmpOutVar_0; } hv_uu = hv_uu + 1; } if ((int)(new HTuple(((hv_RowIntuAll.TupleSelect(hv_ub1))).TupleGreater((((hv_Sortedu.TupleSelect( 0)) + ((hv_Sortedu.TupleSelect((new HTuple(hv_Sortedu.TupleLength())) - 1)) * 2)) / 3) - 3))) != 0) { hv_RowIntud = hv_RowIntud.TupleConcat(hv_RowIntuAll.TupleSelect(hv_ub1)); hv_ColumnIntud = hv_ColumnIntud.TupleConcat(hv_ColumnIntuAll.TupleSelect( hv_ub1)); hv_ud = hv_ud + 1; } } //stop () hv_RowIntdu = new HTuple(); hv_ColumnIntdu = new HTuple(); hv_RowIntdd = new HTuple(); hv_ColumnIntdd = new HTuple(); hv_du = 0; hv_dd = 0; for (hv_db1 = 0; (int)hv_db1 <= (int)((new HTuple(hv_Sortedd.TupleLength())) - 1); hv_db1 = (int)hv_db1 + 1) { if ((int)(new HTuple(((hv_RowIntdAll.TupleSelect(hv_db1))).TupleLess(((((hv_Sortedd.TupleSelect( 0)) * 2) + (hv_Sortedd.TupleSelect((new HTuple(hv_Sortedd.TupleLength())) - 1))) / 3) + 3))) != 0) { hv_RowIntdu = hv_RowIntdu.TupleConcat(hv_RowIntdAll.TupleSelect(hv_db1)); hv_ColumnIntdu = hv_ColumnIntdu.TupleConcat(hv_ColumnIntdAll.TupleSelect( hv_db1)); hv_du = hv_du + 1; } if ((int)(new HTuple(((hv_RowIntdAll.TupleSelect(hv_db1))).TupleGreater((((hv_Sortedd.TupleSelect( 0)) + ((hv_Sortedd.TupleSelect((new HTuple(hv_Sortedd.TupleLength())) - 1)) * 2)) / 3) - 3))) != 0) { hv_RowIntdd = hv_RowIntdd.TupleConcat(hv_RowIntdAll.TupleSelect(hv_db1)); hv_ColumnIntdd = hv_ColumnIntdd.TupleConcat(hv_ColumnIntdAll.TupleSelect( hv_db1)); ho_Circle1.Dispose(); HOperatorSet.GenCircle(out ho_Circle1, hv_RowIntdAll.TupleSelect(hv_db1), hv_ColumnIntdAll.TupleSelect(hv_db1), 1); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_RegionUniond, ho_Circle1, out ExpTmpOutVar_0); ho_RegionUniond.Dispose(); ho_RegionUniond = ExpTmpOutVar_0; } hv_dd = hv_dd + 1; } } ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionUnionu, out ho_ConnectedRegions1); ho_SelectedRegions1.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions1, "area", "and", 3, 99999); ho_SortedRegionssdj.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions1, out ho_SortedRegionssdj, "upper_left", "true", "column"); HOperatorSet.AreaCenter(ho_SortedRegionssdj, out hv_Areasdj, out hv_Rowsdj, out hv_Columnsdj); ho_Region3.Dispose(); HOperatorSet.GenRegionPoints(out ho_Region3, hv_Rowsdj.TupleSelect(0), hv_Columnsdj.TupleSelect( 0)); hv_sdj = new HTuple(hv_Columnsdj.TupleLength()); ho_ConnectedRegions2.Dispose(); HOperatorSet.Connection(ho_RegionUniond, out ho_ConnectedRegions2); ho_SelectedRegions2.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions2, out ho_SelectedRegions2, "area", "and", 3, 99999); ho_SortedRegionsxdj.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions2, out ho_SortedRegionsxdj, "upper_left", "true", "column"); HOperatorSet.AreaCenter(ho_SortedRegionsxdj, out hv_Areaxdj, out hv_Rowxdj, out hv_Columnxdj); hv_xdj = new HTuple(hv_Columnxdj.TupleLength()); hv_djsl1 = new HTuple(); hv_djsl1 = hv_djsl1.TupleConcat(hv_sdj); hv_djsl1 = hv_djsl1.TupleConcat(hv_xdj); HOperatorSet.TupleMin(hv_djsl1, out hv_djsl); HOperatorSet.TupleMean(hv_RowIntuu, out hv_Mean1); HOperatorSet.TupleMean(hv_RowIntud, out hv_Mean2); HOperatorSet.TupleMean(hv_RowIntdu, out hv_Mean3); HOperatorSet.TupleMean(hv_RowIntdd, out hv_Mean4); hv_Columnuu = new HTuple(); hv_Columndd = new HTuple(); hv_AngleAll = new HTuple(); HTuple end_val191 = hv_djsl - 1; HTuple step_val191 = 1; for (hv_l = 0; hv_l.Continue(end_val191, step_val191); hv_l = hv_l.TupleAdd(step_val191)) { ho_RegionLines.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLines, hv_Rowsdj.TupleSelect(hv_l), hv_Columnsdj.TupleSelect(hv_l), hv_Rowxdj.TupleSelect(hv_l), hv_Columnxdj.TupleSelect( hv_l)); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_Region3, ho_RegionLines, out ExpTmpOutVar_0); ho_Region3.Dispose(); ho_Region3 = ExpTmpOutVar_0; } HOperatorSet.AngleLx(hv_Rowsdj.TupleSelect(hv_l), hv_Columnsdj.TupleSelect( hv_l), hv_Rowxdj.TupleSelect(hv_l), hv_Columnxdj.TupleSelect(hv_l), out hv_Angle); hv_AngleAll = hv_AngleAll.TupleConcat(0 - hv_Angle); if ((int)(new HTuple(hv_l.TupleGreater(0))) != 0) { hv_Columnuu = hv_Columnuu.TupleConcat((hv_ColumnIntuu.TupleSelect(hv_l)) - (hv_ColumnIntuu.TupleSelect( hv_l - 1))); hv_Columndd = hv_Columndd.TupleConcat((hv_ColumnIntdd.TupleSelect(hv_l)) - (hv_ColumnIntdd.TupleSelect( hv_l - 1))); } //stop () } HOperatorSet.TupleDeg(hv_AngleAll, out hv_DegAll); HOperatorSet.TupleMean(hv_Columnuu, out hv_Mean5); HOperatorSet.TupleMean(hv_Columndd, out hv_Mean8); //**过滤 hv_Columnuum = new HTuple(); hv_uum1 = 0; for (hv_uus = 0; (int)hv_uus <= (int)((new HTuple(hv_Columnuu.TupleLength())) - 1); hv_uus = (int)hv_uus + 1) { if ((int)((new HTuple(hv_Columnuu.TupleLessEqual(hv_Mean5 * 1.1))).TupleAnd(new HTuple(hv_Columnuu.TupleGreaterEqual( hv_Mean5 * 0.9)))) != 0) { hv_Columnuum = hv_Columnuum.TupleConcat(hv_Columnuu.TupleSelect(hv_uus)); hv_uum1 = hv_uum1 + 1; } } hv_Columnddm = new HTuple(); hv_ddm = 0; for (hv_dds = 0; (int)hv_dds <= (int)((new HTuple(hv_Columndd.TupleLength())) - 1); hv_dds = (int)hv_dds + 1) { if ((int)((new HTuple(hv_Columndd.TupleLessEqual(hv_Mean8 * 1.1))).TupleAnd(new HTuple(hv_Columndd.TupleGreaterEqual( hv_Mean8 * 0.9)))) != 0) { hv_Columnddm = hv_Columnddm.TupleConcat(hv_Columndd.TupleSelect(hv_dds)); hv_ddm = hv_ddm + 1; } } hv_ColumnmArr = new HTuple(); hv_ColumnmArr = hv_ColumnmArr.TupleConcat(hv_Columnuum); hv_ColumnmArr = hv_ColumnmArr.TupleConcat(hv_Columnddm); HOperatorSet.TupleMean(hv_ColumnmArr, out hv_Mean9); HOperatorSet.TupleMean(hv_DegAll, out hv_Mean10); HOperatorSet.TupleSort(hv_DegAll, out hv_Sorteda); hv_Ai = hv_Sorteda[0]; hv_Ax = hv_Sorteda[(new HTuple(hv_Sorteda.TupleLength())) - 1]; hv_pixeldist = 1; hv_L = ((hv_Columnsdj.TupleSelect(hv_djsl - 1)) - (hv_Columnsdj.TupleSelect(0))) * hv_pixeldist; hv_D = (hv_Mean4 - hv_Mean1) * hv_pixeldist; hv_Dmax = ((hv_RowIntdd.TupleMax()) - (hv_RowIntuu.TupleMin())) * hv_pixeldist; hv_Dmin = ((hv_RowIntdd.TupleMin()) - (hv_RowIntuu.TupleMax())) * hv_pixeldist; hv_d = (hv_Mean3 - hv_Mean2) * hv_pixeldist; hv_dmax = ((hv_RowIntdu.TupleMax()) - (hv_RowIntud.TupleMin())) * hv_pixeldist; hv_dmin = ((hv_RowIntdu.TupleMin()) - (hv_RowIntud.TupleMax())) * hv_pixeldist; hv_LS = hv_Mean9 * hv_pixeldist; //*区域旋转 HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity1); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity1, hv_Phi, hv_Height / 2, hv_Width / 2, out hv_HomMat2DRotate1); ho_RegionAffineTrans1.Dispose(); HOperatorSet.AffineTransRegion(ho_Region3, out ho_RegionAffineTrans1, hv_HomMat2DRotate1, "nearest_neighbor"); HOperatorSet.Union1(ho_RegionAffineTrans1, out RegionToDisp); HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("齿数"); hv_result = hv_result.TupleConcat(hv_djsl.D); hv_result = hv_result.TupleConcat("螺纹长度"); hv_result = hv_result.TupleConcat(hv_L.D * pixeldist); hv_result = hv_result.TupleConcat("螺纹大径平均值"); hv_result = hv_result.TupleConcat(hv_D.D * pixeldist); hv_result = hv_result.TupleConcat("螺纹大径最小值"); hv_result = hv_result.TupleConcat(hv_Dmin.D * pixeldist); hv_result = hv_result.TupleConcat("螺纹大径最大值"); hv_result = hv_result.TupleConcat(hv_Dmax.D * pixeldist); hv_result = hv_result.TupleConcat("螺纹小径平均值"); hv_result = hv_result.TupleConcat(hv_d.D * pixeldist); hv_result = hv_result.TupleConcat("螺纹小径最小值"); hv_result = hv_result.TupleConcat(hv_dmin.D * pixeldist); hv_result = hv_result.TupleConcat("螺纹小径最大值"); hv_result = hv_result.TupleConcat(hv_dmax.D * pixeldist); hv_result = hv_result.TupleConcat("牙距"); hv_result = hv_result.TupleConcat(hv_LS.D * pixeldist); hv_result = hv_result.TupleConcat("平均牙倾角"); hv_result = hv_result.TupleConcat(hv_Mean10.D); hv_result = hv_result.TupleConcat("最小牙倾角"); hv_result = hv_result.TupleConcat(hv_Ai.D); hv_result = hv_result.TupleConcat("最大牙倾角"); hv_result = hv_result.TupleConcat(hv_Ax.D); result = hv_result.Clone(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Rectangle1.Dispose(); ho_ImageRotate.Dispose(); ho_Region1.Dispose(); ho_RegionAffineTrans.Dispose(); ho_Region2.Dispose(); ho_RegionUnionu.Dispose(); ho_RegionUniond.Dispose(); ho_Contours.Dispose(); ho_SelectedContours.Dispose(); ho_SmoothedContours1.Dispose(); ho_ClippedContoursu.Dispose(); ho_ClippedContoursd.Dispose(); ho_Rectangle2.Dispose(); ho_ClippedContoursuObjectSelected.Dispose(); ho_ClippedContoursdObjectSelected.Dispose(); ho_Circle.Dispose(); ho_Circle1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_SortedRegionssdj.Dispose(); ho_Region3.Dispose(); ho_ConnectedRegions2.Dispose(); ho_SelectedRegions2.Dispose(); ho_SortedRegionsxdj.Dispose(); ho_RegionLines.Dispose(); ho_RegionAffineTrans1.Dispose(); algorithm.Region.Dispose(); } catch { HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("齿数"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹长度"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹大径平均值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹大径最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹大径最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹小径平均值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹小径最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹小径最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("牙距"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("平均牙倾角"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("最小牙倾角"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("最大牙倾角"); hv_result = hv_result.TupleConcat(0); result = hv_result.Clone(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Rectangle1.Dispose(); ho_ImageRotate.Dispose(); ho_Region1.Dispose(); ho_RegionAffineTrans.Dispose(); ho_Region2.Dispose(); ho_RegionUnionu.Dispose(); ho_RegionUniond.Dispose(); ho_Contours.Dispose(); ho_SelectedContours.Dispose(); ho_SmoothedContours1.Dispose(); ho_ClippedContoursu.Dispose(); ho_ClippedContoursd.Dispose(); ho_Rectangle2.Dispose(); ho_ClippedContoursuObjectSelected.Dispose(); ho_ClippedContoursdObjectSelected.Dispose(); ho_Circle.Dispose(); ho_Circle1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_SortedRegionssdj.Dispose(); ho_Region3.Dispose(); ho_ConnectedRegions2.Dispose(); ho_SelectedRegions2.Dispose(); ho_SortedRegionsxdj.Dispose(); ho_RegionLines.Dispose(); ho_RegionAffineTrans1.Dispose(); algorithm.Region.Dispose(); } finally { ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Rectangle1.Dispose(); ho_ImageRotate.Dispose(); ho_Region1.Dispose(); ho_RegionAffineTrans.Dispose(); ho_Region2.Dispose(); ho_RegionUnionu.Dispose(); ho_RegionUniond.Dispose(); ho_Contours.Dispose(); ho_SelectedContours.Dispose(); ho_SmoothedContours1.Dispose(); ho_ClippedContoursu.Dispose(); ho_ClippedContoursd.Dispose(); ho_Rectangle2.Dispose(); ho_ClippedContoursuObjectSelected.Dispose(); ho_ClippedContoursdObjectSelected.Dispose(); ho_Circle.Dispose(); ho_Circle1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_SortedRegionssdj.Dispose(); ho_Region3.Dispose(); ho_ConnectedRegions2.Dispose(); ho_SelectedRegions2.Dispose(); ho_SortedRegionsxdj.Dispose(); ho_RegionLines.Dispose(); ho_RegionAffineTrans1.Dispose(); algorithm.Region.Dispose(); } }
private void action() { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_Rectangle, ho_ImageReduced; HObject ho_Region, ho_RegionLines, ho_RegionUnion1, ho_RegionUnion2; HObject ho_RegionUnion3, ho_Region1, ho_ConnectedRegions; HObject ho_RegionFillUp, ho_SelectedRegions, ho_SortedRegions; HObject ho_ObjectSelected = null, ho_Rectangle1 = null, ho_ImageReduced1 = null; HObject ho_Circle1 = null, ho_Circle2 = null, ho_Circle3 = null; HObject ho_Circle4 = null, ho_RegionUnionc1 = null, ho_RegionUnionc2 = null; HObject ho_RegionUnionc3 = null, ho_ConnectedRegionsc = null; HObject ho_SortedRegions1 = null, ho_ContoursL = null, ho_RegionLinesL = null; HObject ho_RegionLinesL1 = null, ho_RegionUnionL = null, ho_ConnectedRegionsL = null; HObject ho_SelectedRegionsL = null, ho_RegionFillUpL = null; HObject ho_ContoursSplitL = null, ho_SelectedContoursL = null; HObject ho_UnionContoursL = null, ho_RegionL = null, ho_RegionDifferenceL = null; HObject ho_ContoursR = null, ho_RegionLinesR = null, ho_RegionLinesR1 = null; HObject ho_RegionUnionR = null, ho_ConnectedRegionsR = null; HObject ho_SelectedRegionsR = null, ho_RegionFillUpR = null; HObject ho_ContoursSplitR = null, ho_SelectedContoursR = null; HObject ho_UnionContoursR = null, ho_RegionR = null, ho_RegionDifferenceR = null; HObject ho_ConnectedRegions1; // Local control variables HTuple hv_Width = null, hv_Height = null, hv_Row11 = null; HTuple hv_Column11 = null, hv_Row21 = null, hv_Column21 = null; HTuple hv_Row12 = null, hv_Column12 = null, hv_Row22 = null; HTuple hv_Column22 = null, hv_Number = null, hv_h = null; HTuple hv_w = null, hv_i = null, hv_Row = new HTuple(); HTuple hv_Column = new HTuple(), hv_Phi = new HTuple(); HTuple hv_Length1 = new HTuple(), hv_Length2 = new HTuple(); HTuple hv_Cos = new HTuple(), hv_Sin = new HTuple(), hv_RT_X = new HTuple(); HTuple hv_RT_Y = new HTuple(), hv_AX = new HTuple(), hv_AY = new HTuple(); HTuple hv_RB_X = new HTuple(), hv_RB_Y = new HTuple(); HTuple hv_BX = new HTuple(), hv_BY = new HTuple(), hv_LB_X = new HTuple(); HTuple hv_LB_Y = new HTuple(), hv_CX = new HTuple(), hv_CY = new HTuple(); HTuple hv_LT_X = new HTuple(), hv_LT_Y = new HTuple(); HTuple hv_DX = new HTuple(), hv_DY = new HTuple(), hv_Number1 = new HTuple(); HTuple hv_Area = new HTuple(), hv_Row1 = new HTuple(); HTuple hv_Column1 = new HTuple(), hv_Distance = new HTuple(); HTuple hv_Distance1 = new HTuple(), hv_shapeParam = new HTuple(); HTuple hv_MetrologyHandleL = new HTuple(), hv_Index = new HTuple(); HTuple hv_RowL = new HTuple(), hv_ColumnL = new HTuple(); HTuple hv_l = new HTuple(), hv_NumberL = new HTuple(); HTuple hv_MetrologyHandleR = new HTuple(), hv_RowR = new HTuple(); HTuple hv_ColumnR = new HTuple(), hv_r = new HTuple(); HTuple hv_NumberR = new HTuple(), hv_AreaL = new HTuple(); HTuple hv_AreaR = new HTuple(), hv_Area1 = null, hv_Row2 = null; HTuple hv_Column2 = null, hv_Area2 = null, hv_Row3 = null; HTuple hv_Column3 = null, hv_hm = null, hv_wm = null, hv_Row13 = null; HTuple hv_Column13 = null, hv_Row23 = null, hv_Column23 = null; HTuple hv_zh = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionLines); HOperatorSet.GenEmptyObj(out ho_RegionUnion1); HOperatorSet.GenEmptyObj(out ho_RegionUnion2); HOperatorSet.GenEmptyObj(out ho_RegionUnion3); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_SortedRegions); HOperatorSet.GenEmptyObj(out ho_ObjectSelected); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_ImageReduced1); HOperatorSet.GenEmptyObj(out ho_Circle1); HOperatorSet.GenEmptyObj(out ho_Circle2); HOperatorSet.GenEmptyObj(out ho_Circle3); HOperatorSet.GenEmptyObj(out ho_Circle4); HOperatorSet.GenEmptyObj(out ho_RegionUnionc1); HOperatorSet.GenEmptyObj(out ho_RegionUnionc2); HOperatorSet.GenEmptyObj(out ho_RegionUnionc3); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsc); HOperatorSet.GenEmptyObj(out ho_SortedRegions1); HOperatorSet.GenEmptyObj(out ho_ContoursL); HOperatorSet.GenEmptyObj(out ho_RegionLinesL); HOperatorSet.GenEmptyObj(out ho_RegionLinesL1); HOperatorSet.GenEmptyObj(out ho_RegionUnionL); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsL); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsL); HOperatorSet.GenEmptyObj(out ho_RegionFillUpL); HOperatorSet.GenEmptyObj(out ho_ContoursSplitL); HOperatorSet.GenEmptyObj(out ho_SelectedContoursL); HOperatorSet.GenEmptyObj(out ho_UnionContoursL); HOperatorSet.GenEmptyObj(out ho_RegionL); HOperatorSet.GenEmptyObj(out ho_RegionDifferenceL); HOperatorSet.GenEmptyObj(out ho_ContoursR); HOperatorSet.GenEmptyObj(out ho_RegionLinesR); HOperatorSet.GenEmptyObj(out ho_RegionLinesR1); HOperatorSet.GenEmptyObj(out ho_RegionUnionR); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsR); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsR); HOperatorSet.GenEmptyObj(out ho_RegionFillUpR); HOperatorSet.GenEmptyObj(out ho_ContoursSplitR); HOperatorSet.GenEmptyObj(out ho_SelectedContoursR); HOperatorSet.GenEmptyObj(out ho_UnionContoursR); HOperatorSet.GenEmptyObj(out ho_RegionR); HOperatorSet.GenEmptyObj(out ho_RegionDifferenceR); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.Union1(algorithm.Region, out RegionToDisp); try { HOperatorSet.GenRectangle1(out ho_Rectangle, DRow1m, DCol1m, DRow2m, DCol2m); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(Image, ho_Rectangle, out ho_ImageReduced); ho_Region.Dispose(); HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 128, 255); HOperatorSet.SmallestRectangle1(ho_Region, out hv_Row12, out hv_Column12, out hv_Row22, out hv_Column22); ho_RegionLines.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLines, (hv_Row12 + hv_Row22) / 2, hv_Column12, ((hv_Row12 + hv_Row22) / 2) + 1, hv_Column12); ho_RegionUnion1.Dispose(); HOperatorSet.Union1(ho_RegionLines, out ho_RegionUnion1); ho_RegionUnion2.Dispose(); HOperatorSet.Union1(ho_RegionLines, out ho_RegionUnion2); ho_RegionUnion3.Dispose(); HOperatorSet.Union1(ho_RegionLines, out ho_RegionUnion3); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 128, 255); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region1, out ho_ConnectedRegions); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_ConnectedRegions, out ho_RegionFillUp); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_RegionFillUp, out ho_SelectedRegions, "area", "and", 500, 99999000); ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions, out ho_SortedRegions, "upper_left", "true", "column"); HOperatorSet.CountObj(ho_SortedRegions, out hv_Number); // stop(); only in hdevelop hv_h = new HTuple(); hv_w = new HTuple(); HTuple end_val36 = hv_Number - 1; HTuple step_val36 = 1; for (hv_i = 2; hv_i.Continue(end_val36, step_val36); hv_i = hv_i.TupleAdd(step_val36)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_SortedRegions, out ho_ObjectSelected, hv_i); HOperatorSet.SmallestRectangle2(ho_ObjectSelected, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); ho_Rectangle1.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle1, hv_Row, hv_Column, hv_Phi, hv_Length1 * 0.85, hv_Length2); ho_ImageReduced1.Dispose(); HOperatorSet.ReduceDomain(ho_ImageReduced, ho_Rectangle1, out ho_ImageReduced1 ); //*矩形4个角点 HOperatorSet.TupleCos(hv_Phi, out hv_Cos); HOperatorSet.TupleSin(hv_Phi, out hv_Sin); //*dev_set_color('green') hv_RT_X = (((-hv_Length1) * 0.85) * hv_Cos) - (hv_Length2 * hv_Sin); hv_RT_Y = (((-hv_Length1) * 0.85) * hv_Sin) + (hv_Length2 * hv_Cos); ho_Circle1.Dispose(); HOperatorSet.GenCircle(out ho_Circle1, hv_Row - hv_RT_Y, hv_Column + hv_RT_X, 0.5); //*最小矩形的顶点A hv_AX = (((-hv_Length1) * 0.85) * hv_Cos) - (hv_Length2 * hv_Sin); hv_AY = (((-hv_Length1) * 0.85) * hv_Sin) + (hv_Length2 * hv_Cos); //*dev_set_color('red') hv_RB_X = ((hv_Length1 * 0.85) * hv_Cos) - (hv_Length2 * hv_Sin); hv_RB_Y = ((hv_Length1 * 0.85) * hv_Sin) + (hv_Length2 * hv_Cos); ho_Circle2.Dispose(); HOperatorSet.GenCircle(out ho_Circle2, hv_Row - hv_RB_Y, hv_Column + hv_RB_X, 0.5); //*最小矩形的顶点B hv_BX = ((hv_Length1 * 0.85) * hv_Cos) - (hv_Length2 * hv_Sin); hv_BY = ((hv_Length1 * 0.85) * hv_Sin) + (hv_Length2 * hv_Cos); //*dev_set_color('yellow') hv_LB_X = ((hv_Length1 * 0.9) * hv_Cos) + (hv_Length2 * hv_Sin); hv_LB_Y = ((hv_Length1 * 0.9) * hv_Sin) - (hv_Length2 * hv_Cos); ho_Circle3.Dispose(); HOperatorSet.GenCircle(out ho_Circle3, hv_Row - hv_LB_Y, hv_Column + hv_LB_X, 0.5); //*最小矩形的顶点C hv_CX = ((hv_Length1 * 0.85) * hv_Cos) + (hv_Length2 * hv_Sin); hv_CY = ((hv_Length1 * 0.85) * hv_Sin) - (hv_Length2 * hv_Cos); //*dev_set_color('pink') hv_LT_X = (((-hv_Length1) * 0.85) * hv_Cos) + (hv_Length2 * hv_Sin); hv_LT_Y = (((-hv_Length1) * 0.85) * hv_Sin) - (hv_Length2 * hv_Cos); ho_Circle4.Dispose(); HOperatorSet.GenCircle(out ho_Circle4, hv_Row - hv_LT_Y, hv_Column + hv_LT_X, 0.5); //*最小矩形的顶点D hv_DX = (((-hv_Length1) * 0.85) * hv_Cos) + (hv_Length2 * hv_Sin); hv_DY = (((-hv_Length1) * 0.85) * hv_Sin) - (hv_Length2 * hv_Cos); //stop () ho_RegionUnionc1.Dispose(); HOperatorSet.Union2(ho_Circle1, ho_Circle2, out ho_RegionUnionc1); ho_RegionUnionc2.Dispose(); HOperatorSet.Union2(ho_RegionUnionc1, ho_Circle3, out ho_RegionUnionc2); ho_RegionUnionc3.Dispose(); HOperatorSet.Union2(ho_RegionUnionc2, ho_Circle4, out ho_RegionUnionc3); ho_ConnectedRegionsc.Dispose(); HOperatorSet.Connection(ho_RegionUnionc3, out ho_ConnectedRegionsc); HOperatorSet.CountObj(ho_RegionUnionc3, out hv_Number1); ho_SortedRegions1.Dispose(); HOperatorSet.SortRegion(ho_ConnectedRegionsc, out ho_SortedRegions1, "upper_left", "true", "row"); HOperatorSet.AreaCenter(ho_SortedRegions1, out hv_Area, out hv_Row1, out hv_Column1); HOperatorSet.DistancePp(hv_Row1.TupleSelect(0), hv_Column1.TupleSelect(0), hv_Row1.TupleSelect(1), hv_Column1.TupleSelect(1), out hv_Distance); HOperatorSet.DistancePl(hv_Row1.TupleSelect(0), hv_Column1.TupleSelect(0), hv_Row1.TupleSelect(2), hv_Column1.TupleSelect(2), hv_Row1.TupleSelect( 3), hv_Column1.TupleSelect(3), out hv_Distance1); hv_h = hv_h.TupleConcat((hv_Distance1 * 1) / 0.9); hv_w = hv_w.TupleConcat(hv_Distance); //gen_region_line (RegionLines2, (Row1[0]+Row1[1])/2, (Column1[0]+Column1[1])/2, (Row1[2]+Row1[3])/2, (Column1[2]+Column1[3])/2) hv_shapeParam = new HTuple(); hv_shapeParam = hv_shapeParam.TupleConcat(((hv_Row1.TupleSelect( 0)) + (hv_Row1.TupleSelect(1))) / 2); hv_shapeParam = hv_shapeParam.TupleConcat(((hv_Column1.TupleSelect( 0)) + (hv_Column1.TupleSelect(1))) / 2); hv_shapeParam = hv_shapeParam.TupleConcat(((hv_Row1.TupleSelect( 2)) + (hv_Row1.TupleSelect(3))) / 2); hv_shapeParam = hv_shapeParam.TupleConcat(((hv_Column1.TupleSelect( 2)) + (hv_Column1.TupleSelect(3))) / 2); //shapeParam := [Row12,(Column22+Column12)/2,Row22,(Column22+Column12)/2] //找左侧点 HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandleL); HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandleL, hv_Width, hv_Height); HOperatorSet.AddMetrologyObjectGeneric(hv_MetrologyHandleL, "line", hv_shapeParam, hv_Distance / 2, 1, 1, 60, new HTuple(), new HTuple(), out hv_Index); //设置参数 HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleL, "all", "measure_transition", "negative"); HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleL, "all", "num_measures", 100); HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleL, "all", "num_instances", 1); HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleL, "all", "measure_select", "last"); //开始找边缘 HOperatorSet.ApplyMetrologyModel(ho_ImageReduced1, hv_MetrologyHandleL); ho_ContoursL.Dispose(); HOperatorSet.GetMetrologyObjectMeasures(out ho_ContoursL, hv_MetrologyHandleL, "all", "all", out hv_RowL, out hv_ColumnL); if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red"); } HOperatorSet.DispCross(3600, hv_RowL, hv_ColumnL, 6, hv_Phi); //左侧点,用一Row,只取最左边点 //gen_cross_contour_xld (CrossL, RowL, ColumnL, 6, 0) ///释放测量句柄 HOperatorSet.ClearMetrologyModel(hv_MetrologyHandleL); //gen_region_line (RegionLines, Row11, Column11, Row11+1, Column11) //union1 (RegionLines, RegionUnion1) for (hv_l = 0; (int)hv_l <= (int)((new HTuple(hv_RowL.TupleLength())) - 2); hv_l = (int)hv_l + 1) { ho_RegionLinesL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLinesL, hv_RowL.TupleSelect(hv_l), hv_ColumnL.TupleSelect(hv_l), hv_RowL.TupleSelect(hv_l + 1), hv_ColumnL.TupleSelect( hv_l + 1)); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_RegionUnion1, ho_RegionLinesL, out ExpTmpOutVar_0 ); ho_RegionUnion1.Dispose(); ho_RegionUnion1 = ExpTmpOutVar_0; } } if (HDevWindowStack.IsOpen()) { //dev_set_color ('blue') } //gen_contour_polygon_xld (Contour, RowL, ColumnL) //stop () //disp_obj (Image, 3600) ho_RegionLinesL1.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLinesL1, hv_RowL.TupleSelect(0), hv_ColumnL.TupleSelect(0), hv_RowL.TupleSelect((new HTuple(hv_RowL.TupleLength() )) - 1), hv_ColumnL.TupleSelect((new HTuple(hv_RowL.TupleLength())) - 1)); ho_RegionUnionL.Dispose(); HOperatorSet.Union2(ho_RegionUnion1, ho_RegionLinesL1, out ho_RegionUnionL ); ho_ConnectedRegionsL.Dispose(); HOperatorSet.Connection(ho_RegionUnionL, out ho_ConnectedRegionsL); ho_SelectedRegionsL.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegionsL, out ho_SelectedRegionsL, "max_area", 70); ho_RegionFillUpL.Dispose(); HOperatorSet.FillUp(ho_SelectedRegionsL, out ho_RegionFillUpL); ho_ContoursL.Dispose(); HOperatorSet.GenContourRegionXld(ho_RegionFillUpL, out ho_ContoursL, "border"); ho_ContoursSplitL.Dispose(); HOperatorSet.SegmentContoursXld(ho_ContoursL, out ho_ContoursSplitL, "lines_circles", 5, 8, 3.5); ho_SelectedContoursL.Dispose(); HOperatorSet.SelectContoursXld(ho_ContoursSplitL, out ho_SelectedContoursL, "contour_length", 70, 2000, -0.5, 0.5); //*** ho_UnionContoursL.Dispose(); HOperatorSet.UnionAdjacentContoursXld(ho_SelectedContoursL, out ho_UnionContoursL, 10, 1, "attr_keep"); ho_RegionL.Dispose(); HOperatorSet.GenRegionContourXld(ho_UnionContoursL, out ho_RegionL, "filled"); ho_RegionDifferenceL.Dispose(); HOperatorSet.Difference(ho_RegionFillUpL, ho_RegionL, out ho_RegionDifferenceL ); HOperatorSet.CountObj(ho_RegionDifferenceL, out hv_NumberL); //* //找右侧点 HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandleR); HOperatorSet.SetMetrologyModelImageSize(hv_MetrologyHandleR, hv_Width, hv_Height); HOperatorSet.AddMetrologyObjectGeneric(hv_MetrologyHandleR, "line", hv_shapeParam, hv_Distance / 2, 1, 1, 60, new HTuple(), new HTuple(), out hv_Index); //设置参数 HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleR, "all", "measure_transition", "positive"); HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleR, "all", "num_measures", 100); HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleR, "all", "num_instances", 1); HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandleR, "all", "measure_select", "first"); //开始找边缘 HOperatorSet.ApplyMetrologyModel(ho_ImageReduced1, hv_MetrologyHandleR); ho_ContoursR.Dispose(); HOperatorSet.GetMetrologyObjectMeasures(out ho_ContoursR, hv_MetrologyHandleR, "all", "all", out hv_RowR, out hv_ColumnR); //disp_obj (Image, 3600) if (HDevWindowStack.IsOpen()) { //dev_set_color ('red') } //disp_cross (3600, RowR, ColumnR, 6, Phi) //*右侧点,用一Row,只取最右边点 //gen_cross_contour_xld (CrossR, RowR, ColumnR, 6, 0) ///释放测量句柄 HOperatorSet.ClearMetrologyModel(hv_MetrologyHandleR); //close_measure (MeasureHandle1) //stop () //gen_region_line (RegionLines, Row11, Column11, Row11+1, Column11) //union1 (RegionLines, RegionUnion1) for (hv_r = 0; (int)hv_r <= (int)((new HTuple(hv_RowR.TupleLength())) - 2); hv_r = (int)hv_r + 1) { ho_RegionLinesR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLinesR, hv_RowR.TupleSelect(hv_r), hv_ColumnR.TupleSelect(hv_r), hv_RowR.TupleSelect(hv_r + 1), hv_ColumnR.TupleSelect( hv_r + 1)); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_RegionUnion2, ho_RegionLinesR, out ExpTmpOutVar_0 ); ho_RegionUnion2.Dispose(); ho_RegionUnion2 = ExpTmpOutVar_0; } } ho_RegionLinesR1.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLinesR1, hv_RowR.TupleSelect(0), hv_ColumnR.TupleSelect(0), hv_RowR.TupleSelect((new HTuple(hv_RowR.TupleLength() )) - 1), hv_ColumnR.TupleSelect((new HTuple(hv_RowR.TupleLength())) - 1)); ho_RegionUnionR.Dispose(); HOperatorSet.Union2(ho_RegionUnion2, ho_RegionLinesR1, out ho_RegionUnionR ); ho_ConnectedRegionsR.Dispose(); HOperatorSet.Connection(ho_RegionUnionR, out ho_ConnectedRegionsR); ho_SelectedRegionsR.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegionsR, out ho_SelectedRegionsR, "max_area", 70); ho_RegionFillUpR.Dispose(); HOperatorSet.FillUp(ho_SelectedRegionsR, out ho_RegionFillUpR); ho_ContoursR.Dispose(); HOperatorSet.GenContourRegionXld(ho_RegionFillUpR, out ho_ContoursR, "border"); ho_ContoursSplitR.Dispose(); HOperatorSet.SegmentContoursXld(ho_ContoursR, out ho_ContoursSplitR, "lines_circles", 5, 8, 3.5); ho_SelectedContoursR.Dispose(); HOperatorSet.SelectContoursXld(ho_ContoursSplitR, out ho_SelectedContoursR, "contour_length", 70, 2000, -0.5, 0.5); ho_UnionContoursR.Dispose(); HOperatorSet.UnionAdjacentContoursXld(ho_SelectedContoursR, out ho_UnionContoursR, 10, 1, "attr_keep"); ho_RegionR.Dispose(); HOperatorSet.GenRegionContourXld(ho_UnionContoursR, out ho_RegionR, "filled"); ho_RegionDifferenceR.Dispose(); HOperatorSet.Difference(ho_RegionFillUpR, ho_RegionR, out ho_RegionDifferenceR ); HOperatorSet.CountObj(ho_RegionDifferenceR, out hv_NumberR); //stop () if ((int)(new HTuple(hv_NumberL.TupleGreater(0))) != 0) { HOperatorSet.AreaCenter(ho_RegionDifferenceL, out hv_AreaL, out hv_RowL, out hv_ColumnL); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_RegionUnion3, ho_RegionDifferenceL, out ExpTmpOutVar_0 ); ho_RegionUnion3.Dispose(); ho_RegionUnion3 = ExpTmpOutVar_0; } } if ((int)(new HTuple(hv_NumberR.TupleGreater(0))) != 0) { HOperatorSet.AreaCenter(ho_RegionDifferenceR, out hv_AreaR, out hv_RowR, out hv_ColumnR); { HObject ExpTmpOutVar_0; HOperatorSet.Union2(ho_RegionUnion3, ho_RegionDifferenceR, out ExpTmpOutVar_0 ); ho_RegionUnion3.Dispose(); ho_RegionUnion3 = ExpTmpOutVar_0; } } //union2 (RegionDifferenceL, RegionDifferenceR, RegionUnionLR) //union2 (RegionUnion3, RegionUnionLR, RegionUnion3) } HOperatorSet.AreaCenter(ho_RegionUnion3, out hv_Area1, out hv_Row2, out hv_Column2); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionUnion3, out ho_ConnectedRegions1); HOperatorSet.AreaCenter(ho_ConnectedRegions1, out hv_Area2, out hv_Row3, out hv_Column3); hv_hm = (hv_h.TupleMin()) / (hv_h.TupleMean()); hv_wm = (hv_w.TupleMax()) / (hv_w.TupleMean()); ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_SortedRegions, out ho_ObjectSelected, hv_Number); HOperatorSet.SmallestRectangle1(ho_ObjectSelected, out hv_Row13, out hv_Column13, out hv_Row23, out hv_Column23); hv_zh = hv_Column23 - hv_Column13; HOperatorSet.Union1(ho_ConnectedRegions1, out RegionToDisp); HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("最短比值"); hv_result = hv_result.TupleConcat(hv_hm.D); hv_result = hv_result.TupleConcat("最宽比值"); hv_result = hv_result.TupleConcat(hv_wm.D); hv_result = hv_result.TupleConcat("缺陷总面积"); hv_result = hv_result.TupleConcat(hv_Area1.D); hv_result = hv_result.TupleConcat("最大缺陷面积"); hv_result = hv_result.TupleConcat(hv_Area2.D); hv_result = hv_result.TupleConcat("宽度"); hv_result = hv_result.TupleConcat(hv_zh.D); result = hv_result.Clone(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); ho_RegionLines.Dispose(); ho_RegionUnion1.Dispose(); ho_RegionUnion2.Dispose(); ho_RegionUnion3.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionFillUp.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_ObjectSelected.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced1.Dispose(); ho_Circle1.Dispose(); ho_Circle2.Dispose(); ho_Circle3.Dispose(); ho_Circle4.Dispose(); ho_RegionUnionc1.Dispose(); ho_RegionUnionc2.Dispose(); ho_RegionUnionc3.Dispose(); ho_ConnectedRegionsc.Dispose(); ho_SortedRegions1.Dispose(); ho_ContoursL.Dispose(); ho_RegionLinesL.Dispose(); ho_RegionLinesL1.Dispose(); ho_RegionUnionL.Dispose(); ho_ConnectedRegionsL.Dispose(); ho_SelectedRegionsL.Dispose(); ho_RegionFillUpL.Dispose(); ho_ContoursSplitL.Dispose(); ho_SelectedContoursL.Dispose(); ho_UnionContoursL.Dispose(); ho_RegionL.Dispose(); ho_RegionDifferenceL.Dispose(); ho_ContoursR.Dispose(); ho_RegionLinesR.Dispose(); ho_RegionLinesR1.Dispose(); ho_RegionUnionR.Dispose(); ho_ConnectedRegionsR.Dispose(); ho_SelectedRegionsR.Dispose(); ho_RegionFillUpR.Dispose(); ho_ContoursSplitR.Dispose(); ho_SelectedContoursR.Dispose(); ho_UnionContoursR.Dispose(); ho_RegionR.Dispose(); ho_RegionDifferenceR.Dispose(); ho_ConnectedRegions1.Dispose(); algorithm.Region.Dispose(); } catch { HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("最短比值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("最宽比值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("缺陷总面积"); hv_result = hv_result.TupleConcat(999999); hv_result = hv_result.TupleConcat("最大缺陷面积"); hv_result = hv_result.TupleConcat(999999); hv_result = hv_result.TupleConcat("宽度"); hv_result = hv_result.TupleConcat(999999); result = hv_result.Clone(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); ho_RegionLines.Dispose(); ho_RegionUnion1.Dispose(); ho_RegionUnion2.Dispose(); ho_RegionUnion3.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionFillUp.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_ObjectSelected.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced1.Dispose(); ho_Circle1.Dispose(); ho_Circle2.Dispose(); ho_Circle3.Dispose(); ho_Circle4.Dispose(); ho_RegionUnionc1.Dispose(); ho_RegionUnionc2.Dispose(); ho_RegionUnionc3.Dispose(); ho_ConnectedRegionsc.Dispose(); ho_SortedRegions1.Dispose(); ho_ContoursL.Dispose(); ho_RegionLinesL.Dispose(); ho_RegionLinesL1.Dispose(); ho_RegionUnionL.Dispose(); ho_ConnectedRegionsL.Dispose(); ho_SelectedRegionsL.Dispose(); ho_RegionFillUpL.Dispose(); ho_ContoursSplitL.Dispose(); ho_SelectedContoursL.Dispose(); ho_UnionContoursL.Dispose(); ho_RegionL.Dispose(); ho_RegionDifferenceL.Dispose(); ho_ContoursR.Dispose(); ho_RegionLinesR.Dispose(); ho_RegionLinesR1.Dispose(); ho_RegionUnionR.Dispose(); ho_ConnectedRegionsR.Dispose(); ho_SelectedRegionsR.Dispose(); ho_RegionFillUpR.Dispose(); ho_ContoursSplitR.Dispose(); ho_SelectedContoursR.Dispose(); ho_UnionContoursR.Dispose(); ho_RegionR.Dispose(); ho_RegionDifferenceR.Dispose(); ho_ConnectedRegions1.Dispose(); algorithm.Region.Dispose(); } finally { ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); ho_RegionLines.Dispose(); ho_RegionUnion1.Dispose(); ho_RegionUnion2.Dispose(); ho_RegionUnion3.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionFillUp.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_ObjectSelected.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced1.Dispose(); ho_Circle1.Dispose(); ho_Circle2.Dispose(); ho_Circle3.Dispose(); ho_Circle4.Dispose(); ho_RegionUnionc1.Dispose(); ho_RegionUnionc2.Dispose(); ho_RegionUnionc3.Dispose(); ho_ConnectedRegionsc.Dispose(); ho_SortedRegions1.Dispose(); ho_ContoursL.Dispose(); ho_RegionLinesL.Dispose(); ho_RegionLinesL1.Dispose(); ho_RegionUnionL.Dispose(); ho_ConnectedRegionsL.Dispose(); ho_SelectedRegionsL.Dispose(); ho_RegionFillUpL.Dispose(); ho_ContoursSplitL.Dispose(); ho_SelectedContoursL.Dispose(); ho_UnionContoursL.Dispose(); ho_RegionL.Dispose(); ho_RegionDifferenceL.Dispose(); ho_ContoursR.Dispose(); ho_RegionLinesR.Dispose(); ho_RegionLinesR1.Dispose(); ho_RegionUnionR.Dispose(); ho_ConnectedRegionsR.Dispose(); ho_SelectedRegionsR.Dispose(); ho_RegionFillUpR.Dispose(); ho_ContoursSplitR.Dispose(); ho_SelectedContoursR.Dispose(); ho_UnionContoursR.Dispose(); ho_RegionR.Dispose(); ho_RegionDifferenceR.Dispose(); ho_ConnectedRegions1.Dispose(); algorithm.Region.Dispose(); } }
public void TeethDist(HObject ho_Region, out HObject ho_Cross, HTuple hv_vOrh, out HTuple hv_maxDist, out HTuple hv_minDist, out HTuple hv_meanDist) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; long SP_O = 0; // Local iconic variables HObject ho_RegionErosion, ho_ConnectedRegions; HObject ho_SortedRegions = null, ho_EmptyRegion = null, ho_ObjectSelected = null; HObject ho_RegionTrans = null, ho_SortedRegions1 = null, ho_SelectedRegions1 = null; HObject ho_ObjectSelected1 = null, ho_SelectedRegions2 = null; HObject ho_ObjectSelected2 = null; // Local control variables HTuple hv_Number = new HTuple(), hv_Index = new HTuple(); HTuple hv_Area = new HTuple(), hv_Row = new HTuple(), hv_Column = new HTuple(); HTuple hv_Number1 = new HTuple(), hv_Number2 = new HTuple(); HTuple hv_dist = new HTuple(), hv_Index1 = new HTuple(), hv_Area1 = new HTuple(); HTuple hv_Row4 = new HTuple(), hv_Column3 = new HTuple(), hv_Area2 = new HTuple(); HTuple hv_Row5 = new HTuple(), hv_Column4 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Cross); HOperatorSet.GenEmptyObj(out ho_RegionErosion); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SortedRegions); HOperatorSet.GenEmptyObj(out ho_EmptyRegion); HOperatorSet.GenEmptyObj(out ho_ObjectSelected); HOperatorSet.GenEmptyObj(out ho_RegionTrans); HOperatorSet.GenEmptyObj(out ho_SortedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions1); HOperatorSet.GenEmptyObj(out ho_ObjectSelected1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions2); HOperatorSet.GenEmptyObj(out ho_ObjectSelected2); try { ho_RegionErosion.Dispose(); HOperatorSet.ErosionCircle(ho_Region, out ho_RegionErosion, 3.5); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionErosion, out ho_ConnectedRegions); if ((int)(new HTuple(hv_vOrh.TupleEqual("h"))) != 0) { ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_ConnectedRegions, out ho_SortedRegions, "character", "true", "column"); HOperatorSet.CountObj(ho_SortedRegions, out hv_Number); ho_EmptyRegion.Dispose(); HOperatorSet.GenEmptyRegion(out ho_EmptyRegion); for (hv_Index = 3; hv_Index.Continue(hv_Number - 2, 1); hv_Index = hv_Index.TupleAdd(1)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_SortedRegions, out ho_ObjectSelected, hv_Index); OTemp[SP_O] = ho_EmptyRegion.CopyObj(1, -1); SP_O++; ho_EmptyRegion.Dispose(); HOperatorSet.ConcatObj(ho_ObjectSelected, OTemp[SP_O - 1], out ho_EmptyRegion ); OTemp[SP_O - 1].Dispose(); SP_O = 0; } ho_RegionTrans.Dispose(); HOperatorSet.ShapeTrans(ho_EmptyRegion, out ho_RegionTrans, "outer_circle"); ho_SortedRegions1.Dispose(); HOperatorSet.SortRegion(ho_RegionTrans, out ho_SortedRegions1, "character", "true", "row"); HOperatorSet.AreaCenter(ho_SortedRegions1, out hv_Area, out hv_Row, out hv_Column); ho_Cross.Dispose(); HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row, hv_Column, 6, 0.785398); HOperatorSet.CountObj(ho_SortedRegions1, out hv_Number1); ho_SelectedRegions1.Dispose(); HOperatorSet.SelectShape(ho_SortedRegions1, out ho_SelectedRegions1, "row", "and", (hv_Row.TupleSelect(0)) - 10, (hv_Row.TupleSelect(0)) + 10); HOperatorSet.CountObj(ho_SelectedRegions1, out hv_Number2); hv_dist = new HTuple(); for (hv_Index1 = 1; hv_Index1.Continue(hv_Number2 - 1, 1); hv_Index1 = hv_Index1.TupleAdd(1)) { ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions1, out ho_ObjectSelected1, hv_Index1); HOperatorSet.AreaCenter(ho_ObjectSelected1, out hv_Area1, out hv_Row4, out hv_Column3); ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions1, out ho_ObjectSelected1, hv_Index1 + 1); HOperatorSet.AreaCenter(ho_ObjectSelected1, out hv_Area2, out hv_Row5, out hv_Column4); hv_dist = hv_dist.TupleConcat(hv_Column4 - hv_Column3); } ho_SelectedRegions2.Dispose(); HOperatorSet.SelectShape(ho_SortedRegions1, out ho_SelectedRegions2, "row", "and", (hv_Row.TupleSelect(hv_Number1 - 1)) - 10, (hv_Row.TupleSelect(hv_Number1 - 1)) + 10); HOperatorSet.CountObj(ho_SelectedRegions2, out hv_Number2); for (hv_Index1 = 1; hv_Index1.Continue(hv_Number2 - 1, 1); hv_Index1 = hv_Index1.TupleAdd(1)) { ho_ObjectSelected2.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions2, out ho_ObjectSelected2, hv_Index1); HOperatorSet.AreaCenter(ho_ObjectSelected2, out hv_Area1, out hv_Row4, out hv_Column3); ho_ObjectSelected2.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions2, out ho_ObjectSelected2, hv_Index1 + 1); HOperatorSet.AreaCenter(ho_ObjectSelected2, out hv_Area2, out hv_Row5, out hv_Column4); hv_dist = hv_dist.TupleConcat(hv_Column4 - hv_Column3); } } else { ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_ConnectedRegions, out ho_SortedRegions, "character", "true", "row"); HOperatorSet.CountObj(ho_SortedRegions, out hv_Number); ho_EmptyRegion.Dispose(); HOperatorSet.GenEmptyRegion(out ho_EmptyRegion); for (hv_Index = 3; hv_Index.Continue(hv_Number - 2, 1); hv_Index = hv_Index.TupleAdd(1)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_SortedRegions, out ho_ObjectSelected, hv_Index); OTemp[SP_O] = ho_EmptyRegion.CopyObj(1, -1); SP_O++; ho_EmptyRegion.Dispose(); HOperatorSet.ConcatObj(ho_ObjectSelected, OTemp[SP_O - 1], out ho_EmptyRegion ); OTemp[SP_O - 1].Dispose(); SP_O = 0; } ho_RegionTrans.Dispose(); HOperatorSet.ShapeTrans(ho_EmptyRegion, out ho_RegionTrans, "outer_circle"); ho_SortedRegions1.Dispose(); HOperatorSet.SortRegion(ho_RegionTrans, out ho_SortedRegions1, "character", "true", "column"); HOperatorSet.AreaCenter(ho_SortedRegions1, out hv_Area, out hv_Row, out hv_Column); ho_Cross.Dispose(); HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row, hv_Column, 6, 0.785398); HOperatorSet.CountObj(ho_SortedRegions1, out hv_Number1); ho_SelectedRegions1.Dispose(); HOperatorSet.SelectShape(ho_SortedRegions1, out ho_SelectedRegions1, "column", "and", (hv_Column.TupleSelect(0)) - 10, (hv_Column.TupleSelect(0)) + 10); HOperatorSet.CountObj(ho_SelectedRegions1, out hv_Number2); hv_dist = new HTuple(); for (hv_Index1 = 1; hv_Index1.Continue(hv_Number2 - 1, 1); hv_Index1 = hv_Index1.TupleAdd(1)) { ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions1, out ho_ObjectSelected1, hv_Index1); HOperatorSet.AreaCenter(ho_ObjectSelected1, out hv_Area1, out hv_Row4, out hv_Column3); ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions1, out ho_ObjectSelected1, hv_Index1 + 1); HOperatorSet.AreaCenter(ho_ObjectSelected1, out hv_Area2, out hv_Row5, out hv_Column4); hv_dist = hv_dist.TupleConcat(hv_Row5 - hv_Row4); } ho_SelectedRegions2.Dispose(); HOperatorSet.SelectShape(ho_SortedRegions1, out ho_SelectedRegions2, "column", "and", (hv_Column.TupleSelect(hv_Number1 - 1)) - 10, (hv_Column.TupleSelect( hv_Number1 - 1)) + 10); HOperatorSet.CountObj(ho_SelectedRegions2, out hv_Number2); for (hv_Index1 = 1; hv_Index1.Continue(hv_Number2 - 1, 1); hv_Index1 = hv_Index1.TupleAdd(1)) { ho_ObjectSelected2.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions2, out ho_ObjectSelected2, hv_Index1); HOperatorSet.AreaCenter(ho_ObjectSelected2, out hv_Area1, out hv_Row4, out hv_Column3); ho_ObjectSelected2.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions2, out ho_ObjectSelected2, hv_Index1 + 1); HOperatorSet.AreaCenter(ho_ObjectSelected2, out hv_Area2, out hv_Row5, out hv_Column4); hv_dist = hv_dist.TupleConcat(hv_Row5 - hv_Row4); } } hv_maxDist = hv_dist.TupleMax(); hv_minDist = hv_dist.TupleMin(); hv_meanDist = hv_dist.TupleMean(); ho_RegionErosion.Dispose(); ho_ConnectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_EmptyRegion.Dispose(); ho_ObjectSelected.Dispose(); ho_RegionTrans.Dispose(); ho_SortedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_ObjectSelected1.Dispose(); ho_SelectedRegions2.Dispose(); ho_ObjectSelected2.Dispose(); return; } catch (HalconException HDevExpDefaultException) { ho_RegionErosion.Dispose(); ho_ConnectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_EmptyRegion.Dispose(); ho_ObjectSelected.Dispose(); ho_RegionTrans.Dispose(); ho_SortedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_ObjectSelected1.Dispose(); ho_SelectedRegions2.Dispose(); ho_ObjectSelected2.Dispose(); throw HDevExpDefaultException; } }
// Main procedure private HTuple action() { // Local iconic variables HObject ho_Image, ho_ImageRotate, ho_GrayImage; HObject ho_ImageMedian, ho_Region, ho_ConnectedRegions; HObject ho_SelectedRegions, ho_SelectedRegions2, ho_SelectedRegions1; HObject ho_SelectedRegions3, ho_SortedRegions, ho_RegionUnion; HObject ho_Rectangle, ho_ImageReduced, ho_GrayImageA, ho_GragImageA; HObject ho_RegionsA_temp, ho_ConnectedRegionsA_temp, ho_SelectedRegionsA_temp; HObject ho_ImageAffineTrans, ho_RegionsA, ho_RegionDilationA; HObject ho_ConnectedRegionsA, ho_SelectedRegionsA, ho_RegionsA1; HObject ho_RegionOpeningA, ho_SelectedRegionsA1, ho_RegionUnionA; HObject ho_SelectedRegionsA2, ho_RegionsB, ho_ConnectedRegionsB; HObject ho_SelectedRegionsB, ho_RectangleB1, ho_RectangleB2; HObject ho_RegionDifferenceB, ho_ImageReducedB1, ho_RegionB1; HObject ho_ConnectedRegionsB2, ho_SelectedRegionsB2, ho_outContours; HObject ho_SelectedContours, ho_SortedContours, ho_Region1; HObject ho_ConnectedRegions1, ho_SelectedRegions4, ho_SelectedRegions5; HObject ho_SelectedRegions6, ho_Contours, ho_SortedContours3; HObject ho_obj = null, ho_objj = null, ho_ContoursSplit = null; HObject ho_SelectedXLD = null, ho_SortedContours1 = null, ho_M = null; HObject ho_Contour = null, ho_SelectedXLD1 = null, ho_SortedContours2 = null; HObject ho_ObjectSelectedB = null; // Local control variables HTuple hv_NumberB = null, hv_Row1 = null, hv_Column1 = null; HTuple hv_Phi = null, hv_Length1 = null, hv_Length2 = null; HTuple hv_Phi_temp = null, hv_Area_temp = null, hv_Row_temp = null; HTuple hv_Column_temp = null, hv_HomMat2D = null, hv_RowA1 = null; HTuple hv_ColumnA1 = null, hv_RowA2 = null, hv_ColumnA2 = null; HTuple hv_RowA3 = null, hv_ColumnA3 = null, hv_RowA4 = null; HTuple hv_ColumnA4 = null, hv_RowB16 = null, hv_ColumnB16 = null; HTuple hv_PhiB3 = null, hv_LengthB1 = null, hv_LengthB2 = null; HTuple hv_AreaB = null, hv_RowB2 = null, hv_ColumnB2 = null; HTuple hv_Number = null, hv_Number3 = null, hv_A1 = null; HTuple hv_A2 = null, hv_B1 = null, hv_B2 = null, hv_C1 = null; HTuple hv_C2 = null, hv_C3 = null, hv_C4 = null, hv_i = null; HTuple hv_Ro1 = new HTuple(), hv_Co1 = new HTuple(), hv_MinBR = new HTuple(); HTuple hv_MaxBR = new HTuple(), hv_MinBC = new HTuple(); HTuple hv_MaxBC = new HTuple(), hv_BR = new HTuple(), hv_BC = new HTuple(); HTuple hv_j = new HTuple(), hv_Number1 = new HTuple(); HTuple hv_a = new HTuple(), hv_Ro2 = new HTuple(), hv_Co2 = new HTuple(); HTuple hv_LUC = new HTuple(), hv_RUC = new HTuple(), hv_Ro3 = new HTuple(); HTuple hv_Co3 = new HTuple(), hv_LDC = new HTuple(), hv_RDC = new HTuple(); HTuple hv_RowBegin = new HTuple(), hv_ColBegin = new HTuple(); HTuple hv_RowEnd = new HTuple(), hv_ColEnd = new HTuple(); HTuple hv_Nr = new HTuple(), hv_Nc = new HTuple(), hv_Dist = new HTuple(); HTuple hv_Rowc = new HTuple(), hv_Colc = new HTuple(); HTuple hv_MeanR = new HTuple(), hv_H1 = new HTuple(), hv_H3 = new HTuple(); HTuple hv_Number2 = new HTuple(), hv_b = new HTuple(); HTuple hv_Ro4 = new HTuple(), hv_Co4 = new HTuple(), hv_LUR = new HTuple(); HTuple hv_LDR = new HTuple(), hv_Ro5 = new HTuple(), hv_Co5 = new HTuple(); HTuple hv_RUR = new HTuple(), hv_RDR = new HTuple(), hv_MeanC = new HTuple(); HTuple hv_H4 = new HTuple(), hv_H2 = new HTuple(), hv_Distance1 = new HTuple(); HTuple hv_Distance2 = new HTuple(), hv_AreaA = null, hv_RowA = null; HTuple hv_ColumnA = null, hv_phi = null, hv_paozhengwei = null; HTuple hv_k = null, hv_Indices = null, hv_liebo = null; HTuple hv_NumB = null, hv_count = null, hv_I = new HTuple(); HTuple hv_AreaB1 = new HTuple(), hv_RowB3 = new HTuple(); HTuple hv_ColumnB3 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_ImageRotate); HOperatorSet.GenEmptyObj(out ho_GrayImage); HOperatorSet.GenEmptyObj(out ho_ImageMedian); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions2); HOperatorSet.GenEmptyObj(out ho_SelectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions3); HOperatorSet.GenEmptyObj(out ho_SortedRegions); HOperatorSet.GenEmptyObj(out ho_RegionUnion); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_GrayImageA); HOperatorSet.GenEmptyObj(out ho_GragImageA); HOperatorSet.GenEmptyObj(out ho_RegionsA_temp); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsA_temp); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsA_temp); HOperatorSet.GenEmptyObj(out ho_ImageAffineTrans); HOperatorSet.GenEmptyObj(out ho_RegionsA); HOperatorSet.GenEmptyObj(out ho_RegionDilationA); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsA); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsA); HOperatorSet.GenEmptyObj(out ho_RegionsA1); HOperatorSet.GenEmptyObj(out ho_RegionOpeningA); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsA1); HOperatorSet.GenEmptyObj(out ho_RegionUnionA); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsA2); HOperatorSet.GenEmptyObj(out ho_RegionsB); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsB); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsB); HOperatorSet.GenEmptyObj(out ho_RectangleB1); HOperatorSet.GenEmptyObj(out ho_RectangleB2); HOperatorSet.GenEmptyObj(out ho_RegionDifferenceB); HOperatorSet.GenEmptyObj(out ho_ImageReducedB1); HOperatorSet.GenEmptyObj(out ho_RegionB1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegionsB2); HOperatorSet.GenEmptyObj(out ho_SelectedRegionsB2); HOperatorSet.GenEmptyObj(out ho_outContours); HOperatorSet.GenEmptyObj(out ho_SelectedContours); HOperatorSet.GenEmptyObj(out ho_SortedContours); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions4); HOperatorSet.GenEmptyObj(out ho_SelectedRegions5); HOperatorSet.GenEmptyObj(out ho_SelectedRegions6); HOperatorSet.GenEmptyObj(out ho_Contours); HOperatorSet.GenEmptyObj(out ho_SortedContours3); HOperatorSet.GenEmptyObj(out ho_obj); HOperatorSet.GenEmptyObj(out ho_objj); HOperatorSet.GenEmptyObj(out ho_ContoursSplit); HOperatorSet.GenEmptyObj(out ho_SelectedXLD); HOperatorSet.GenEmptyObj(out ho_SortedContours1); HOperatorSet.GenEmptyObj(out ho_M); HOperatorSet.GenEmptyObj(out ho_Contour); HOperatorSet.GenEmptyObj(out ho_SelectedXLD1); HOperatorSet.GenEmptyObj(out ho_SortedContours2); HOperatorSet.GenEmptyObj(out ho_ObjectSelectedB); ho_Image.Dispose(); if (!this.index) { HOperatorSet.ReadImage(out ho_Image, "test.bmp"); } else { HOperatorSet.ReadImage(out ho_Image, "PersonImg\\xiaosy.png"); } //*******************************************第一组预处理*********************************************** ho_ImageRotate.Dispose(); HOperatorSet.RotateImage(ho_Image, out ho_ImageRotate, 45, "constant"); ho_GrayImage.Dispose(); HOperatorSet.Rgb1ToGray(ho_ImageRotate, out ho_GrayImage); ho_ImageMedian.Dispose(); HOperatorSet.MedianImage(ho_GrayImage, out ho_ImageMedian, "circle", 3, "mirrored"); ho_Region.Dispose(); HOperatorSet.Threshold(ho_GrayImage, out ho_Region, 200, 255); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", 150, 99999); ho_SelectedRegions2.Dispose(); HOperatorSet.SelectShape(ho_SelectedRegions, out ho_SelectedRegions2, "circularity", "and", 0.37, 0.7); ho_SelectedRegions1.Dispose(); HOperatorSet.ClosingRectangle1(ho_SelectedRegions2, out ho_SelectedRegions1, 5, 5); ho_SelectedRegions3.Dispose(); HOperatorSet.SelectShape(ho_SelectedRegions1, out ho_SelectedRegions3, "holes_num", "and", 1, 99); ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions3, out ho_SortedRegions, "first_point", "true", "column"); HOperatorSet.CountObj(ho_SelectedRegions3, out hv_NumberB); ho_RegionUnion.Dispose(); HOperatorSet.Union1(ho_SelectedRegions3, out ho_RegionUnion); HOperatorSet.SmallestRectangle2(ho_RegionUnion, out hv_Row1, out hv_Column1, out hv_Phi, out hv_Length1, out hv_Length2); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row1, hv_Column1, hv_Phi, hv_Length1, hv_Length2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_GrayImage, ho_Rectangle, out ho_ImageReduced); //*******************************************第二组预处理*********************************************** ho_GrayImageA.Dispose(); HOperatorSet.Rgb1ToGray(ho_Image, out ho_GrayImageA); ho_GragImageA.Dispose(); HOperatorSet.GrayDilationRect(ho_GrayImageA, out ho_GragImageA, 4, 4); ho_RegionsA_temp.Dispose(); HOperatorSet.Threshold(ho_GrayImageA, out ho_RegionsA_temp, 116, 218); ho_ConnectedRegionsA_temp.Dispose(); HOperatorSet.Connection(ho_RegionsA_temp, out ho_ConnectedRegionsA_temp); ho_SelectedRegionsA_temp.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegionsA_temp, out ho_SelectedRegionsA_temp, "area", "and", 108357, 495042); HOperatorSet.OrientationRegion(ho_SelectedRegionsA_temp, out hv_Phi_temp); HOperatorSet.AreaCenter(ho_SelectedRegionsA_temp, out hv_Area_temp, out hv_Row_temp, out hv_Column_temp); HOperatorSet.VectorAngleToRigid(hv_Row_temp, hv_Column_temp, hv_Phi_temp, hv_Row_temp, hv_Column_temp, (new HTuple(0)).TupleRad(), out hv_HomMat2D); ho_ImageAffineTrans.Dispose(); HOperatorSet.AffineTransImage(ho_GrayImageA, out ho_ImageAffineTrans, hv_HomMat2D, "constant", "false"); ho_RegionsA.Dispose(); HOperatorSet.Threshold(ho_ImageAffineTrans, out ho_RegionsA, 116, 218); ho_RegionDilationA.Dispose(); HOperatorSet.DilationRectangle1(ho_RegionsA, out ho_RegionDilationA, 2, 2); ho_ConnectedRegionsA.Dispose(); HOperatorSet.Connection(ho_RegionDilationA, out ho_ConnectedRegionsA); ho_SelectedRegionsA.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegionsA, out ho_SelectedRegionsA, "circularity", "and", 0.001, 0.03); ho_RegionsA1.Dispose(); HOperatorSet.Threshold(ho_GrayImageA, out ho_RegionsA1, 227, 255); ho_RegionOpeningA.Dispose(); HOperatorSet.OpeningCircle(ho_RegionsA1, out ho_RegionOpeningA, 5.5); ho_ConnectedRegionsA.Dispose(); HOperatorSet.Connection(ho_RegionOpeningA, out ho_ConnectedRegionsA); ho_SelectedRegionsA1.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegionsA, out ho_SelectedRegionsA1, "row", "and", 513.2, 601.23); ho_RegionUnionA.Dispose(); HOperatorSet.Union1(ho_SelectedRegionsA1, out ho_RegionUnionA); HOperatorSet.SmallestRectangle1(ho_RegionUnionA, out hv_RowA1, out hv_ColumnA1, out hv_RowA2, out hv_ColumnA2); ho_SelectedRegionsA2.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegionsA, out ho_SelectedRegionsA2, "width", "and", 92.694, 100); HOperatorSet.InnerRectangle1(ho_SelectedRegionsA2, out hv_RowA3, out hv_ColumnA3, out hv_RowA4, out hv_ColumnA4); ho_ConnectedRegionsA.Dispose(); HOperatorSet.Connection(ho_RegionsA1, out ho_ConnectedRegionsA); //*******************************************第三组预处理********************************************* ho_RegionsB.Dispose(); HOperatorSet.Threshold(ho_Image, out ho_RegionsB, 131, 153); ho_ConnectedRegionsB.Dispose(); HOperatorSet.Connection(ho_RegionsB, out ho_ConnectedRegionsB); ho_SelectedRegionsB.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegionsB, out ho_SelectedRegionsB, "max_area", 70); HOperatorSet.SmallestRectangle2(ho_SelectedRegionsB, out hv_RowB16, out hv_ColumnB16, out hv_PhiB3, out hv_LengthB1, out hv_LengthB2); ho_RectangleB1.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleB1, hv_RowB16 - 5, hv_ColumnB16, hv_PhiB3, hv_LengthB1 - 5, hv_LengthB2 - 5); ho_RectangleB2.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleB2, hv_RowB16 - 3, hv_ColumnB16, hv_PhiB3, hv_LengthB1 - 5, hv_LengthB2 - 18); ho_RegionDifferenceB.Dispose(); HOperatorSet.Difference(ho_RectangleB1, ho_RectangleB2, out ho_RegionDifferenceB ); ho_ImageReducedB1.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_RegionDifferenceB, out ho_ImageReducedB1 ); ho_RegionB1.Dispose(); HOperatorSet.Threshold(ho_ImageReducedB1, out ho_RegionB1, 200, 255); ho_ConnectedRegionsB2.Dispose(); HOperatorSet.Connection(ho_RegionB1, out ho_ConnectedRegionsB2); ho_SelectedRegionsB2.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegionsB2, out ho_SelectedRegionsB2, "area", "and", 26.01, 200); HOperatorSet.AreaCenter(ho_SelectedRegionsB2, out hv_AreaB, out hv_RowB2, out hv_ColumnB2); //*****************************************花瓣ABC************************************************** //边缘轮廓检测 ho_outContours.Dispose(); HOperatorSet.GenContourRegionXld(ho_SelectedRegions3, out ho_outContours, "border"); ho_SelectedContours.Dispose(); HOperatorSet.SelectContoursXld(ho_outContours, out ho_SelectedContours, "contour_length", 60, 600, -0.5, 0.5); ho_SortedContours.Dispose(); HOperatorSet.SortContoursXld(ho_SelectedContours, out ho_SortedContours, "upper_left", "true", "column"); HOperatorSet.CountObj(ho_SortedContours, out hv_Number); //中心轮廓检测 ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 0, 135); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_Region1, out ho_ConnectedRegions1); ho_SelectedRegions4.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions4, "area", "and", 230, 600); ho_SelectedRegions5.Dispose(); HOperatorSet.SelectShape(ho_SelectedRegions4, out ho_SelectedRegions5, "ratio", "and", 0.7, 1.352); ho_SelectedRegions6.Dispose(); HOperatorSet.SelectShape(ho_SelectedRegions5, out ho_SelectedRegions6, "circularity", "and", 0.2, 1); ho_Contours.Dispose(); HOperatorSet.GenContourRegionXld(ho_SelectedRegions6, out ho_Contours, "border"); ho_SortedContours3.Dispose(); HOperatorSet.SortContoursXld(ho_Contours, out ho_SortedContours3, "upper_left", "true", "row"); HOperatorSet.CountObj(ho_SortedContours3, out hv_Number3); if ((int)(new HTuple((((hv_Number + hv_Number3) % 2)).TupleEqual(1))) != 0) { //这里需要在C#输出无法检测的信息 HDevelopStop(); } //里面的轮廓 A1左上到右下 A2左下到右上 hv_A1 = new HTuple(); hv_A2 = new HTuple(); //外面的轮廓 B1垂直方向 B2水平方向 hv_B1 = new HTuple(); hv_B2 = new HTuple(); //c1到c4顺时针顺序的四个花瓣长度 hv_C1 = new HTuple(); hv_C2 = new HTuple(); hv_C3 = new HTuple(); hv_C4 = new HTuple(); //B的检测 HTuple end_val103 = hv_Number; HTuple step_val103 = 1; for (hv_i = 1; hv_i.Continue(end_val103, step_val103); hv_i = hv_i.TupleAdd(step_val103)) { ho_obj.Dispose(); HOperatorSet.SelectObj(ho_SortedContours, out ho_obj, hv_i); HOperatorSet.GetContourXld(ho_obj, out hv_Ro1, out hv_Co1); HOperatorSet.TupleMin(hv_Ro1, out hv_MinBR); HOperatorSet.TupleMax(hv_Ro1, out hv_MaxBR); HOperatorSet.TupleMin(hv_Co1, out hv_MinBC); HOperatorSet.TupleMax(hv_Co1, out hv_MaxBC); hv_BR = hv_MaxBR - hv_MinBR; hv_BC = hv_MaxBC - hv_MinBC; hv_B1 = hv_B1.TupleConcat(hv_BR); hv_B2 = hv_B2.TupleConcat(hv_BC); //A的检测 HTuple end_val118 = hv_Number3; HTuple step_val118 = 1; for (hv_j = 1; hv_j.Continue(end_val118, step_val118); hv_j = hv_j.TupleAdd(step_val118)) { if ((int)(new HTuple(hv_i.TupleEqual(hv_j))) != 0) { ho_objj.Dispose(); HOperatorSet.SelectObj(ho_SortedContours3, out ho_objj, hv_j); //C的检测 ho_ContoursSplit.Dispose(); HOperatorSet.SegmentContoursXld(ho_objj, out ho_ContoursSplit, "lines", 5, 4, 2); ho_SelectedXLD.Dispose(); HOperatorSet.SelectShapeXld(ho_ContoursSplit, out ho_SelectedXLD, "width", "and", 13, 99); ho_SortedContours1.Dispose(); HOperatorSet.SortContoursXld(ho_SelectedXLD, out ho_SortedContours1, "upper_left", "true", "row"); HOperatorSet.CountObj(ho_SortedContours1, out hv_Number1); HTuple end_val130 = hv_Number1; HTuple step_val130 = 1; for (hv_a = 1; hv_a.Continue(end_val130, step_val130); hv_a = hv_a.TupleAdd(step_val130)) { ho_M.Dispose(); HOperatorSet.SelectObj(ho_SortedContours1, out ho_M, hv_a); if ((int)(new HTuple(hv_a.TupleEqual(1))) != 0) { HOperatorSet.GetContourXld(ho_M, out hv_Ro2, out hv_Co2); HOperatorSet.TupleMin(hv_Co2, out hv_LUC); HOperatorSet.TupleMax(hv_Co2, out hv_RUC); } else { HOperatorSet.GetContourXld(ho_M, out hv_Ro3, out hv_Co3); HOperatorSet.TupleMin(hv_Co3, out hv_LDC); HOperatorSet.TupleMax(hv_Co3, out hv_RDC); } HOperatorSet.FitLineContourXld(ho_M, "huber", -1, 0, 5, 2, out hv_RowBegin, out hv_ColBegin, out hv_RowEnd, out hv_ColEnd, out hv_Nr, out hv_Nc, out hv_Dist); ho_Contour.Dispose(); HOperatorSet.GenContourPolygonXld(out ho_Contour, hv_RowBegin.TupleConcat( hv_RowEnd), hv_ColBegin.TupleConcat(hv_ColEnd)); HOperatorSet.GetContourXld(ho_Contour, out hv_Rowc, out hv_Colc); HOperatorSet.TupleMean(hv_Rowc, out hv_MeanR); if ((int)(new HTuple(hv_a.TupleEqual(1))) != 0) { hv_H1 = hv_MeanR - hv_MinBR; hv_C1 = hv_C1.TupleConcat(hv_H1); } else { hv_H3 = hv_MaxBR - hv_MeanR; hv_C3 = hv_C3.TupleConcat(hv_H3); } } ho_SelectedXLD1.Dispose(); HOperatorSet.SelectShapeXld(ho_ContoursSplit, out ho_SelectedXLD1, "height", "and", 13, 99); ho_SortedContours2.Dispose(); HOperatorSet.SortContoursXld(ho_SelectedXLD1, out ho_SortedContours2, "upper_left", "true", "column"); HOperatorSet.CountObj(ho_SortedContours2, out hv_Number2); HTuple end_val157 = hv_Number2; HTuple step_val157 = 1; for (hv_b = 1; hv_b.Continue(end_val157, step_val157); hv_b = hv_b.TupleAdd(step_val157)) { ho_M.Dispose(); HOperatorSet.SelectObj(ho_SortedContours2, out ho_M, hv_b); if ((int)(new HTuple(hv_b.TupleEqual(1))) != 0) { HOperatorSet.GetContourXld(ho_M, out hv_Ro4, out hv_Co4); HOperatorSet.TupleMin(hv_Ro4, out hv_LUR); HOperatorSet.TupleMax(hv_Ro4, out hv_LDR); } else { HOperatorSet.GetContourXld(ho_M, out hv_Ro5, out hv_Co5); HOperatorSet.TupleMin(hv_Ro5, out hv_RUR); HOperatorSet.TupleMax(hv_Ro5, out hv_RDR); } HOperatorSet.FitLineContourXld(ho_M, "huber", -1, 0, 5, 2, out hv_RowBegin, out hv_ColBegin, out hv_RowEnd, out hv_ColEnd, out hv_Nr, out hv_Nc, out hv_Dist); ho_Contour.Dispose(); HOperatorSet.GenContourPolygonXld(out ho_Contour, hv_RowBegin.TupleConcat( hv_RowEnd), hv_ColBegin.TupleConcat(hv_ColEnd)); HOperatorSet.GetContourXld(ho_Contour, out hv_Rowc, out hv_Colc); HOperatorSet.TupleMean(hv_Colc, out hv_MeanC); if ((int)(new HTuple(hv_b.TupleEqual(1))) != 0) { hv_H4 = hv_MeanC - hv_MinBC; hv_C4 = hv_C4.TupleConcat(hv_H4); } else { hv_H2 = hv_MaxBC - hv_MeanC; hv_C2 = hv_C2.TupleConcat(hv_H2); } } HOperatorSet.DistancePp(hv_LUC, hv_LUR, hv_RDC, hv_RDR, out hv_Distance1); HOperatorSet.DistancePp(hv_RUC, hv_RUR, hv_LDC, hv_LDR, out hv_Distance2); hv_A1 = hv_A1.TupleConcat(hv_Distance1); hv_A2 = hv_A2.TupleConcat(hv_Distance2); } } } //*********************************倾斜角度 跑针位 k******************************************* HOperatorSet.AreaCenter(ho_SelectedRegionsA, out hv_AreaA, out hv_RowA, out hv_ColumnA); HOperatorSet.OrientationRegion(ho_SelectedRegionsA, out hv_Phi); hv_Phi = hv_Phi.TupleDeg(); hv_phi = ((90 - (hv_Phi.TupleAbs()))).TupleAbs(); hv_paozhengwei = (hv_RowA3 - ((hv_RowA2 / 2) + (hv_RowA1 / 2))) - 4; hv_k = (hv_RowA2 - hv_RowA1) + 4; //***************************************裂箔**************************************************** HOperatorSet.TupleSortIndex(hv_AreaB, out hv_Indices); hv_liebo = new HTuple(); hv_NumB = new HTuple(hv_Indices.TupleLength()); hv_count = 0; if ((int)(new HTuple(hv_NumB.TupleGreater(0))) != 0) { HTuple end_val208 = hv_NumB; HTuple step_val208 = 1; for (hv_I = 1; hv_I.Continue(end_val208, step_val208); hv_I = hv_I.TupleAdd(step_val208)) { ho_ObjectSelectedB.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegionsB2, out ho_ObjectSelectedB, hv_I); HOperatorSet.AreaCenter(ho_ObjectSelectedB, out hv_AreaB1, out hv_RowB3, out hv_ColumnB3); if ((int)(new HTuple(hv_AreaB1.TupleGreater(30))) != 0) { hv_count = hv_count + 1; } else { } } } else { } if (hv_liebo == null) { hv_liebo = new HTuple(); } hv_liebo[0] = hv_count; HTuple result = new HTuple(); result.Append(hv_A1[0]); result.Append(hv_A2[0]); result.Append(hv_B1[0]); result.Append(hv_B2[0]); result.Append(hv_C1[0]); result.Append(hv_C2[0]); result.Append(hv_C3[0]); result.Append(hv_C4[0]); result.Append(hv_phi[0]); result.Append(hv_paozhengwei[0]); result.Append(hv_liebo[0]); //************************************************************************************************** ho_Image.Dispose(); ho_ImageRotate.Dispose(); ho_GrayImage.Dispose(); ho_ImageMedian.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_SelectedRegions2.Dispose(); ho_SelectedRegions1.Dispose(); ho_SelectedRegions3.Dispose(); ho_SortedRegions.Dispose(); ho_RegionUnion.Dispose(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_GrayImageA.Dispose(); ho_GragImageA.Dispose(); ho_RegionsA_temp.Dispose(); ho_ConnectedRegionsA_temp.Dispose(); ho_SelectedRegionsA_temp.Dispose(); ho_ImageAffineTrans.Dispose(); ho_RegionsA.Dispose(); ho_RegionDilationA.Dispose(); ho_ConnectedRegionsA.Dispose(); ho_SelectedRegionsA.Dispose(); ho_RegionsA1.Dispose(); ho_RegionOpeningA.Dispose(); ho_SelectedRegionsA1.Dispose(); ho_RegionUnionA.Dispose(); ho_SelectedRegionsA2.Dispose(); ho_RegionsB.Dispose(); ho_ConnectedRegionsB.Dispose(); ho_SelectedRegionsB.Dispose(); ho_RectangleB1.Dispose(); ho_RectangleB2.Dispose(); ho_RegionDifferenceB.Dispose(); ho_ImageReducedB1.Dispose(); ho_RegionB1.Dispose(); ho_ConnectedRegionsB2.Dispose(); ho_SelectedRegionsB2.Dispose(); ho_outContours.Dispose(); ho_SelectedContours.Dispose(); ho_SortedContours.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions4.Dispose(); ho_SelectedRegions5.Dispose(); ho_SelectedRegions6.Dispose(); ho_Contours.Dispose(); ho_SortedContours3.Dispose(); ho_obj.Dispose(); ho_objj.Dispose(); ho_ContoursSplit.Dispose(); ho_SelectedXLD.Dispose(); ho_SortedContours1.Dispose(); ho_M.Dispose(); ho_Contour.Dispose(); ho_SelectedXLD1.Dispose(); ho_SortedContours2.Dispose(); ho_ObjectSelectedB.Dispose(); return(result); }
public MeasureResult Action() { #region 輸出結果 CircleResult mResult = null; #endregion // Local iconic variables HObject ho_R3_Circle = null; HObject ho_R3_ROI_Image = null, ho_R3_Region = null, ho_R3_ImageReduced = null; HObject ho_R3_Edges = null, ho_R3_ContoursSplit = null, ho_R3_SingleSegment = null; HObject ho_R3_ContEllipse = null; // Local control variables HTuple hv_msgOffsetY, hv_msgOffsetX; HTuple hv_STD_Row; HTuple hv_STD_Col, hv_Img_Row, hv_Img_Col, hv_Img_Rotate_Angle; HTuple hv_OffsetRow, hv_OffsetCol, hv_R3_R; HTuple hv_STD_R3_Row = new HTuple(), hv_STD_R3_Col = new HTuple(); HTuple hv_STD_R3_V_Row = new HTuple(), hv_STD_R3_V_Col = new HTuple(); HTuple hv_R3_X = new HTuple(), hv_R3_Y = new HTuple(), hv_R3_Pos_Row = new HTuple(); HTuple hv_R3_Pos_Col = new HTuple(), hv_alpha = new HTuple(); HTuple hv_R3_low = new HTuple(), hv_R3_high = new HTuple(); HTuple hv_R3_NumSegments = new HTuple(), hv_NumCircles = new HTuple(); HTuple hv_Num_Circle_Point = new HTuple(), hv_R3 = new HTuple(); HTuple hv_i = new HTuple(), hv_Attrib = new HTuple(), hv_R3_Row = new HTuple(); HTuple hv_R3_Column = new HTuple(), hv_R3_Radius = new HTuple(); HTuple hv_R3_StartPhi = new HTuple(), hv_R3_EndPhi = new HTuple(); HTuple hv_R3_PointOrder = new HTuple(), hv_R3_MinDist = new HTuple(); HTuple hv_R3_MaxDist = new HTuple(), hv_R3_AvgDist = new HTuple(); HTuple hv_R3_SigmaDist = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_R3_Circle); HOperatorSet.GenEmptyObj(out ho_R3_ROI_Image); HOperatorSet.GenEmptyObj(out ho_R3_Region); HOperatorSet.GenEmptyObj(out ho_R3_ImageReduced); HOperatorSet.GenEmptyObj(out ho_R3_Edges); HOperatorSet.GenEmptyObj(out ho_R3_ContoursSplit); HOperatorSet.GenEmptyObj(out ho_R3_SingleSegment); HOperatorSet.GenEmptyObj(out ho_R3_ContEllipse); //Measure: SDMS_R3 //Author: John Hsieh //Date: 2012 //ho_Image.Dispose(); //HOperatorSet.ReadImage(out ho_Image, "Images/STD.bmp"); //dev_open_window_fit_image(ho_Image, 0, 0, -1, -1, out hv_WindowHandle); //// dev_update_off(...); only in hdevelop HOperatorSet.SetSystem("border_shape_models", "false"); //****Message Args hv_msgOffsetY = 100; hv_msgOffsetX = 100; //****Model All //HOperatorSet.ReadShapeModel("D:/Projects/Halcon/SDMS/SDMS_Measure/Model/MatchingAll.shm", // out hv_AllModelId); //ho_AllModelContours.Dispose(); //HOperatorSet.GetShapeModelContours(out ho_AllModelContours, hv_AllModelId, 1); //HOperatorSet.FindShapeModel(ho_Image, hv_AllModelId, (new HTuple(0)).TupleRad() // , (new HTuple(360)).TupleRad(), 0.5, 1, 0.5, "least_squares", 6, 0.75, out hv_AllModelRow, // out hv_AllModelColumn, out hv_AllModelAngle, out hv_AllModelScore); //****Model Args //STD 中心點 hv_STD_Row = 772; hv_STD_Col = 1003; //目前圖形 中心點 hv_Img_Row = hv_AllModelRow.Clone(); hv_Img_Col = hv_AllModelColumn.Clone(); //目前圖形 Rotate Angle hv_Img_Rotate_Angle = hv_AllModelAngle.Clone(); //目前圖形偏移量 hv_OffsetRow = hv_Img_Row - hv_STD_Row; hv_OffsetCol = hv_Img_Col - hv_STD_Col; //****Display if (HDevWindowStack.IsOpen()) { HOperatorSet.ClearWindow(HDevWindowStack.GetActive()); } if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive()); } //*****R3 hv_R3_R = 29; //STD R3_ 位置 hv_STD_R3_Row = 252; hv_STD_R3_Col = 1381; //STD 向量 STD_R3_ hv_STD_R3_V_Row = hv_STD_R3_Row - hv_STD_Row; hv_STD_R3_V_Col = hv_STD_R3_Col - hv_STD_Col; //R3_X, R3_Y 分量 hv_R3_X = (hv_STD_R3_V_Col * (hv_Img_Rotate_Angle.TupleCos())) + (hv_STD_R3_V_Row * (hv_Img_Rotate_Angle.TupleSin() )); hv_R3_Y = (hv_STD_R3_V_Row * (hv_Img_Rotate_Angle.TupleCos())) - (hv_STD_R3_V_Col * (hv_Img_Rotate_Angle.TupleSin() )); //目前圖形 R3_ 位置 hv_R3_Pos_Row = (hv_STD_Row + hv_R3_Y) + hv_OffsetRow; hv_R3_Pos_Col = (hv_STD_Col + hv_R3_X) + hv_OffsetCol; //** 開始計算 ho_R3_Circle.Dispose(); HOperatorSet.GenCircle(out ho_R3_Circle, hv_R3_Pos_Row, hv_R3_Pos_Col, hv_R3_R); ho_R3_ROI_Image.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_R3_Circle, out ho_R3_ROI_Image); ho_R3_Region.Dispose(); HOperatorSet.FastThreshold(ho_R3_ROI_Image, out ho_R3_Region, 100, 255, 15); ho_R3_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_R3_ROI_Image, ho_R3_Region, out ho_R3_ImageReduced ); //stop () //sobel_fast 具有較寬的選擇範圍,搭配 alpha 參數 (alpha 越大, 容錯範圍大) hv_alpha = 0.9; hv_R3_low = 20; hv_R3_high = 60; ho_R3_Edges.Dispose(); HOperatorSet.EdgesSubPix(ho_R3_ImageReduced, out ho_R3_Edges, "sobel_fast", hv_alpha, hv_R3_low, hv_R3_high); //stop () //*所有的數值越小,表示容錯範圍大,反之亦然 ho_R3_ContoursSplit.Dispose(); HOperatorSet.SegmentContoursXld(ho_R3_Edges, out ho_R3_ContoursSplit, "lines_circles", 17, 4, 2); //Display the results //=========================================================== HOperatorSet.CountObj(ho_R3_ContoursSplit, out hv_R3_NumSegments); hv_NumCircles = 0; hv_Num_Circle_Point = 0; hv_R3 = 999; for (hv_i = 1; hv_i.Continue(hv_R3_NumSegments, 1); hv_i = hv_i.TupleAdd(1)) { ho_R3_SingleSegment.Dispose(); HOperatorSet.SelectObj(ho_R3_ContoursSplit, out ho_R3_SingleSegment, hv_i); HOperatorSet.GetContourGlobalAttribXld(ho_R3_SingleSegment, "cont_approx", out hv_Attrib); if ((int)(new HTuple(hv_Attrib.TupleEqual(1))) != 0) { HOperatorSet.FitCircleContourXld(ho_R3_SingleSegment, "atukey", -1, 2, hv_Num_Circle_Point, 5, 2, out hv_R3_Row, out hv_R3_Column, out hv_R3_Radius, out hv_R3_StartPhi, out hv_R3_EndPhi, out hv_R3_PointOrder); hv_NumCircles = hv_NumCircles + 1; if ((int)(new HTuple(hv_R3.TupleGreater(hv_R3_Radius))) != 0) { hv_R3 = hv_R3_Radius.Clone(); mResult = new CircleResult() { Row = new HTuple(hv_R3_Row), Col = new HTuple(hv_R3_Column), Radius = new HTuple(hv_R3_Radius), StartPhi = new HTuple(hv_R3_StartPhi), EndPhi = new HTuple(hv_R3_EndPhi), PointOrder = new HTuple(hv_R3_PointOrder), }; //HOperatorSet.SetTposition(hv_WindowHandle, (hv_R3_Pos_Row - hv_msgOffsetY) + 60, // (hv_R3_Pos_Col + hv_msgOffsetX) - 60); //HOperatorSet.WriteString(hv_WindowHandle, "R3"); //stop () } } } //*****R3 End ho_R3_Circle.Dispose(); ho_R3_ROI_Image.Dispose(); ho_R3_Region.Dispose(); ho_R3_ImageReduced.Dispose(); ho_R3_Edges.Dispose(); ho_R3_ContoursSplit.Dispose(); ho_R3_SingleSegment.Dispose(); ho_R3_ContEllipse.Dispose(); return mResult; }
//DateTime t1, t2, t3, t4,t5,t6,t7; private void action() { HObject ho_Rectangle, ho_ImageReduced, imagexz, retxz; HObject ho_Border, ho_Circle, ho_ImageReduced2, ho_Region, ho_RegionLines; HObject ho_Rectangle1 = null, ho_ImageReduced1 = null, ho_Border1 = null; HObject ho_SelectedContours = null; // Local control variables HTuple hv_Row1 = null, hv_Column1 = null, hv_Angle = null, hv_l1 = null, hv_l2 = null; HTuple hv_Score = null, hv_zj = null, hv_Area = null, hv_Row3 = null; HTuple hv_Column2 = null, hv_Phi1 = null, hv_zpj = null; HTuple hv_zcj = null, hv_zpr = null, hv_zpc = null, hv_zcr = null; HTuple hv_zcc = null, hv_Tp = null, hv_Tc = null, hv_Length = null; HTuple hv_dx = null, hv_dn = null, hv_dxr = null, hv_dxc = null; HTuple hv_dnr = null, hv_dnc = null, hv_i = null; //HTuple hv_Col = new HTuple(), hv_dis = new HTuple(), hv_dxi = new HTuple(), hv_Row2 = new HTuple(); //HTuple hv_dni = new HTuple(), hv_Ix = new HTuple(), hv_In = new HTuple(); //HTuple hv_Exception = new HTuple(), hv_j = new HTuple(), hv_jh = new HTuple(); HTuple hv_disdxpx = null; HTuple hv_disdnpx = null; HTuple hv_djd = null, hv_djdr = null, hv_djdc = null, hv_djx = null; HTuple hv_djxr = null, hv_djxc = null, hv_xjd = null, hv_xjdr = null; HTuple hv_xjdc = null, hv_xjx = null, hv_xjxr = null, hv_xjxc = null; HTuple hv_ljd = null, hv_ljx = null, hv_dj = null, hv_xj = null; HTuple hv_djn = null, hv_djm = null, hv_xjn = null, hv_xjm = null; HTuple hv_djzd = null, hv_djzx = null, hv_xjzd = null; HTuple hv_xjzx = null, hv_ljtd = null, hv_ljtx = null; HTuple hv_Length3 = null, hv_Length4 = null, hv_ljdx = null; HTuple hv_ljdn = null, hv_ljxx = null, hv_ljxn = null; HTuple hv_ljdm = null, hv_ljxm = null, hv_djiaodu = null; HTuple hv_xjiaodu = null, hv_Length5 = null, hv_Length6 = null; HTuple hv_djiaodu1 = null, hv_xjiaodu1 = null, hv_jjdd = null; HTuple hv_jjdx = null, hv_jjxd = null, hv_jjxx = null; HTuple hv_jjdm = null, hv_jjxm = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Border); HOperatorSet.GenEmptyObj(out ho_Circle); HOperatorSet.GenEmptyObj(out ho_ImageReduced2); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_ImageReduced1); HOperatorSet.GenEmptyObj(out ho_Border1); HOperatorSet.GenEmptyObj(out ho_SelectedContours); HOperatorSet.GenEmptyObj(out ho_RegionLines); HOperatorSet.GenEmptyObj(out imagexz); HOperatorSet.GenEmptyObj(out retxz); HOperatorSet.Union1(algorithm.Region, out RegionToDisp); //t3 = DateTime.Now; try { if (hv_ModelID == null) { HOperatorSet.ReadShapeModel(PathHelper.currentProductPath + @"\lwspmd.shm", out hv_ModelID); } retxz.Dispose(); HOperatorSet.GenRectangle2(out retxz, hv1_Row, hv1_Column, hv1_Phi, hv1_Length1, hv1_Length2); imagexz.Dispose(); HOperatorSet.ReduceDomain(Image, retxz, out imagexz); HOperatorSet.FindShapeModel(imagexz, hv_ModelID, -3.14, 6.29, 0.7, 0, 0.1, "least_squares", 0, 0.8, out hv_Row1, out hv_Column1, out hv_Angle, out hv_Score); hv_zj = (((((hv_Row1.TupleMax()) - (hv_Row1.TupleMin())) * ((hv_Row1.TupleMax() ) - (hv_Row1.TupleMin()))) + (((hv_Column1.TupleMax()) - (hv_Column1.TupleMin() )) * ((hv_Column1.TupleMax()) - (hv_Column1.TupleMin()))))).TupleSqrt(); ho_Circle.Dispose(); HOperatorSet.GenCircle(out ho_Circle, hv_Row1.TupleMean(), hv_Column1.TupleMean() , hv_zj / 2); ho_ImageReduced2.Dispose(); HOperatorSet.ReduceDomain(Image, ho_Circle, out ho_ImageReduced2); ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageReduced2, out ho_Region, 0, thv); HOperatorSet.AreaCenter(ho_Region, out hv_Area, out hv_Row3, out hv_Column2); HOperatorSet.OrientationRegion(ho_Region, out hv_Phi1); hv_zpj = hv_Phi1.Clone(); hv_zcj = hv_Phi1 + ((new HTuple(90)).TupleRad()); hv_zpr = hv_Row3 + ((hv_zcj.TupleSin()) * hv_zj); hv_zpc = hv_Column2 - ((hv_zcj.TupleCos()) * hv_zj); hv_zcr = hv_Row3 + ((hv_zpj.TupleSin()) * hv_zj); hv_zcc = hv_Row3 - ((hv_zpj.TupleCos()) * hv_zj); HOperatorSet.TupleTan(hv_zpj, out hv_Tp); HOperatorSet.TupleTan(hv_zcj, out hv_Tc); HOperatorSet.TupleLength(hv_Row1, out hv_Length); hv_dx = new HTuple(); hv_dn = new HTuple(); hv_dxr = new HTuple(); hv_dxc = new HTuple(); hv_dnr = new HTuple(); hv_dnc = new HTuple(); HTuple end_val29 = hv_Length - 1; HTuple step_val29 = 1; for (hv_i = 0; hv_i.Continue(end_val29, step_val29); hv_i = hv_i.TupleAdd(step_val29)) { //try ho_Rectangle1.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle1, hv_Row1.TupleSelect(hv_i), hv_Column1.TupleSelect(hv_i), hv_Phi + (hv_Angle.TupleSelect(hv_i)), hv_Length1, hv_Length2); ho_ImageReduced1.Dispose(); HOperatorSet.ReduceDomain(Image, ho_Rectangle1, out ho_ImageReduced1 ); ho_Border1.Dispose(); HOperatorSet.ThresholdSubPix(ho_ImageReduced1, out ho_Border1, thv); ho_SelectedContours.Dispose(); HOperatorSet.SelectContoursXld(ho_Border1, out ho_SelectedContours, "contour_length", 30, 2000000, -0.5, 0.5); HOperatorSet.UnionAdjacentContoursXld(ho_SelectedContours, out ho_SelectedContours, 10, 1, "attr_keep"); HOperatorSet.GetContourXld(ho_SelectedContours, out hv_Row2, out hv_Col); hv_dis = ((((((hv_Tp * hv_Col) + hv_Row2) - (hv_Tp * hv_zpc)) - hv_zpr) / (((1 + (hv_Tp * hv_Tp))).TupleSqrt() ))).TupleAbs(); hv_dxi = hv_dis.TupleMax(); hv_dni = hv_dis.TupleMin(); HOperatorSet.TupleFind(hv_dis, hv_dxi, out hv_Ix); HOperatorSet.TupleFind(hv_dis, hv_dni, out hv_In); hv_dx = hv_dx.TupleConcat(hv_dxi); hv_dn = hv_dn.TupleConcat(hv_dni); hv_dxr = hv_dxr.TupleConcat(hv_Row2.TupleSelect(hv_Ix)); hv_dxc = hv_dxc.TupleConcat(hv_Col.TupleSelect(hv_Ix)); hv_dnr = hv_dnr.TupleConcat(hv_Row2.TupleSelect(hv_In)); hv_dnc = hv_dnc.TupleConcat(hv_Col.TupleSelect(hv_In)); //catch (Exception) //endtry //stop () } hv_disdxpx = ((((((hv_Tc * hv_dxc) + hv_dxr) - (hv_Tc * hv_zcc)) - hv_zcr) / (((1 + (hv_Tc * hv_Tc))).TupleSqrt() ))).TupleAbs(); hv_disdnpx = ((((((hv_Tc * hv_dnc) + hv_dnr) - (hv_Tc * hv_zcc)) - hv_zcr) / (((1 + (hv_Tc * hv_Tc))).TupleSqrt() ))).TupleAbs(); HTuple end_val55 = hv_Length - 2; HTuple step_val55 = 1; //t1 = DateTime.Now; for (hv_i = 0; hv_i.Continue(end_val55, step_val55); hv_i = hv_i.TupleAdd(step_val55)) { //try HTuple end_val59 = hv_Length - 1; HTuple step_val59 = 1; for (hv_j = hv_i + 1; hv_j.Continue(end_val59, step_val59); hv_j = hv_j.TupleAdd(step_val59)) { if ((int)(new HTuple(((hv_disdxpx.TupleSelect(hv_i))).TupleGreater(hv_disdxpx.TupleSelect( hv_j)))) != 0) { hv_jh = hv_disdxpx.TupleSelect(hv_i); if (hv_disdxpx == null) { hv_disdxpx = new HTuple(); } hv_disdxpx[hv_i] = hv_disdxpx.TupleSelect(hv_j); if (hv_disdxpx == null) { hv_disdxpx = new HTuple(); } hv_disdxpx[hv_j] = hv_jh; hv_jh = hv_dx.TupleSelect(hv_i); if (hv_dx == null) { hv_dx = new HTuple(); } hv_dx[hv_i] = hv_dx.TupleSelect(hv_j); if (hv_dx == null) { hv_dx = new HTuple(); } hv_dx[hv_j] = hv_jh; hv_jh = hv_dxr.TupleSelect(hv_i); if (hv_dxr == null) { hv_dxr = new HTuple(); } hv_dxr[hv_i] = hv_dxr.TupleSelect(hv_j); if (hv_dxr == null) { hv_dxr = new HTuple(); } hv_dxr[hv_j] = hv_jh; hv_jh = hv_dxc.TupleSelect(hv_i); if (hv_dxc == null) { hv_dxc = new HTuple(); } hv_dxc[hv_i] = hv_dxc.TupleSelect(hv_j); if (hv_dxc == null) { hv_dxc = new HTuple(); } hv_dxc[hv_j] = hv_jh; } if ((int)(new HTuple(((hv_disdnpx.TupleSelect(hv_i))).TupleGreater(hv_disdnpx.TupleSelect( hv_j)))) != 0) { hv_jh = hv_disdnpx.TupleSelect(hv_i); if (hv_disdnpx == null) { hv_disdnpx = new HTuple(); } hv_disdnpx[hv_i] = hv_disdnpx.TupleSelect(hv_j); if (hv_disdnpx == null) { hv_disdnpx = new HTuple(); } hv_disdnpx[hv_j] = hv_jh; hv_jh = hv_dn.TupleSelect(hv_i); if (hv_dn == null) { hv_dn = new HTuple(); } hv_dn[hv_i] = hv_dn.TupleSelect(hv_j); if (hv_dn == null) { hv_dn = new HTuple(); } hv_dn[hv_j] = hv_jh; hv_jh = hv_dnr.TupleSelect(hv_i); if (hv_dnr == null) { hv_dnr = new HTuple(); } hv_dnr[hv_i] = hv_dnr.TupleSelect(hv_j); if (hv_dnr == null) { hv_dnr = new HTuple(); } hv_dnr[hv_j] = hv_jh; hv_jh = hv_dnc.TupleSelect(hv_i); if (hv_dnc == null) { hv_dnc = new HTuple(); } hv_dnc[hv_i] = hv_dnc.TupleSelect(hv_j); if (hv_dnc == null) { hv_dnc = new HTuple(); } hv_dnc[hv_j] = hv_jh; } } //catch (Exception) //endtry } //t2 = DateTime.Now; hv_djd = new HTuple(); hv_djdr = new HTuple(); hv_djdc = new HTuple(); hv_djx = new HTuple(); hv_djxr = new HTuple(); hv_djxc = new HTuple(); hv_xjd = new HTuple(); hv_xjdr = new HTuple(); hv_xjdc = new HTuple(); hv_xjx = new HTuple(); hv_xjxr = new HTuple(); hv_xjxc = new HTuple(); hv_ljd = new HTuple(); hv_ljx = new HTuple(); HTuple end_val107 = hv_Length - 1; HTuple step_val107 = 1; for (hv_i = 0; hv_i.Continue(end_val107, step_val107); hv_i = hv_i.TupleAdd(step_val107)) { if ((int)(new HTuple(((hv_dx.TupleSelect(hv_i))).TupleGreater(hv_zj))) != 0) { for (hv_j = -3; (int)hv_j <= 3; hv_j = (int)hv_j + 1) { if (((hv_i + hv_j) >= 0) && ((hv_i + hv_j) <= end_val107)) { if ((int)((new HTuple(((hv_disdnpx.TupleSelect(hv_i + hv_j))).TupleGreater( hv_disdxpx.TupleSelect(hv_i)))).TupleAnd(new HTuple(((hv_dn.TupleSelect( hv_i + hv_j))).TupleLess(hv_zj)))) != 0) { hv_ljd = hv_ljd.TupleConcat(hv_disdxpx.TupleSelect(hv_i)); hv_djd = hv_djd.TupleConcat(hv_dx.TupleSelect(hv_i)); hv_djdr = hv_djdr.TupleConcat(hv_dxr.TupleSelect(hv_i)); hv_djdc = hv_djdc.TupleConcat(hv_dxc.TupleSelect(hv_i)); hv_djx = hv_djx.TupleConcat(hv_dn.TupleSelect(hv_i + hv_j)); hv_djxr = hv_djxr.TupleConcat(hv_dnr.TupleSelect(hv_i + hv_j)); hv_djxc = hv_djxc.TupleConcat(hv_dnc.TupleSelect(hv_i + hv_j)); break; } } // catch (Exception) //catch (HalconException) //{ // //HDevExpDefaultException1.ToHTuple(out hv_Exception); //} } } if ((int)(new HTuple(((hv_dn.TupleSelect(hv_i))).TupleGreater(hv_zj))) != 0) { for (hv_j = -3; (int)hv_j <= 3; hv_j = (int)hv_j + 1) { //try if (((hv_i + hv_j) >= 0) && ((hv_i + hv_j) <= end_val107)) { if ((int)((new HTuple(((hv_disdxpx.TupleSelect(hv_i + hv_j))).TupleGreater( hv_disdnpx.TupleSelect(hv_i)))).TupleAnd(new HTuple(((hv_dx.TupleSelect( hv_i + hv_j))).TupleLess(hv_zj)))) != 0) { hv_ljx = hv_ljx.TupleConcat(hv_disdnpx.TupleSelect(hv_i)); hv_xjd = hv_xjd.TupleConcat(hv_dn.TupleSelect(hv_i)); hv_xjdr = hv_xjdr.TupleConcat(hv_dnr.TupleSelect(hv_i)); hv_xjdc = hv_xjdc.TupleConcat(hv_dnc.TupleSelect(hv_i)); hv_xjx = hv_xjx.TupleConcat(hv_dx.TupleSelect(hv_i + hv_j)); hv_xjxr = hv_xjxr.TupleConcat(hv_dxr.TupleSelect(hv_i + hv_j)); hv_xjxc = hv_xjxc.TupleConcat(hv_dxc.TupleSelect(hv_i + hv_j)); break; } } // catch (Exception) //catch (HalconException) //{ // //HDevExpDefaultException1.ToHTuple(out hv_Exception); //} } } } HOperatorSet.TupleLength(hv_ljd, out hv_l1); HTuple end_val153 = 1; HTuple step_val153 = -1; for (hv_i = hv_l1 - 1; hv_i.Continue(end_val153, step_val153); hv_i = hv_i.TupleAdd(step_val153)) { if ((int)(new HTuple(((hv_ljd.TupleSelect(hv_i))).TupleEqual(hv_ljd.TupleSelect( hv_i - 1)))) != 0) { HOperatorSet.TupleRemove(hv_ljd, hv_i, out hv_ljd); HOperatorSet.TupleRemove(hv_djd, hv_i, out hv_djd); HOperatorSet.TupleRemove(hv_djdr, hv_i, out hv_djdr); HOperatorSet.TupleRemove(hv_djdc, hv_i, out hv_djdc); HOperatorSet.TupleRemove(hv_djx, hv_i, out hv_djx); HOperatorSet.TupleRemove(hv_djxr, hv_i, out hv_djxr); HOperatorSet.TupleRemove(hv_djxc, hv_i, out hv_djxc); } } HOperatorSet.TupleLength(hv_ljx, out hv_l2); HTuple end_val165 = 1; HTuple step_val165 = -1; for (hv_i = hv_l2 - 1; hv_i.Continue(end_val165, step_val165); hv_i = hv_i.TupleAdd(step_val165)) { if ((int)(new HTuple(((hv_ljd.TupleSelect(hv_i))).TupleEqual(hv_ljd.TupleSelect( hv_i - 1)))) != 0) { HOperatorSet.TupleRemove(hv_ljx, hv_i, out hv_ljx); HOperatorSet.TupleRemove(hv_xjd, hv_i, out hv_xjd); HOperatorSet.TupleRemove(hv_xjdr, hv_i, out hv_xjdr); HOperatorSet.TupleRemove(hv_xjdc, hv_i, out hv_xjdc); HOperatorSet.TupleRemove(hv_xjx, hv_i, out hv_xjx); HOperatorSet.TupleRemove(hv_xjxr, hv_i, out hv_xjxr); HOperatorSet.TupleRemove(hv_xjxc, hv_i, out hv_xjxc); } } HOperatorSet.TupleLength(hv_ljx, out hv_l2); HOperatorSet.TupleLength(hv_ljd, out hv_l1); //t5 = DateTime.Now; hv_dj = hv_djd - hv_djx; hv_xj = hv_xjd - hv_xjx; hv_djx = hv_dj.TupleMax(); hv_djn = hv_dj.TupleMin(); hv_djm = hv_dj.TupleMean(); hv_xjx = hv_xj.TupleMax(); hv_xjn = hv_xj.TupleMin(); hv_xjm = hv_xj.TupleMean(); hv_djzd = (hv_djd.TupleMax()) - (hv_djx.TupleMin()); hv_djzx = (hv_djd.TupleMin()) - (hv_djx.TupleMax()); hv_xjzd = (hv_xjd.TupleMax()) - (hv_xjx.TupleMin()); hv_xjzx = (hv_xjd.TupleMin()) - (hv_xjx.TupleMax()); hv_ljtd = (hv_ljd.TupleConcat(0)) - ((new HTuple(0)).TupleConcat(hv_ljd)); hv_ljtx = (hv_ljx.TupleConcat(0)) - ((new HTuple(0)).TupleConcat(hv_ljx)); HOperatorSet.TupleLength(hv_ljtd, out hv_Length3); HOperatorSet.TupleLength(hv_ljtx, out hv_Length4); hv_ljtd = hv_ljtd.TupleSelectRange(1, hv_Length3 - 2); hv_ljtx = hv_ljtx.TupleSelectRange(1, hv_Length4 - 2); hv_ljdx = hv_ljtd.TupleMax(); hv_ljdn = hv_ljtd.TupleMin(); hv_ljxx = hv_ljtx.TupleMax(); hv_ljxn = hv_ljtx.TupleMin(); hv_ljdm = hv_ljtd.TupleMean(); hv_ljxm = hv_ljtx.TupleMean(); HOperatorSet.TupleAtan((hv_djxr - hv_djdr) / (hv_djdc - hv_djxc), out hv_djiaodu); HOperatorSet.TupleAtan((hv_xjxr - hv_xjdr) / (hv_xjdc - hv_xjxc), out hv_xjiaodu); HOperatorSet.TupleLength(hv_djiaodu, out hv_Length5); HOperatorSet.TupleLength(hv_xjiaodu, out hv_Length6); hv_djiaodu1 = ((hv_djiaodu - hv_zcj)).TupleAbs(); hv_xjiaodu1 = ((hv_xjiaodu - hv_zcj)).TupleAbs(); HTuple end_val177 = hv_Length5 - 1; HTuple step_val177 = 1; //t6 = DateTime.Now; for (hv_i = 0; hv_i.Continue(end_val177, step_val177); hv_i = hv_i.TupleAdd(step_val177)) { while ((int)(new HTuple(hv_djiaodu1.TupleGreater((new HTuple(90)).TupleRad() ))) != 0) { hv_djiaodu1 = hv_djiaodu1 - ((new HTuple(90)).TupleRad()); } if ((int)(new HTuple(hv_djiaodu1.TupleGreater((new HTuple(45)).TupleRad() ))) != 0) { hv_djiaodu1 = (-hv_djiaodu1) + ((new HTuple(90)).TupleRad()); } } HTuple end_val185 = hv_Length6 - 1; HTuple step_val185 = 1; for (hv_i = 0; hv_i.Continue(end_val185, step_val185); hv_i = hv_i.TupleAdd(step_val185)) { while ((int)(new HTuple(hv_xjiaodu1.TupleGreater((new HTuple(90)).TupleRad() ))) != 0) { hv_xjiaodu1 = hv_xjiaodu1 - ((new HTuple(90)).TupleRad()); } if ((int)(new HTuple(hv_xjiaodu1.TupleGreater((new HTuple(45)).TupleRad() ))) != 0) { hv_xjiaodu1 = (-hv_xjiaodu1) + ((new HTuple(90)).TupleRad()); } } hv_jjdd = hv_djiaodu1.TupleMax().TupleDeg(); hv_jjdx = hv_djiaodu1.TupleMin().TupleDeg(); hv_jjxd = hv_xjiaodu1.TupleMax().TupleDeg(); hv_jjxx = hv_xjiaodu1.TupleMin().TupleDeg(); hv_jjdm = hv_djiaodu1.TupleMean().TupleDeg(); hv_jjxm = hv_xjiaodu1.TupleMean().TupleDeg(); ho_RegionLines.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLines, hv_djdr, hv_djdc, hv_djxr, hv_djxc); HOperatorSet.Union2(ho_RegionLines, ho_RegionLines, out RegionToDisp); HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("螺纹条数1"); hv_result = hv_result.TupleConcat(hv_l1); hv_result = hv_result.TupleConcat("螺纹条数2"); hv_result = hv_result.TupleConcat(hv_l2); hv_result = hv_result.TupleConcat("大径最大值"); hv_result = hv_result.TupleConcat(hv_djx.D * pixeldist); hv_result = hv_result.TupleConcat("大径最小值"); hv_result = hv_result.TupleConcat(hv_djn.D * pixeldist); hv_result = hv_result.TupleConcat("大径平均值"); hv_result = hv_result.TupleConcat(hv_djm.D * pixeldist); hv_result = hv_result.TupleConcat("小径最大值"); hv_result = hv_result.TupleConcat(hv_xjx.D * pixeldist); hv_result = hv_result.TupleConcat("小径最小值"); hv_result = hv_result.TupleConcat(hv_xjn.D * pixeldist); hv_result = hv_result.TupleConcat("小径平均值"); hv_result = hv_result.TupleConcat(hv_xjm.D * pixeldist); hv_result = hv_result.TupleConcat("整体大径最大值"); hv_result = hv_result.TupleConcat(hv_djzd.D * pixeldist); hv_result = hv_result.TupleConcat("整体大径最小值"); hv_result = hv_result.TupleConcat(hv_djzx.D * pixeldist); hv_result = hv_result.TupleConcat("整体小径最大值"); hv_result = hv_result.TupleConcat(hv_xjzd.D * pixeldist); hv_result = hv_result.TupleConcat("整体小径最小值"); hv_result = hv_result.TupleConcat(hv_xjzx.D * pixeldist); hv_result = hv_result.TupleConcat("螺距最大值"); hv_result = hv_result.TupleConcat(hv_ljdx.D * pixeldist); hv_result = hv_result.TupleConcat("螺距最小值"); hv_result = hv_result.TupleConcat(hv_ljdn.D * pixeldist); hv_result = hv_result.TupleConcat("螺距平均值"); hv_result = hv_result.TupleConcat(hv_ljdm.D * pixeldist); hv_result = hv_result.TupleConcat("角度最大值"); hv_result = hv_result.TupleConcat(hv_jjdd.D); hv_result = hv_result.TupleConcat("角度最大值"); hv_result = hv_result.TupleConcat(hv_jjdx.D); hv_result = hv_result.TupleConcat("角度平均值"); hv_result = hv_result.TupleConcat(hv_jjdm.D); result = hv_result.Clone(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Border.Dispose(); ho_Circle.Dispose(); ho_ImageReduced2.Dispose(); ho_Region.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced1.Dispose(); ho_Border1.Dispose(); ho_SelectedContours.Dispose(); imagexz.Dispose(); retxz.Dispose(); ho_RegionLines.Dispose(); algorithm.Region.Dispose(); //t4 = DateTime.Now; } catch { HTuple hv_result = GetHv_result(); hv_result = hv_result.TupleConcat("螺纹条数1"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺纹条数2"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("大径最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("大径最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("大径平均值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("小径最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("小径最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("小径平均值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("整体大径最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("整体大径最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("整体小径最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("整体小径最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺距最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺距最小值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("螺距平均值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("角度最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("角度最大值"); hv_result = hv_result.TupleConcat(0); hv_result = hv_result.TupleConcat("角度平均值"); hv_result = hv_result.TupleConcat(0); result = hv_result.Clone(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Border.Dispose(); ho_Circle.Dispose(); ho_ImageReduced2.Dispose(); ho_Region.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced1.Dispose(); ho_Border1.Dispose(); ho_SelectedContours.Dispose(); imagexz.Dispose(); retxz.Dispose(); ho_RegionLines.Dispose(); algorithm.Region.Dispose(); } }
public static void scale_image_range(HObject ho_Image, out HObject ho_ImageScaled, HTuple hv_Min, HTuple hv_Max) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_ImageSelected = null, ho_SelectedChannel = null; HObject ho_LowerRegion = null, ho_UpperRegion = null, ho_ImageSelectedScaled = null; // Local copy input parameter variables HObject ho_Image_COPY_INP_TMP; ho_Image_COPY_INP_TMP = ho_Image.CopyObj(1, -1); HTuple hv_LowerLimit = new HTuple(), hv_UpperLimit = new HTuple(); HTuple hv_Mult = null, hv_Add = null, hv_NumImages = null; HTuple hv_ImageIndex = null, hv_Channels = new HTuple(); HTuple hv_ChannelIndex = new HTuple(), hv_MinGray = new HTuple(); HTuple hv_MaxGray = new HTuple(), hv_Range = new HTuple(); HTuple hv_Max_COPY_INP_TMP = hv_Max.Clone(); HTuple hv_Min_COPY_INP_TMP = hv_Min.Clone(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ImageScaled); HOperatorSet.GenEmptyObj(out ho_ImageSelected); HOperatorSet.GenEmptyObj(out ho_SelectedChannel); HOperatorSet.GenEmptyObj(out ho_LowerRegion); HOperatorSet.GenEmptyObj(out ho_UpperRegion); HOperatorSet.GenEmptyObj(out ho_ImageSelectedScaled); try { if ((int)(new HTuple((new HTuple(hv_Min_COPY_INP_TMP.TupleLength())).TupleEqual( 2))) != 0) { hv_LowerLimit = hv_Min_COPY_INP_TMP.TupleSelect(1); hv_Min_COPY_INP_TMP = hv_Min_COPY_INP_TMP.TupleSelect(0); } else { hv_LowerLimit = 0.0; } if ((int)(new HTuple((new HTuple(hv_Max_COPY_INP_TMP.TupleLength())).TupleEqual( 2))) != 0) { hv_UpperLimit = hv_Max_COPY_INP_TMP.TupleSelect(1); hv_Max_COPY_INP_TMP = hv_Max_COPY_INP_TMP.TupleSelect(0); } else { hv_UpperLimit = 255.0; } // //Calculate scaling parameters. hv_Mult = (((hv_UpperLimit - hv_LowerLimit)).TupleReal()) / (hv_Max_COPY_INP_TMP - hv_Min_COPY_INP_TMP); hv_Add = ((-hv_Mult) * hv_Min_COPY_INP_TMP) + hv_LowerLimit; // //Scale image. { HObject ExpTmpOutVar_0; HOperatorSet.ScaleImage(ho_Image_COPY_INP_TMP, out ExpTmpOutVar_0, hv_Mult, hv_Add); ho_Image_COPY_INP_TMP.Dispose(); ho_Image_COPY_INP_TMP = ExpTmpOutVar_0; } // //Clip gray values if necessary. //This must be done for each image and channel separately. ho_ImageScaled.Dispose(); HOperatorSet.GenEmptyObj(out ho_ImageScaled); HOperatorSet.CountObj(ho_Image_COPY_INP_TMP, out hv_NumImages); HTuple end_val49 = hv_NumImages; HTuple step_val49 = 1; for (hv_ImageIndex = 1; hv_ImageIndex.Continue(end_val49, step_val49); hv_ImageIndex = hv_ImageIndex.TupleAdd(step_val49)) { ho_ImageSelected.Dispose(); HOperatorSet.SelectObj(ho_Image_COPY_INP_TMP, out ho_ImageSelected, hv_ImageIndex); HOperatorSet.CountChannels(ho_ImageSelected, out hv_Channels); HTuple end_val52 = hv_Channels; HTuple step_val52 = 1; for (hv_ChannelIndex = 1; hv_ChannelIndex.Continue(end_val52, step_val52); hv_ChannelIndex = hv_ChannelIndex.TupleAdd(step_val52)) { ho_SelectedChannel.Dispose(); HOperatorSet.AccessChannel(ho_ImageSelected, out ho_SelectedChannel, hv_ChannelIndex); HOperatorSet.MinMaxGray(ho_SelectedChannel, ho_SelectedChannel, 0, out hv_MinGray, out hv_MaxGray, out hv_Range); ho_LowerRegion.Dispose(); HOperatorSet.Threshold(ho_SelectedChannel, out ho_LowerRegion, ((hv_MinGray.TupleConcat( hv_LowerLimit))).TupleMin(), hv_LowerLimit); ho_UpperRegion.Dispose(); HOperatorSet.Threshold(ho_SelectedChannel, out ho_UpperRegion, hv_UpperLimit, ((hv_UpperLimit.TupleConcat(hv_MaxGray))).TupleMax()); { HObject ExpTmpOutVar_0; HOperatorSet.PaintRegion(ho_LowerRegion, ho_SelectedChannel, out ExpTmpOutVar_0, hv_LowerLimit, "fill"); ho_SelectedChannel.Dispose(); ho_SelectedChannel = ExpTmpOutVar_0; } { HObject ExpTmpOutVar_0; HOperatorSet.PaintRegion(ho_UpperRegion, ho_SelectedChannel, out ExpTmpOutVar_0, hv_UpperLimit, "fill"); ho_SelectedChannel.Dispose(); ho_SelectedChannel = ExpTmpOutVar_0; } if ((int)(new HTuple(hv_ChannelIndex.TupleEqual(1))) != 0) { ho_ImageSelectedScaled.Dispose(); HOperatorSet.CopyObj(ho_SelectedChannel, out ho_ImageSelectedScaled, 1, 1); } else { { HObject ExpTmpOutVar_0; HOperatorSet.AppendChannel(ho_ImageSelectedScaled, ho_SelectedChannel, out ExpTmpOutVar_0); ho_ImageSelectedScaled.Dispose(); ho_ImageSelectedScaled = ExpTmpOutVar_0; } } } { HObject ExpTmpOutVar_0; HOperatorSet.ConcatObj(ho_ImageScaled, ho_ImageSelectedScaled, out ExpTmpOutVar_0 ); ho_ImageScaled.Dispose(); ho_ImageScaled = ExpTmpOutVar_0; } } ho_Image_COPY_INP_TMP.Dispose(); ho_ImageSelected.Dispose(); ho_SelectedChannel.Dispose(); ho_LowerRegion.Dispose(); ho_UpperRegion.Dispose(); ho_ImageSelectedScaled.Dispose(); return; } catch (HalconException HDevExpDefaultException) { ho_Image_COPY_INP_TMP.Dispose(); ho_ImageSelected.Dispose(); ho_SelectedChannel.Dispose(); ho_LowerRegion.Dispose(); ho_UpperRegion.Dispose(); ho_ImageSelectedScaled.Dispose(); throw HDevExpDefaultException; } }
private void btn_ReadCharacter_Click(object sender, EventArgs e) { if (m_ocrhandle == null) { MessageBox.Show("请先读取字符库"); return; } if (hDisplay1.GetSearchRegions().Count == 0) { MessageBox.Show("请先添加搜索区域"); return; } HTuple hv_Number; HObject _roi = hDisplay1.GetSearchRegions().ElementAt(0); HObject _region = new HObject(); HObject _imagereduced = new HObject(); HObject ho_ObjectSelected = new HObject(); HOperatorSet.ReduceDomain(m_image, _roi, out _imagereduced); HOperatorSet.Threshold(_imagereduced, out _region, m_OcrParam.GrayMin, m_OcrParam.GrayMax); HOperatorSet.Connection(_region, out _region); HOperatorSet.SelectShape(_region, out _region, "area", "and", m_OcrParam.AreaMin, m_OcrParam.AreaMax); HOperatorSet.CountObj(_region, out hv_Number); HTuple hv_Index = new HTuple(); List <RegionX> _listregionx = new List <RegionX>(); List <ViewROI.StringX> _liststringx = new List <ViewROI.StringX>(); for (hv_Index = 1; hv_Index.Continue(hv_Number, 1); hv_Index = hv_Index.TupleAdd(1)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(_region, out ho_ObjectSelected, hv_Index); RegionX _hregion = new RegionX(ho_ObjectSelected.CopyObj(1, -1), "green"); _listregionx.Add(_hregion); } HTuple _characters = new HTuple(); HTuple _confidence = new HTuple(); // DelegateUIControl.GetInstance().UpdateHDisplay("FormSetHDisplay", m_image, _listregionx, null); HOperatorSet.DoOcrMultiClassMlp(_region, m_image, m_ocrhandle, out _characters, out _confidence); HTuple _row = new HTuple(); HTuple _column = new HTuple(); HTuple _area = new HTuple(); for (hv_Index = 1; hv_Index.Continue(hv_Number, 1); hv_Index = hv_Index.TupleAdd(1)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(_region, out ho_ObjectSelected, hv_Index); HOperatorSet.AreaCenter(ho_ObjectSelected, out _area, out _row, out _column); ViewROI.StringX sx = new ViewROI.StringX(19, true, false); sx.SetString(_characters[hv_Index - 1], (int)_row.D + 50, (int)_column.D, Color.Green); _liststringx.Add(sx); } DelegateUIControl.GetInstance().UpdateHDisplay("FormSetHDisplay", m_image, _listregionx, _liststringx); List <OcrResult> ocrresultlist = new List <OcrResult>(); for (int i = 0; i < _characters.TupleLength(); i++) { OcrResult _ocrresult = new OcrResult(); _ocrresult.character = _characters[i]; _ocrresult.scale = _confidence[i].D.ToString("F4"); ocrresultlist.Add(_ocrresult); } dGV_CharacterResult.DataSource = ocrresultlist; }
public static void dev_display_shape_matching_results(HTuple hv_WindowHandle, HTuple hv_ModelID, HTuple hv_Color, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_ScaleR, HTuple hv_ScaleC, HTuple hv_Model) { if (hv_WindowHandle == null) { return; } // Local iconic variables HObject ho_ModelContours = null, ho_ContoursAffinTrans = null; // Local control variables HTuple hv_NumMatches, hv_Index = new HTuple(); HTuple hv_Match = new HTuple(), hv_HomMat2DIdentity = new HTuple(); HTuple hv_HomMat2DScale = new HTuple(), hv_HomMat2DRotate = new HTuple(); HTuple hv_HomMat2DTranslate = new HTuple(); HTuple hv_Model_COPY_INP_TMP = hv_Model.Clone(); HTuple hv_ScaleC_COPY_INP_TMP = hv_ScaleC.Clone(); HTuple hv_ScaleR_COPY_INP_TMP = hv_ScaleR.Clone(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ModelContours); HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans); try { //This procedure displays the results of Shape-Based Matching. // hv_NumMatches = new HTuple(hv_Row.TupleLength()); if ((int)(new HTuple(hv_NumMatches.TupleGreater(0))) != 0) { if ((int)(new HTuple((new HTuple(hv_ScaleR_COPY_INP_TMP.TupleLength())).TupleEqual( 1))) != 0) { HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleR_COPY_INP_TMP, out hv_ScaleR_COPY_INP_TMP); } if ((int)(new HTuple((new HTuple(hv_ScaleC_COPY_INP_TMP.TupleLength())).TupleEqual( 1))) != 0) { HOperatorSet.TupleGenConst(hv_NumMatches, hv_ScaleC_COPY_INP_TMP, out hv_ScaleC_COPY_INP_TMP); } if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength())).TupleEqual( 0))) != 0) { HOperatorSet.TupleGenConst(hv_NumMatches, 0, out hv_Model_COPY_INP_TMP); } else if ((int)(new HTuple((new HTuple(hv_Model_COPY_INP_TMP.TupleLength() )).TupleEqual(1))) != 0) { HOperatorSet.TupleGenConst(hv_NumMatches, hv_Model_COPY_INP_TMP, out hv_Model_COPY_INP_TMP); } for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_ModelID.TupleLength() )) - 1); hv_Index = (int)hv_Index + 1) { ho_ModelContours.Dispose(); HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID.TupleSelect( hv_Index), 1); if (hv_WindowHandle > 0) { HOperatorSet.SetColor(hv_WindowHandle, hv_Color.TupleSelect( hv_Index % (new HTuple(hv_Color.TupleLength())))); } for (hv_Match = 0; hv_Match.Continue(hv_NumMatches - 1, 1); hv_Match = hv_Match.TupleAdd(1)) { if ((int)(new HTuple(hv_Index.TupleEqual(hv_Model_COPY_INP_TMP.TupleSelect( hv_Match)))) != 0) { HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dScale(hv_HomMat2DIdentity, hv_ScaleR_COPY_INP_TMP.TupleSelect( hv_Match), hv_ScaleC_COPY_INP_TMP.TupleSelect(hv_Match), 0, 0, out hv_HomMat2DScale); HOperatorSet.HomMat2dRotate(hv_HomMat2DScale, hv_Angle.TupleSelect( hv_Match), 0, 0, out hv_HomMat2DRotate); HOperatorSet.HomMat2dTranslate(hv_HomMat2DRotate, hv_Row.TupleSelect( hv_Match), hv_Column.TupleSelect(hv_Match), out hv_HomMat2DTranslate); ho_ContoursAffinTrans.Dispose(); HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ContoursAffinTrans, hv_HomMat2DTranslate); HOperatorSet.DispObj(ho_ContoursAffinTrans, hv_WindowHandle); } } } } ho_ModelContours.Dispose(); ho_ContoursAffinTrans.Dispose(); return; } catch (HalconException HDevExpDefaultException) { ho_ModelContours.Dispose(); ho_ContoursAffinTrans.Dispose(); throw HDevExpDefaultException; } }
public static void CreateFeatureModel(HObject ho_Image, HTuple hv_Rows, HTuple hv_Columns, HTuple hv_NumLevels, HTuple hv_AngleStart, HTuple hv_AngleExtent, HTuple hv_AngleStep, HTuple hv_ScaleMin, HTuple hv_ScaleMax, HTuple hv_MinContrast, HTuple hv_MaxContrast, HTuple hv_MinLength, out HTuple hv_ModelId, out HTuple hv_RowSource, out HTuple hv_ColumnSource, out HTuple hv_AngleSource, out HTuple hv_XldRows, out HTuple hv_XldCols, out HTuple hv_XldPointCounts) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_Region, ho_TemplateImage, ho_ModelContours; HObject ho_ObjectSelected = null; // Local control variables HTuple hv_AngleExtentOut = null, hv_AngleStartOut = null; HTuple hv_AngleStepOut = null, hv_Scale = null, hv_Score = null; HTuple hv_HomMat2D = null, hv_Num = null, hv_Index = null; HTuple hv_Cols = new HTuple(); HTuple hv_Rows_COPY_INP_TMP = hv_Rows.Clone(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_TemplateImage); HOperatorSet.GenEmptyObj(out ho_ModelContours); HOperatorSet.GenEmptyObj(out ho_ObjectSelected); hv_AngleExtentOut = hv_AngleExtent.Clone(); hv_AngleStartOut = hv_AngleStart.Clone(); hv_AngleStepOut = hv_AngleStep.Clone(); hv_AngleStartOut = hv_AngleStartOut.TupleRad(); hv_AngleExtentOut = hv_AngleExtentOut.TupleRad(); hv_AngleStepOut = hv_AngleStepOut.TupleRad(); ho_Region.Dispose(); HOperatorSet.GenRegionPolygonFilled(out ho_Region, hv_Rows_COPY_INP_TMP, hv_Columns); ho_TemplateImage.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_Region, out ho_TemplateImage); HOperatorSet.SetSystem("border_shape_models", "false"); HOperatorSet.CreateScaledShapeModel(ho_TemplateImage, hv_NumLevels, hv_AngleStartOut, hv_AngleExtentOut, hv_AngleStepOut, hv_ScaleMin, hv_ScaleMax, 0.0121, (new HTuple("none")).TupleConcat( "no_pregeneration"), "use_polarity", ((hv_MinContrast.TupleConcat(hv_MaxContrast))).TupleConcat( hv_MinLength), 3, out hv_ModelId); HOperatorSet.FindScaledShapeModel(ho_TemplateImage, hv_ModelId, hv_AngleStartOut, hv_AngleExtentOut, hv_ScaleMin, hv_ScaleMax, 0.5, 1, 0.5, "least_squares", hv_NumLevels, 0.9, out hv_RowSource, out hv_ColumnSource, out hv_AngleSource, out hv_Scale, out hv_Score); ho_ModelContours.Dispose(); HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelId, 1); HOperatorSet.VectorAngleToRigid(0, 0, 0, hv_RowSource, hv_ColumnSource, hv_AngleSource, out hv_HomMat2D); { HObject ExpTmpOutVar_0; HOperatorSet.AffineTransContourXld(ho_ModelContours, out ExpTmpOutVar_0, hv_HomMat2D); ho_ModelContours.Dispose(); ho_ModelContours = ExpTmpOutVar_0; } HOperatorSet.CountObj(ho_ModelContours, out hv_Num); hv_XldRows = new HTuple(); hv_XldCols = new HTuple(); hv_XldPointCounts = new HTuple(); HTuple end_val23 = hv_Num; HTuple step_val23 = 1; for (hv_Index = 1; hv_Index.Continue(end_val23, step_val23); hv_Index = hv_Index.TupleAdd(step_val23)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_ModelContours, out ho_ObjectSelected, hv_Index); HOperatorSet.GetContourXld(ho_ObjectSelected, out hv_Rows_COPY_INP_TMP, out hv_Cols); hv_XldRows = hv_XldRows.TupleConcat(hv_Rows_COPY_INP_TMP); hv_XldCols = hv_XldCols.TupleConcat(hv_Cols); hv_XldPointCounts = hv_XldPointCounts.TupleConcat(new HTuple(hv_Rows_COPY_INP_TMP.TupleLength())); } ho_Region.Dispose(); ho_TemplateImage.Dispose(); ho_ModelContours.Dispose(); ho_ObjectSelected.Dispose(); return; }
public static void FindFeatureModel(HObject ho_Image, HTuple hv_AngleStart, HTuple hv_AngleExtent, HTuple hv_AngleStep, HTuple hv_ScaleMin, HTuple hv_ScaleMax, HTuple hv_MinScore, HTuple hv_NumMatches, HTuple hv_ModelId, out HTuple hv_XldRowsM, out HTuple hv_XldColsM, out HTuple hv_XldPointCountsM, out HTuple hv_ModelRow, out HTuple hv_ModelColumn, out HTuple hv_ModelAngle, out HTuple hv_ModelScale, out HTuple hv_ModelScore) { // Local iconic variables HObject ho_ModelContours, ho_TransContours = null; HObject ho_ObjectSelected = null; // Local control variables HTuple hv_AngleExtentOut = null, hv_AngleStartOut = null; HTuple hv_AngleStepOut = null, hv_MatchingObjIdx = null; HTuple hv_HomMat = new HTuple(), hv_Num = new HTuple(); HTuple hv_Index = new HTuple(), hv_Rows = new HTuple(); HTuple hv_Cols = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ModelContours); HOperatorSet.GenEmptyObj(out ho_TransContours); HOperatorSet.GenEmptyObj(out ho_ObjectSelected); hv_AngleExtentOut = hv_AngleExtent.Clone(); hv_AngleStartOut = hv_AngleStart.Clone(); hv_AngleStepOut = hv_AngleStep.Clone(); hv_AngleStartOut = hv_AngleStartOut.TupleRad(); hv_AngleExtentOut = hv_AngleExtentOut.TupleRad(); hv_AngleStepOut = hv_AngleStepOut.TupleRad(); hv_XldRowsM = new HTuple(); hv_XldColsM = new HTuple(); hv_XldPointCountsM = new HTuple(); HOperatorSet.FindScaledShapeModel(ho_Image, hv_ModelId, hv_AngleStartOut, hv_AngleExtentOut, hv_ScaleMin, hv_ScaleMax, hv_MinScore, hv_NumMatches, 0.5, "least_squares", (new HTuple(5)).TupleConcat(1), 0.75, out hv_ModelRow, out hv_ModelColumn, out hv_ModelAngle, out hv_ModelScale, out hv_ModelScore);//1120.632 ho_ModelContours.Dispose(); HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelId, 1); for (hv_MatchingObjIdx = 0; (int)hv_MatchingObjIdx <= (int)((new HTuple(hv_ModelScore.TupleLength() )) - 1); hv_MatchingObjIdx = (int)hv_MatchingObjIdx + 1) { HOperatorSet.HomMat2dIdentity(out hv_HomMat); HOperatorSet.HomMat2dScale(hv_HomMat, hv_ModelScale.TupleSelect(hv_MatchingObjIdx), hv_ModelScale.TupleSelect(hv_MatchingObjIdx), 0, 0, out hv_HomMat); HOperatorSet.HomMat2dRotate(hv_HomMat, hv_ModelAngle.TupleSelect(hv_MatchingObjIdx), 0, 0, out hv_HomMat); HOperatorSet.HomMat2dTranslate(hv_HomMat, hv_ModelRow.TupleSelect(hv_MatchingObjIdx), hv_ModelColumn.TupleSelect(hv_MatchingObjIdx), out hv_HomMat); ho_TransContours.Dispose(); HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_TransContours, hv_HomMat); HOperatorSet.CountObj(ho_TransContours, out hv_Num); HTuple end_val19 = hv_Num; HTuple step_val19 = 1; for (hv_Index = 1; hv_Index.Continue(end_val19, step_val19); hv_Index = hv_Index.TupleAdd(step_val19)) { ho_ObjectSelected.Dispose(); HOperatorSet.SelectObj(ho_TransContours, out ho_ObjectSelected, hv_Index); HOperatorSet.GetContourXld(ho_ObjectSelected, out hv_Rows, out hv_Cols); hv_XldRowsM = hv_XldRowsM.TupleConcat(hv_Rows); hv_XldColsM = hv_XldColsM.TupleConcat(hv_Cols); hv_XldPointCountsM = hv_XldPointCountsM.TupleConcat(new HTuple(hv_Rows.TupleLength() )); } } ho_ModelContours.Dispose(); ho_TransContours.Dispose(); ho_ObjectSelected.Dispose();//1120.224 return; }
public MeasureResult Action() { #region 輸出結果 CircleResult mResult = null; #endregion // Local iconic variables HObject ho_R17_Circle = null; HObject ho_R17_ROI_Image = null, ho_R17_Region = null, ho_R17_ImageReduced = null; HObject ho_R17_Edges = null, ho_R17_ContoursSplit = null, ho_R17_SingleSegment = null; HObject ho_R17_ContEllipse = null; // Local control variables HTuple hv_msgOffsetY, hv_msgOffsetX; HTuple hv_STD_Row; HTuple hv_STD_Col, hv_Img_Row, hv_Img_Col, hv_Img_Rotate_Angle; HTuple hv_OffsetRow, hv_OffsetCol, hv_STD_R17_Row, hv_STD_R17_Col; HTuple hv_STD_R17_V_Row, hv_STD_R17_V_Col, hv_R17_X, hv_R17_Y; HTuple hv_R17_Pos_Row, hv_R17_Pos_Col, hv_R17_R; HTuple hv_alpha = new HTuple(), hv_R17_low = new HTuple(); HTuple hv_R17_high = new HTuple(), hv_R17_NumSegments = new HTuple(); HTuple hv_NumCircles = new HTuple(), hv_Num_Circle_Point = new HTuple(); HTuple hv_R17 = new HTuple(), hv_i = new HTuple(), hv_Attrib = new HTuple(); HTuple hv_R17_Row = new HTuple(), hv_R17_Column = new HTuple(); HTuple hv_R17_Radius = new HTuple(), hv_R17_StartPhi = new HTuple(); HTuple hv_R17_EndPhi = new HTuple(), hv_R17_PointOrder = new HTuple(); HTuple hv_R17_MinDist = new HTuple(), hv_R17_MaxDist = new HTuple(); HTuple hv_R17_AvgDist = new HTuple(), hv_R17_SigmaDist = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_R17_Circle); HOperatorSet.GenEmptyObj(out ho_R17_ROI_Image); HOperatorSet.GenEmptyObj(out ho_R17_Region); HOperatorSet.GenEmptyObj(out ho_R17_ImageReduced); HOperatorSet.GenEmptyObj(out ho_R17_Edges); HOperatorSet.GenEmptyObj(out ho_R17_ContoursSplit); HOperatorSet.GenEmptyObj(out ho_R17_SingleSegment); HOperatorSet.GenEmptyObj(out ho_R17_ContEllipse); //Measure: SDMS_R17 //Author: John Hsieh //Date: 2012 // dev_update_off(...); only in hdevelop HOperatorSet.SetSystem("border_shape_models", "false"); //****Message Args hv_msgOffsetY = 100; hv_msgOffsetX = 100; //****Model Args //STD 中心點 hv_STD_Row = 772; hv_STD_Col = 1003; //目前圖形 中心點 hv_Img_Row = hv_AllModelRow.Clone(); hv_Img_Col = hv_AllModelColumn.Clone(); //目前圖形 Rotate Angle hv_Img_Rotate_Angle = hv_AllModelAngle.Clone(); //目前圖形偏移量 hv_OffsetRow = hv_Img_Row - hv_STD_Row; hv_OffsetCol = hv_Img_Col - hv_STD_Col; //****Display if (HDevWindowStack.IsOpen()) { HOperatorSet.ClearWindow(HDevWindowStack.GetActive()); } if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive()); } //*****R17 //STD R17_ 位置 hv_STD_R17_Row = 802; hv_STD_R17_Col = 660; //STD 向量 STD_R17_ hv_STD_R17_V_Row = hv_STD_R17_Row - hv_STD_Row; hv_STD_R17_V_Col = hv_STD_R17_Col - hv_STD_Col; //R17_X, R17_Y 分量 hv_R17_X = (hv_STD_R17_V_Col * (hv_Img_Rotate_Angle.TupleCos())) + (hv_STD_R17_V_Row * (hv_Img_Rotate_Angle.TupleSin() )); hv_R17_Y = (hv_STD_R17_V_Row * (hv_Img_Rotate_Angle.TupleCos())) - (hv_STD_R17_V_Col * (hv_Img_Rotate_Angle.TupleSin() )); //目前圖形 R17_ 位置 hv_R17_Pos_Row = (hv_STD_Row + hv_R17_Y) + hv_OffsetRow; hv_R17_Pos_Col = (hv_STD_Col + hv_R17_X) + hv_OffsetCol; hv_R17_R = 17; ho_R17_Circle.Dispose(); HOperatorSet.GenCircle(out ho_R17_Circle, hv_R17_Pos_Row, hv_R17_Pos_Col, hv_R17_R); if (HDevWindowStack.IsOpen()) { //dev_display (R17_Circle) } //stop () ho_R17_ROI_Image.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_R17_Circle, out ho_R17_ROI_Image); ho_R17_Region.Dispose(); HOperatorSet.FastThreshold(ho_R17_ROI_Image, out ho_R17_Region, 100, 255, 15); ho_R17_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_R17_ROI_Image, ho_R17_Region, out ho_R17_ImageReduced ); //stop () //sobel_fast 具有較寬的選擇範圍,搭配 alpha 參數 (alpha 越大, 容錯範圍大) hv_alpha = 0.9; hv_R17_low = 10; hv_R17_high = 60; ho_R17_Edges.Dispose(); HOperatorSet.EdgesSubPix(ho_R17_ImageReduced, out ho_R17_Edges, "sobel_fast", hv_alpha, hv_R17_low, hv_R17_high); //stop () //*所有的數值越小,表示容錯範圍大,反之亦然 ho_R17_ContoursSplit.Dispose(); HOperatorSet.SegmentContoursXld(ho_R17_Edges, out ho_R17_ContoursSplit, "lines_circles", 17, 1, 1); //Display the results //=========================================================== HOperatorSet.CountObj(ho_R17_ContoursSplit, out hv_R17_NumSegments); hv_NumCircles = 0; hv_Num_Circle_Point = 0; hv_R17 = 999; for (hv_i = 1; hv_i.Continue(hv_R17_NumSegments, 1); hv_i = hv_i.TupleAdd(1)) { ho_R17_SingleSegment.Dispose(); HOperatorSet.SelectObj(ho_R17_ContoursSplit, out ho_R17_SingleSegment, hv_i); HOperatorSet.GetContourGlobalAttribXld(ho_R17_SingleSegment, "cont_approx", out hv_Attrib); if ((int)(new HTuple(hv_Attrib.TupleEqual(1))) != 0) { HOperatorSet.FitCircleContourXld(ho_R17_SingleSegment, "atukey", -1, 2, hv_Num_Circle_Point, 5, 2, out hv_R17_Row, out hv_R17_Column, out hv_R17_Radius, out hv_R17_StartPhi, out hv_R17_EndPhi, out hv_R17_PointOrder); ho_R17_ContEllipse.Dispose(); HOperatorSet.GenEllipseContourXld(out ho_R17_ContEllipse, hv_R17_Row, hv_R17_Column, 0, hv_R17_Radius, hv_R17_Radius, 0, (new HTuple(360)).TupleRad(), "positive", 1.0); if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_R17_ContEllipse, HDevWindowStack.GetActive()); } HOperatorSet.DistEllipseContourXld(ho_R17_SingleSegment, "algebraic", -1, 0, hv_R17_Row, hv_R17_Column, 0, hv_R17_Radius, hv_R17_Radius, out hv_R17_MinDist, out hv_R17_MaxDist, out hv_R17_AvgDist, out hv_R17_SigmaDist); hv_NumCircles = hv_NumCircles + 1; if ((int)(new HTuple(hv_R17.TupleGreater(hv_R17_Radius))) != 0) { hv_R17 = hv_R17_Radius.Clone(); mResult = new CircleResult() { Row = new HTuple(hv_R17_Row), Col = new HTuple(hv_R17_Column), Radius = new HTuple(hv_R17_Radius), StartPhi = new HTuple(hv_R17_StartPhi), EndPhi = new HTuple(hv_R17_EndPhi), PointOrder = new HTuple(hv_R17_PointOrder), }; } //stop () } } ho_R17_Circle.Dispose(); ho_R17_ROI_Image.Dispose(); ho_R17_Region.Dispose(); ho_R17_ImageReduced.Dispose(); ho_R17_Edges.Dispose(); ho_R17_ContoursSplit.Dispose(); ho_R17_SingleSegment.Dispose(); ho_R17_ContEllipse.Dispose(); return mResult; }
// Main procedure private void action() { // Local iconic variables HObject ho_Image, ho_DerivGauss = null, ho_RegionCrossings = null; HObject ho_Region = null, ho_region_outer = null, ho_contour_outer = null; HObject ho_ContCircle = null; // Local control variables HTuple hv_AcqHandle = null, hv_side = null; HTuple hv_dia = null, hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_HalfH = new HTuple(), hv_HalfW = new HTuple(); HTuple hv_row_len = new HTuple(), hv_row_outer = new HTuple(); HTuple hv_col_outer = new HTuple(), hv_Rows = new HTuple(); HTuple hv_Cols = new HTuple(), hv_i = new HTuple(), hv_Indices = new HTuple(); HTuple hv_Length = new HTuple(), hv_col_min = new HTuple(); HTuple hv_indice_min = new HTuple(), hv_col_max = new HTuple(); HTuple hv_indice_max = new HTuple(), hv_Row = new HTuple(); HTuple hv_Col = new HTuple(), hv_Radius = new HTuple(); HTuple hv_StartPhi = new HTuple(), hv_EndPhi = new HTuple(); HTuple hv_PointOrder = new HTuple(), hv_TupleMax = new HTuple(); HTuple hv_IndexMax = new HTuple(), hv_colToMax0 = new HTuple(); HTuple hv_output = new HTuple(), hv_outputmm = new HTuple(); HTuple hv_TupleMin = new HTuple(), hv_IndexMin = new HTuple(); HTuple hv_colToMin0 = new HTuple(), hv_Exception = null; HTuple hv_MessageError = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_DerivGauss); HOperatorSet.GenEmptyObj(out ho_RegionCrossings); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_region_outer); HOperatorSet.GenEmptyObj(out ho_contour_outer); HOperatorSet.GenEmptyObj(out ho_ContCircle); try { HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1, "default", -1, "false", "default", "GC3851M_CAM_4", 0, -1, out hv_AcqHandle); HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureTime", 3500.0); hv_side = 2; hv_dia = 1; HOperatorSet.GrabImageStart(hv_AcqHandle, -1); ho_Image.Dispose(); HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1); try { HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); //* Define constants and tuples: hv_HalfH = hv_Height / 2; hv_HalfW = hv_Width / 2; hv_row_len = hv_Height.Clone(); hv_row_outer = new HTuple(); hv_col_outer = new HTuple(); //* Edge detection ho_DerivGauss.Dispose(); HOperatorSet.DerivateGauss(ho_Image, out ho_DerivGauss, 1, "x"); //* diameter 2 doesn't have a clean background => different values if ((int)((new HTuple(hv_dia.TupleEqual(2))).TupleOr(new HTuple(hv_dia.TupleEqual( 5)))) != 0) { ho_RegionCrossings.Dispose(); HOperatorSet.DualThreshold(ho_DerivGauss, out ho_RegionCrossings, 20, 2, 2); ho_Region.Dispose(); HOperatorSet.Union1(ho_RegionCrossings, out ho_Region); } else { ho_RegionCrossings.Dispose(); HOperatorSet.DualThreshold(ho_DerivGauss, out ho_RegionCrossings, 20, 12, 2); ho_Region.Dispose(); HOperatorSet.Union1(ho_RegionCrossings, out ho_Region); } //* Retrieve points from detected edges HOperatorSet.GetRegionPoints(ho_Region, out hv_Rows, out hv_Cols); //* Side 1 => upper side closer to probe if ((int)(new HTuple(hv_side.TupleEqual(1))) != 0) { //* Extract the points which define the outer or inner edge if ((int)((new HTuple((new HTuple(hv_dia.TupleEqual(3))).TupleOr(new HTuple(hv_dia.TupleEqual( 4))))).TupleOr(new HTuple(hv_dia.TupleEqual(5)))) != 0) { HTuple end_val36 = hv_row_len; HTuple step_val36 = 1; for (hv_i = 1; hv_i.Continue(end_val36, step_val36); hv_i = hv_i.TupleAdd(step_val36)) { HOperatorSet.TupleFind(hv_Rows, hv_i - 1, out hv_Indices); //* if none point exists in this row replace it with an incremental interpolation if ((int)(new HTuple(hv_Indices.TupleEqual(-1))) != 0) { if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = (hv_row_outer.TupleSelect(hv_i - 2)) + 1; if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_col_outer.TupleSelect(hv_i - 2); continue; } HOperatorSet.TupleLength(hv_Indices, out hv_Length); HOperatorSet.TupleMin(hv_Cols.TupleSelect(hv_Indices), out hv_col_min); HOperatorSet.TupleFind(hv_Cols.TupleSelect(hv_Indices), hv_col_min, out hv_indice_min); if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = hv_Rows.TupleSelect(hv_Indices.TupleSelect(hv_indice_min)); if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_Cols.TupleSelect(hv_Indices.TupleSelect(hv_indice_min)); } } else if ((int)((new HTuple(hv_dia.TupleEqual(1))).TupleOr(new HTuple(hv_dia.TupleEqual( 2)))) != 0) { HTuple end_val51 = hv_row_len; HTuple step_val51 = 1; for (hv_i = 1; hv_i.Continue(end_val51, step_val51); hv_i = hv_i.TupleAdd(step_val51)) { HOperatorSet.TupleFind(hv_Rows, hv_i - 1, out hv_Indices); //* if none point exists in this row replace it with an incremental interpolation if ((int)(new HTuple(hv_Indices.TupleEqual(-1))) != 0) { if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = (hv_row_outer.TupleSelect(hv_i - 2)) + 1; if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_col_outer.TupleSelect(hv_i - 2); continue; } HOperatorSet.TupleLength(hv_Indices, out hv_Length); HOperatorSet.TupleMax(hv_Cols.TupleSelect(hv_Indices), out hv_col_max); HOperatorSet.TupleFind(hv_Cols.TupleSelect(hv_Indices), hv_col_max, out hv_indice_max); if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = hv_Rows.TupleSelect(hv_Indices.TupleSelect(hv_indice_max)); if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_Cols.TupleSelect(hv_Indices.TupleSelect(hv_indice_max)); } } //* retrieve the outer or inner edge points + cirlce fitting ho_region_outer.Dispose(); HOperatorSet.GenRegionPoints(out ho_region_outer, hv_row_outer, hv_col_outer); ho_contour_outer.Dispose(); HOperatorSet.GenContourPolygonXld(out ho_contour_outer, hv_row_outer, hv_col_outer); HOperatorSet.FitCircleContourXld(ho_contour_outer, "geotukey", -1, 0, 0, 3, 2, out hv_Row, out hv_Col, out hv_Radius, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder); ho_ContCircle.Dispose(); HOperatorSet.GenCircleContourXld(out ho_ContCircle, hv_Row, hv_Col, hv_Radius, 0, 6.28318, "positive", 1); HOperatorSet.GetContourXld(ho_ContCircle, out hv_Row, out hv_Col); //* find the maximum of the estimated circle HOperatorSet.TupleMax(hv_Col, out hv_TupleMax); HOperatorSet.TupleFindFirst(hv_Col, hv_TupleMax, out hv_IndexMax); //* calculate pixel and mm outputs hv_colToMax0 = hv_Col.TupleSelect(hv_IndexMax); hv_output = (-hv_HalfW) + hv_colToMax0; hv_outputmm = hv_output * 0.001675; } //* Side 2 => side closer to vertical moving axis if ((int)(new HTuple(hv_side.TupleEqual(2))) != 0) { //* Extract the points which define the outer or inner edge if ((int)((new HTuple((new HTuple(hv_dia.TupleEqual(3))).TupleOr(new HTuple(hv_dia.TupleEqual( 4))))).TupleOr(new HTuple(hv_dia.TupleEqual(5)))) != 0) { HTuple end_val88 = hv_row_len; HTuple step_val88 = 1; for (hv_i = 1; hv_i.Continue(end_val88, step_val88); hv_i = hv_i.TupleAdd(step_val88)) { HOperatorSet.TupleFind(hv_Rows, hv_i - 1, out hv_Indices); //* if none point exists in this row replace it with an incremental interpolation if ((int)(new HTuple(hv_Indices.TupleEqual(-1))) != 0) { if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = (hv_row_outer.TupleSelect(hv_i - 2)) + 1; if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_col_outer.TupleSelect(hv_i - 2); continue; } HOperatorSet.TupleLength(hv_Indices, out hv_Length); HOperatorSet.TupleMax(hv_Cols.TupleSelect(hv_Indices), out hv_col_max); HOperatorSet.TupleFind(hv_Cols.TupleSelect(hv_Indices), hv_col_max, out hv_indice_max); if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = hv_Rows.TupleSelect(hv_Indices.TupleSelect(hv_indice_max)); if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_Cols.TupleSelect(hv_Indices.TupleSelect(hv_indice_max)); } } else if ((int)((new HTuple(hv_dia.TupleEqual(1))).TupleOr(new HTuple(hv_dia.TupleEqual( 2)))) != 0) { HTuple end_val103 = hv_row_len; HTuple step_val103 = 1; for (hv_i = 1; hv_i.Continue(end_val103, step_val103); hv_i = hv_i.TupleAdd(step_val103)) { HOperatorSet.TupleFind(hv_Rows, hv_i - 1, out hv_Indices); //* if none point exists in this row replace it with an incremental interpolation if ((int)(new HTuple(hv_Indices.TupleEqual(-1))) != 0) { if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = (hv_row_outer.TupleSelect(hv_i - 2)) + 1; if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_col_outer.TupleSelect(hv_i - 2); continue; } HOperatorSet.TupleLength(hv_Indices, out hv_Length); HOperatorSet.TupleMin(hv_Cols.TupleSelect(hv_Indices), out hv_col_min); HOperatorSet.TupleFind(hv_Cols.TupleSelect(hv_Indices), hv_col_min, out hv_indice_min); if (hv_row_outer == null) { hv_row_outer = new HTuple(); } hv_row_outer[hv_i - 1] = hv_Rows.TupleSelect(hv_Indices.TupleSelect(hv_indice_min)); if (hv_col_outer == null) { hv_col_outer = new HTuple(); } hv_col_outer[hv_i - 1] = hv_Cols.TupleSelect(hv_Indices.TupleSelect(hv_indice_min)); } } //* retrieve the outer or inner edge points + cirlce fitting ho_region_outer.Dispose(); HOperatorSet.GenRegionPoints(out ho_region_outer, hv_row_outer, hv_col_outer); ho_contour_outer.Dispose(); HOperatorSet.GenContourPolygonXld(out ho_contour_outer, hv_row_outer, hv_col_outer); HOperatorSet.FitCircleContourXld(ho_contour_outer, "geotukey", -1, 0, 0, 3, 2, out hv_Row, out hv_Col, out hv_Radius, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder); ho_ContCircle.Dispose(); HOperatorSet.GenCircleContourXld(out ho_ContCircle, hv_Row, hv_Col, hv_Radius, 0, 6.28318, "positive", 1); HOperatorSet.GetContourXld(ho_ContCircle, out hv_Row, out hv_Col); //* find the minimum of the estimated circle HOperatorSet.TupleMin(hv_Col, out hv_TupleMin); HOperatorSet.TupleFindFirst(hv_Col, hv_TupleMin, out hv_IndexMin); //* calculate pixel and mm outputs hv_colToMin0 = hv_Col.TupleSelect(hv_IndexMin); hv_output = hv_HalfW - hv_colToMin0; hv_outputmm = hv_output * 0.001675; } } // catch (Exception) catch (HalconException HDevExpDefaultException1) { HDevExpDefaultException1.ToHTuple(out hv_Exception); hv_MessageError = " ERROR: Not able to analize photo, move horizontal axis"; } HOperatorSet.CloseFramegrabber(hv_AcqHandle); } catch (HalconException HDevExpDefaultException) { ho_Image.Dispose(); ho_DerivGauss.Dispose(); ho_RegionCrossings.Dispose(); ho_Region.Dispose(); ho_region_outer.Dispose(); ho_contour_outer.Dispose(); ho_ContCircle.Dispose(); throw HDevExpDefaultException; } ho_Image.Dispose(); ho_DerivGauss.Dispose(); ho_RegionCrossings.Dispose(); ho_Region.Dispose(); ho_region_outer.Dispose(); ho_contour_outer.Dispose(); ho_ContCircle.Dispose(); }
public void PZT_Detection_ext(HObject ho_RegionPZT_T, HObject ho_R, out HObject ho_Arrow, HTuple hv_mesureNumber, HTuple hv_angle, HTuple hv_mes_width, HTuple hv_sigma, HTuple hv_threshold, HTuple hv_dist_STD, out HTuple hv_dist_PZT, out HTuple hv_pZTOkNg, out HTuple hv_Rows1, out HTuple hv_Cols1, out HTuple hv_Rows2, out HTuple hv_Cols2) { HTuple hv_Dist = null, hv_Row = null, hv_Column = null; HTuple hv_Phi = null, hv_Length1 = null, hv_Length2 = null; HTuple hv_Inter = null, hv_RowStart = null, hv_ColStart = null; HTuple hv_Width = null, hv_Height = null, hv_i = null; HTuple hv_Row_Mes = new HTuple(), hv_Col_Mes = new HTuple(); HTuple hv_MeasureHandle = new HTuple(), hv_RowEdge1 = new HTuple(); HTuple hv_ColumnEdge1 = new HTuple(), hv_Amplitude1 = new HTuple(); HTuple hv_Distance1 = new HTuple(), hv_RowEdge2 = new HTuple(); HTuple hv_ColumnEdge2 = new HTuple(), hv_Amplitude2 = new HTuple(); HTuple hv_Distance2 = new HTuple(), hv_L1 = new HTuple(); HTuple hv_L2 = new HTuple(), hv_Distance = new HTuple(); HTuple hv_Dist_Index = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Arrow); hv_pZTOkNg = new HTuple(); hv_Rows1 = new HTuple(); hv_Cols1 = new HTuple(); hv_Rows2 = new HTuple(); hv_Cols2 = new HTuple(); hv_Dist = new HTuple(); ho_Arrow.Dispose(); HOperatorSet.GenEmptyObj(out ho_Arrow); HOperatorSet.SmallestRectangle2(ho_RegionPZT_T, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); hv_Inter = (((2 * hv_Length2) / hv_mesureNumber)).TupleFloor(); hv_RowStart = hv_Row + ((hv_Length2 - (hv_Inter / 2)) * (((hv_angle + ((new HTuple(90)).TupleRad() ))).TupleSin())); hv_ColStart = hv_Column - ((hv_Length2 - (hv_Inter / 2)) * (((hv_angle + ((new HTuple(90)).TupleRad() ))).TupleCos())); HOperatorSet.GetImageSize(ho_R, out hv_Width, out hv_Height); HTuple end_val11 = hv_mesureNumber - 1; HTuple step_val11 = 1; for (hv_i = 0; hv_i.Continue(end_val11, step_val11); hv_i = hv_i.TupleAdd(step_val11)) { hv_Row_Mes = hv_RowStart - ((hv_Inter * hv_i) * (((hv_angle + ((new HTuple(90)).TupleRad() ))).TupleSin())); hv_Col_Mes = hv_ColStart + ((hv_Inter * hv_i) * (((hv_angle + ((new HTuple(90)).TupleRad() ))).TupleCos())); HOperatorSet.GenMeasureRectangle2(hv_Row_Mes, hv_Col_Mes, hv_angle, hv_Length1, hv_mes_width, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle); HOperatorSet.MeasurePos(ho_R, hv_MeasureHandle, hv_sigma, hv_threshold, "positive", "first", out hv_RowEdge1, out hv_ColumnEdge1, out hv_Amplitude1, out hv_Distance1); HOperatorSet.MeasurePos(ho_R, hv_MeasureHandle, hv_sigma, hv_threshold, "negative", "last", out hv_RowEdge2, out hv_ColumnEdge2, out hv_Amplitude2, out hv_Distance2); HOperatorSet.CloseMeasure(hv_MeasureHandle); HOperatorSet.TupleLength(hv_RowEdge1, out hv_L1); HOperatorSet.TupleLength(hv_RowEdge2, out hv_L2); if ((int)((new HTuple(hv_L1.TupleNotEqual(1))).TupleOr(new HTuple(hv_L2.TupleNotEqual( 1)))) != 0) { continue; } hv_Rows1 = hv_Rows1.TupleConcat(hv_RowEdge1); hv_Cols1 = hv_Cols1.TupleConcat(hv_ColumnEdge1); hv_Rows2 = hv_Rows2.TupleConcat(hv_RowEdge2); hv_Cols2 = hv_Cols2.TupleConcat(hv_ColumnEdge2); HOperatorSet.DistancePp(hv_RowEdge1, hv_ColumnEdge1, hv_RowEdge2, hv_ColumnEdge2, out hv_Distance); hv_Dist = hv_Dist.TupleConcat(hv_Distance); } ho_Arrow.Dispose(); gen_arrow_contour_xld(out ho_Arrow, hv_Rows1, hv_Cols1, hv_Rows2, hv_Cols2, 20, 20); HOperatorSet.TupleSortIndex(hv_Dist, out hv_Dist_Index); hv_dist_PZT = hv_Dist.TupleSelect(hv_Dist_Index.TupleSelectRange(1, (new HTuple(hv_Dist_Index.TupleLength() )) - 2)); hv_dist_PZT = hv_dist_PZT.TupleMean(); if ((int)(new HTuple(hv_dist_PZT.TupleGreater(hv_dist_STD))) != 0) { hv_pZTOkNg = 1; } else { hv_pZTOkNg = 0; } return; }
/// <summary> /// 初始化後才能叫用 Action /// </summary> public MeasureResult Action() { #region 輸出結果, CircleResult or Distance Result CircleResult mResult = null; #endregion // Local iconic variables HObject ho_R1_Circle = null; HObject ho_R1_ROI_Image = null, ho_R1_Region = null, ho_R1_ImageReduced = null; HObject ho_R1_Edges = null, ho_R1_ContoursSplit = null, ho_R1_SingleSegment = null; //HObject ho_R1_ContEllipse = null; // Local control variables HTuple hv_msgOffsetY, hv_msgOffsetX; //HTuple hv_AllModelId; HTuple hv_STD_Row; HTuple hv_STD_Col, hv_Img_Row, hv_Img_Col, hv_Img_Rotate_Angle; HTuple hv_OffsetRow, hv_OffsetCol, hv_STD_R1_Row, hv_STD_R1_Col; HTuple hv_STD_R1_V_Row, hv_STD_R1_V_Col, hv_R1_X, hv_R1_Y; HTuple hv_R1_Pos_Row, hv_R1_Pos_Col, hv_R1_R; HTuple hv_alpha = new HTuple(), hv_R1_low = new HTuple(), hv_R1_high = new HTuple(); HTuple hv_R1_NumSegments = new HTuple(), hv_NumCircles = new HTuple(); HTuple hv_Num_Circle_Point = new HTuple(), hv_R1 = new HTuple(); HTuple hv_R1_limit = new HTuple(), hv_i = new HTuple(), hv_Attrib = new HTuple(); HTuple hv_R1_Row = new HTuple(), hv_R1_Column = new HTuple(); HTuple hv_R1_Radius = new HTuple(), hv_R1_StartPhi = new HTuple(); HTuple hv_R1_EndPhi = new HTuple(), hv_R1_PointOrder = new HTuple(); HTuple hv_R1_MinDist = new HTuple(), hv_R1_MaxDist = new HTuple(); HTuple hv_R1_AvgDist = new HTuple(), hv_R1_SigmaDist = new HTuple(); HTuple hv_ResultText = new HTuple(), hv_MeasureReasult; // Initialize local and output iconic variables //HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_R1_Circle); HOperatorSet.GenEmptyObj(out ho_R1_ROI_Image); HOperatorSet.GenEmptyObj(out ho_R1_Region); HOperatorSet.GenEmptyObj(out ho_R1_ImageReduced); HOperatorSet.GenEmptyObj(out ho_R1_Edges); HOperatorSet.GenEmptyObj(out ho_R1_ContoursSplit); HOperatorSet.GenEmptyObj(out ho_R1_SingleSegment); //HOperatorSet.GenEmptyObj(out ho_R1_ContEllipse); //Measure: SDMS_R1 //Author: John Hsieh //Date: 2012 //ho_Image.Dispose(); //HOperatorSet.ReadImage(out ho_Image, "D:/Projects/Halcon/SDMS/SDMS_Measure/Images/E-1/E1-1.bmp"); //dev_open_window_fit_image(ho_Image, 0, 0, -1, -1, out hv_WindowHandle); //dev_update_off () // dev_update_window(...); only in hdevelop HOperatorSet.SetSystem("border_shape_models", "false"); //****Message Args hv_msgOffsetY = 100; hv_msgOffsetX = 100; //****Model All //HOperatorSet.ReadShapeModel("D:/Projects/Halcon/SDMS/SDMS_Measure/Model/MatchingAll.shm", // out hv_AllModelId); //ho_AllModelContours.Dispose(); //HOperatorSet.GetShapeModelContours(out ho_AllModelContours, hv_AllModelId, 1); //HOperatorSet.FindShapeModel(ho_Image, hv_AllModelId, (new HTuple(0)).TupleRad() // , (new HTuple(360)).TupleRad(), 0.5, 1, 0.5, "least_squares", 6, 0.75, out hv_AllModelRow, // out hv_AllModelColumn, out hv_AllModelAngle, out modelScore); //****Model Args //STD 中心點 hv_STD_Row = 772; hv_STD_Col = 1003; //目前圖形 中心點 hv_Img_Row = hv_AllModelRow.Clone(); hv_Img_Col = hv_AllModelColumn.Clone(); //目前圖形 Rotate Angle hv_Img_Rotate_Angle = hv_AllModelAngle.Clone(); //目前圖形偏移量 hv_OffsetRow = hv_Img_Row - hv_STD_Row; hv_OffsetCol = hv_Img_Col - hv_STD_Col; //****R1 //STD R1_ 位置 hv_STD_R1_Row = 589; hv_STD_R1_Col = 705; //STD 向量 STD_R1_ hv_STD_R1_V_Row = hv_STD_R1_Row - hv_STD_Row; hv_STD_R1_V_Col = hv_STD_R1_Col - hv_STD_Col; //R1_X, R1_Y 分量 hv_R1_X = (hv_STD_R1_V_Col * (hv_Img_Rotate_Angle.TupleCos())) + (hv_STD_R1_V_Row * (hv_Img_Rotate_Angle.TupleSin() )); hv_R1_Y = (hv_STD_R1_V_Row * (hv_Img_Rotate_Angle.TupleCos())) - (hv_STD_R1_V_Col * (hv_Img_Rotate_Angle.TupleSin() )); //目前圖形 R1_ 位置 hv_R1_Pos_Row = (hv_STD_Row + hv_R1_Y) + hv_OffsetRow; hv_R1_Pos_Col = (hv_STD_Col + hv_R1_X) + hv_OffsetCol; hv_R1_R = 20; //*ROI ho_R1_Circle.Dispose(); HOperatorSet.GenCircle(out ho_R1_Circle, hv_R1_Pos_Row, hv_R1_Pos_Col, hv_R1_R); ho_R1_ROI_Image.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_R1_Circle, out ho_R1_ROI_Image); ho_R1_Region.Dispose(); HOperatorSet.FastThreshold(ho_R1_ROI_Image, out ho_R1_Region, 100, 255, 20); ho_R1_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_R1_ROI_Image, ho_R1_Region, out ho_R1_ImageReduced ); //sobel_fast 具有較寬的選擇範圍,搭配 alpha 參數 (alpha 越大, 容錯範圍大) hv_alpha = 0.9; hv_R1_low = 20; hv_R1_high = 40; ho_R1_Edges.Dispose(); HOperatorSet.EdgesSubPix(ho_R1_ImageReduced, out ho_R1_Edges, "sobel_fast", hv_alpha, hv_R1_low, hv_R1_high); //stop () //*所有的數值越小,表示容錯範圍大,反之亦然 ho_R1_ContoursSplit.Dispose(); HOperatorSet.SegmentContoursXld(ho_R1_Edges, out ho_R1_ContoursSplit, "lines_circles", 17, 1, 1); //Display the results //=========================================================== HOperatorSet.CountObj(ho_R1_ContoursSplit, out hv_R1_NumSegments); hv_NumCircles = 0; hv_Num_Circle_Point = 5; hv_R1 = 999; hv_R1_limit = 10; for (hv_i = 1; hv_i.Continue(hv_R1_NumSegments, 1); hv_i = hv_i.TupleAdd(1)) { ho_R1_SingleSegment.Dispose(); HOperatorSet.SelectObj(ho_R1_ContoursSplit, out ho_R1_SingleSegment, hv_i); HOperatorSet.GetContourGlobalAttribXld(ho_R1_SingleSegment, "cont_approx", out hv_Attrib); if ((int)(new HTuple(hv_Attrib.TupleEqual(1))) != 0) { HOperatorSet.FitCircleContourXld(ho_R1_SingleSegment, "atukey", -1, 2, hv_Num_Circle_Point, 5, 2, out hv_R1_Row, out hv_R1_Column, out hv_R1_Radius, out hv_R1_StartPhi, out hv_R1_EndPhi, out hv_R1_PointOrder); //ho_R1_ContEllipse.Dispose(); //HOperatorSet.GenEllipseContourXld(out ho_R1_ContEllipse, hv_R1_Row, hv_R1_Column, // 0, hv_R1_Radius, hv_R1_Radius, 0, (new HTuple(360)).TupleRad(), "positive", // 1.0); //HOperatorSet.DistEllipseContourXld(ho_R1_SingleSegment, "algebraic", -1, // 0, hv_R1_Row, hv_R1_Column, 0, hv_R1_Radius, hv_R1_Radius, out hv_R1_MinDist, // out hv_R1_MaxDist, out hv_R1_AvgDist, out hv_R1_SigmaDist); hv_NumCircles = hv_NumCircles + 1; if ((int)(new HTuple(hv_R1.TupleGreater(hv_R1_Radius))) != 0) { hv_R1 = hv_R1_Radius.Clone(); //hv_ResultText = (((("C" + hv_NumCircles) + ": Radius = ") + (hv_R1_Radius.TupleString( // ".3"))) + " / MaxDeviation: ") + (hv_R1_MaxDist.TupleString(".3")); //HOperatorSet.SetTposition(hv_WindowHandle, hv_R1_Pos_Row - hv_msgOffsetY, // hv_R1_Pos_Col - hv_msgOffsetX); //HOperatorSet.WriteString(hv_WindowHandle, "R1"); #region 組合結果 mResult = new CircleResult(new HTuple(hv_R1_Row) , new HTuple(hv_R1_Column) , new HTuple(hv_R1_Radius) , new HTuple(hv_R1_StartPhi) , new HTuple(hv_R1_EndPhi) , new HTuple(hv_R1_PointOrder)) { }; #endregion } } } hv_MeasureReasult = hv_R1.Clone(); //****R1 End //ho_Image.Dispose(); ho_R1_Circle.Dispose(); ho_R1_ROI_Image.Dispose(); ho_R1_Region.Dispose(); ho_R1_ImageReduced.Dispose(); ho_R1_Edges.Dispose(); ho_R1_ContoursSplit.Dispose(); ho_R1_SingleSegment.Dispose(); //ho_R1_ContEllipse.Dispose(); return mResult; }
public void FitCicrle(HObject ho_Image, HTuple hv_WindowHandle, HTuple hv_CircleRow, HTuple hv_CircleColumn, HTuple hv_CircleRadius, HTuple hv_RectRow, HTuple hv_RectColumn, HTuple hv_RectPhi, HTuple hv_RectLength1, HTuple hv_RectLength2, HTuple hv_Transition, HTuple hv_Sigma, HTuple hv_Threshold, out HTuple hv_CenterRow, out HTuple hv_CenterColumn, out HTuple hv_CenterRaduis, out HTuple hv_StartPhi, out HTuple hv_EndPhi, out HTuple hv_Circularity) { // Local iconic variables HObject ho_Rectangle, ho_Contour; // Local control variables HTuple hv_Width = null, hv_Height = null, hv_sr = null; HTuple hv_sc = null, hv_lenth1 = null, hv_lenth2 = null; HTuple hv_val = null, hv_PointNum = null, hv_mr = null; HTuple hv_mc = null, hv_ag = null, hv_i = null, hv_lr = null; HTuple hv_lc = null, hv_j = null, hv_MeasureHandle = new HTuple(); HTuple hv_RowEdge = new HTuple(), hv_ColumnEdge = new HTuple(); HTuple hv_Amplitude = new HTuple(), hv_Distance = new HTuple(); HTuple hv_RowEdgeCount = new HTuple(), hv_RowEdgeVal = new HTuple(); HTuple hv_Indices = new HTuple(), hv_RowEdgeValMin = new HTuple(); HTuple hv_rc = null, hv_zr = null, hv_zc = null, hv_PointOrder = null; HTuple hv_CircleColumn_COPY_INP_TMP = hv_CircleColumn.Clone(); HTuple hv_CircleRow_COPY_INP_TMP = hv_CircleRow.Clone(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_Contour); hv_CenterRow = new HTuple(); hv_CenterColumn = new HTuple(); hv_CenterRaduis = new HTuple(); hv_StartPhi = new HTuple(); hv_EndPhi = new HTuple(); hv_Circularity = new HTuple(); try { if (HDevWindowStack.IsOpen()) { HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin"); } if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green"); } HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); // //tuple_deg (RectPhi, Deg) // //gen_circle_contour_xld (ContCircle, CircleRow, CircleColumn, CircleRadius, 0, 6.28318/2, 'positive', 1) // hv_sr = hv_CircleRow_COPY_INP_TMP - hv_CircleRadius; hv_sc = hv_CircleColumn_COPY_INP_TMP.Clone(); // if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red"); } // hv_lenth1 = hv_CircleRadius / 2.5; hv_lenth2 = hv_CircleRadius / 8; //lenth1 := RectLength1 //lenth2 := RectLength2 hv_val = 5; hv_PointNum = (6.28318 * hv_CircleRadius) / ((hv_lenth2 + hv_val) * 2); // hv_mr = hv_sr.Clone(); hv_mc = hv_sc.Clone(); // ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_mr, hv_mc, (new HTuple(0 + 90)).TupleRad() , hv_lenth1, hv_lenth2); // hv_ag = 10; // HOperatorSet.DispImage(ho_Image, 3600); //tuple_rad (ag, rd) // HTuple end_val30 = 360 / hv_ag; HTuple step_val30 = 1; for (hv_i = 0; hv_i.Continue(end_val30, step_val30); hv_i = hv_i.TupleAdd(step_val30)) { hv_mr = hv_sr + (hv_CircleRadius * (1 - ((((hv_ag.TupleRad()) * hv_i)).TupleCos() ))); hv_mc = hv_sc - (hv_CircleRadius * ((((hv_ag.TupleRad()) * hv_i)).TupleSin())); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_mr, hv_mc, (((hv_ag * hv_i) + 90)).TupleRad() , hv_lenth1, hv_lenth2); } // //stop () // hv_lr = new HTuple(); hv_lc = new HTuple(); // if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive()); } hv_j = 0; if (HDevWindowStack.IsOpen()) { //dev_set_draw ('fill') } if (HDevWindowStack.IsOpen()) { HOperatorSet.SetLineWidth(HDevWindowStack.GetActive(), 1); } // HTuple end_val46 = 360 / hv_ag; HTuple step_val46 = 1; for (hv_i = 0; hv_i.Continue(end_val46, step_val46); hv_i = hv_i.TupleAdd(step_val46)) { if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green"); } // hv_mr = hv_sr + (hv_CircleRadius * (1 - ((((hv_ag.TupleRad()) * hv_i)).TupleCos() ))); hv_mc = hv_sc - (hv_CircleRadius * ((((hv_ag.TupleRad()) * hv_i)).TupleSin())); // ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_mr, hv_mc, (((hv_ag * hv_i) + 90)).TupleRad() , hv_lenth1, hv_lenth2); // HOperatorSet.GenMeasureRectangle2(hv_mr, hv_mc, (((hv_ag * hv_i) + 90)).TupleRad() , hv_lenth1, hv_lenth2, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle); //Transition = 'positive' :dark-to-light; Transition = 'negative': light-to-dark HOperatorSet.MeasurePos(ho_Image, hv_MeasureHandle, hv_Sigma, hv_Threshold, hv_Transition, "all", out hv_RowEdge, out hv_ColumnEdge, out hv_Amplitude, out hv_Distance); // if ((int)(new HTuple((new HTuple(hv_RowEdge.TupleLength())).TupleEqual(0))) != 0) { if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red"); } HOperatorSet.DispCross(hv_WindowHandle, hv_mr, hv_mc, 20, (new HTuple(45)).TupleRad() ); //stop () } else if ((int)(new HTuple((new HTuple(hv_RowEdge.TupleLength())).TupleEqual( 1))) != 0) { if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green"); } HOperatorSet.DispCross(hv_WindowHandle, hv_RowEdge, hv_ColumnEdge, 20, (new HTuple(45)).TupleRad()); if (hv_lr == null) { hv_lr = new HTuple(); } hv_lr[hv_j] = hv_RowEdge.TupleSelect(0); if (hv_lc == null) { hv_lc = new HTuple(); } hv_lc[hv_j] = hv_ColumnEdge.TupleSelect(0); hv_j = hv_j + 1; } else if ((int)(new HTuple((new HTuple(hv_RowEdge.TupleLength())).TupleNotEqual( 1))) != 0) { //By position near DrawLine hv_RowEdgeCount = new HTuple(hv_RowEdge.TupleLength()); hv_RowEdgeVal = hv_RowEdge - hv_mr; HOperatorSet.TupleAbs(hv_RowEdgeVal, out hv_RowEdgeVal); //tuple_sort_index (RowEdgeVal, Indices) HOperatorSet.TupleMin(hv_RowEdgeVal, out hv_RowEdgeValMin); HOperatorSet.TupleFind(hv_RowEdgeVal, hv_RowEdgeValMin, out hv_Indices); if ((int)(new HTuple((new HTuple(hv_Indices.TupleLength())).TupleEqual( 1))) != 0) { if (hv_lr == null) { hv_lr = new HTuple(); } hv_lr[hv_j] = hv_RowEdge.TupleSelect(hv_Indices); if (hv_lc == null) { hv_lc = new HTuple(); } hv_lc[hv_j] = hv_ColumnEdge.TupleSelect(hv_Indices); } else { if (hv_lr == null) { hv_lr = new HTuple(); } hv_lr[hv_j] = hv_RowEdge.TupleSelect(hv_Indices.TupleSelect(0)); if (hv_lc == null) { hv_lc = new HTuple(); } hv_lc[hv_j] = hv_ColumnEdge.TupleSelect(hv_Indices.TupleSelect(0)); } hv_j = hv_j + 1; if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "blue"); } HOperatorSet.DispCross(hv_WindowHandle, hv_RowEdge.TupleSelect(hv_Indices), hv_ColumnEdge.TupleSelect(hv_Indices), 20, (new HTuple(45)).TupleRad() ); // //By Threshold } HOperatorSet.CloseMeasure(hv_MeasureHandle); } // //stop () // hv_rc = new HTuple(); hv_zr = new HTuple(); hv_zc = new HTuple(); // hv_CircleRow_COPY_INP_TMP = hv_lr.Clone(); hv_CircleColumn_COPY_INP_TMP = hv_lc.Clone(); // // if ((int)(new HTuple((new HTuple(hv_CircleRow_COPY_INP_TMP.TupleLength())).TupleLess( 4))) != 0) { disp_message(hv_WindowHandle, "FitLine Fail", "image", 10, 10, "black", "true"); ho_Rectangle.Dispose(); ho_Contour.Dispose(); return; } ho_Contour.Dispose(); HOperatorSet.GenContourPolygonXld(out ho_Contour, hv_CircleRow_COPY_INP_TMP, hv_CircleColumn_COPY_INP_TMP); // HOperatorSet.FitCircleContourXld(ho_Contour, "algebraic", -1, 0, 0, 3, 2, out hv_CenterRow, out hv_CenterColumn, out hv_CenterRaduis, out hv_StartPhi, out hv_EndPhi, out hv_PointOrder); HOperatorSet.CircularityXld(ho_Contour, out hv_Circularity); // if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "blue"); } HOperatorSet.DispCircle(hv_WindowHandle, hv_CenterRow, hv_CenterColumn, hv_CenterRaduis); // ho_Rectangle.Dispose(); ho_Contour.Dispose(); return; } catch (HalconException HDevExpDefaultException) { ho_Rectangle.Dispose(); ho_Contour.Dispose(); throw HDevExpDefaultException; } }
// Main procedure private void porosityHorizonatal() { // Local iconic variables HObject ho_Image = null, ho_Rectangle = null, ho_ImageReduced = null; HObject ho_ImageMean = null, ho_Region = null, ho_ConnectedRegions = null; HObject ho_RegionClosing = null, ho_SmallConnection = null; HObject ho_ContCircle = null; // Local control variables HTuple hv_AcqHandle = null, hv_found = null; HTuple hv_cnt = null, hv_bol = null, hv_porosity_area_px = null; HTuple hv_porosity_area_mm = null; HTuple hv_UsedThreshold = new HTuple(), hv_Circularity = new HTuple(); HTuple hv_Area = new HTuple(), hv_Row = new HTuple(), hv_Column = new HTuple(); HTuple hv_Length = new HTuple(), hv_circ_min = new HTuple(); HTuple hv_area_min = new HTuple(), hv_index = new HTuple(); HTuple hv_i = 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_ImageMean); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionClosing); HOperatorSet.GenEmptyObj(out ho_SmallConnection); HOperatorSet.GenEmptyObj(out ho_ContCircle); // Wait for CAM4 thread to be closed _waitHandleCam3.WaitOne(); // Close te thread DOOR _waitHandleCam3.Reset(); // Open camera frame HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1, "default", -1, "false", "default", "GC2591MP_CAM_3", 0, -1, out hv_AcqHandle); HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "ExposureTime", 35000.0); // 30 000 // Information for PLC that frame is opened DetectionHorStart(); hv_found = 0; hv_cnt = 0; hv_bol = 0; Porositydetectedhor = false; while (Porositydetectedhor == false) { ho_Image.Dispose(); HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle); ho_Rectangle.Dispose(); //HOperatorSet.GenRectangle1(out ho_Rectangle, 520, 200, 1050, 700); //HOperatorSet.GenRectangle1(out ho_Rectangle, 1020, 200, 1460, 700); HOperatorSet.GenRectangle1(out ho_Rectangle, 900, 200, 1460, 700); //HOperatorSet.GenRectangle1(out ho_Rectangle, 1120, 200, 1630, 700); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced); ho_ImageMean.Dispose(); HOperatorSet.MeanImage(ho_ImageReduced, out ho_ImageMean, 21, 21); ho_Region.Dispose(); HOperatorSet.BinaryThreshold(ho_ImageMean, out ho_Region, "max_separability", "dark", out hv_UsedThreshold); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions); ho_RegionClosing.Dispose(); HOperatorSet.ClosingCircle(ho_ConnectedRegions, out ho_RegionClosing, 17); ho_SmallConnection.Dispose(); HOperatorSet.Connection(ho_RegionClosing, out ho_SmallConnection); HOperatorSet.Circularity(ho_SmallConnection, out hv_Circularity); HOperatorSet.AreaCenter(ho_SmallConnection, out hv_Area, out hv_Row, out hv_Column); HOperatorSet.TupleLength(hv_Row, out hv_Length); // Criteria for porosity hv_circ_min = 0.5; hv_area_min = 300; // 300 - HDev //1000 hv_index = 0; HTuple end_val36 = hv_Length; HTuple step_val36 = 1; for (hv_i = 1; hv_i.Continue(end_val36, step_val36); hv_i = hv_i.TupleAdd(step_val36)) { if ((int)((new HTuple(((hv_Circularity.TupleSelect(hv_i - 1))).TupleGreater( hv_circ_min))).TupleAnd(new HTuple(((hv_Area.TupleSelect(hv_i - 1))).TupleGreater( hv_area_min)))) != 0) { hv_index = hv_i - 1; hv_found = hv_found + 1; hv_bol = 1; break; } else { hv_bol = 0; } } //HOperatorSet.ClearWindow(hv_porosityWinHandle); //HOperatorSet.DispObj(ho_Image, hv_porosityWinHandle); if ((int)((new HTuple(hv_found.TupleGreater(0))).TupleAnd(new HTuple(hv_bol.TupleEqual( 1)))) != 0) { PorosityIsDetected(); ho_ContCircle.Dispose(); //HOperatorSet.GenCircleContourXld(out ho_ContCircle, hv_Row.TupleSelect(hv_index), // hv_Column.TupleSelect(hv_index), 50, 0, 6.28318, "positive", 1); //HOperatorSet.DispObj(ho_ContCircle, hv_porosityWinHandle); hv_found = 0; hv_cnt = 0; Porositydetectedhor = true; } hv_cnt = hv_cnt + 1; } //HOperatorSet.ClearWindow(hv_porosityWinHandle); HOperatorSet.CloseFramegrabber(hv_AcqHandle); // Open the thread DOOR _waitHandleCam3.Set(); // Dispose all iconic variables ho_Image.Dispose(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_ImageMean.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionClosing.Dispose(); ho_SmallConnection.Dispose(); ho_ContCircle.Dispose(); }
public MeasureResult Action() { #region 輸出結果 CircleResult mResult = null; #endregion // Local iconic variables HObject ho_R19_Circle = null; HObject ho_R19_ROI_Image = null, ho_R19_Region = null, ho_R19_ImageReduced = null; HObject ho_R19_Edges = null, ho_R19_ContoursSplit = null, ho_R19_SingleSegment = null; HObject ho_R19_ContEllipse = null; // Local control variables HTuple hv_msgOffsetY, hv_msgOffsetX; HTuple hv_STD_Row; HTuple hv_STD_Col, hv_Img_Row, hv_Img_Col, hv_Img_Rotate_Angle; HTuple hv_OffsetRow, hv_OffsetCol, hv_STD_R19_Row, hv_STD_R19_Col; HTuple hv_STD_R19_V_Row, hv_STD_R19_V_Col, hv_R19_X, hv_R19_Y; HTuple hv_R19_Pos_Row, hv_R19_Pos_Col, hv_R19_R; HTuple hv_alpha = new HTuple(), hv_R19_low = new HTuple(); HTuple hv_R19_high = new HTuple(), hv_R19_NumSegments = new HTuple(); HTuple hv_NumCircles = new HTuple(), hv_Num_Circle_Point = new HTuple(); HTuple hv_R19 = new HTuple(), hv_i = new HTuple(), hv_Attrib = new HTuple(); HTuple hv_R19_Row = new HTuple(), hv_R19_Column = new HTuple(); HTuple hv_R19_Radius = new HTuple(), hv_R19_StartPhi = new HTuple(); HTuple hv_R19_EndPhi = new HTuple(), hv_R19_PointOrder = new HTuple(); HTuple hv_R19_MinDist = new HTuple(), hv_R19_MaxDist = new HTuple(); HTuple hv_R19_AvgDist = new HTuple(), hv_R19_SigmaDist = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_R19_Circle); HOperatorSet.GenEmptyObj(out ho_R19_ROI_Image); HOperatorSet.GenEmptyObj(out ho_R19_Region); HOperatorSet.GenEmptyObj(out ho_R19_ImageReduced); HOperatorSet.GenEmptyObj(out ho_R19_Edges); HOperatorSet.GenEmptyObj(out ho_R19_ContoursSplit); HOperatorSet.GenEmptyObj(out ho_R19_SingleSegment); HOperatorSet.GenEmptyObj(out ho_R19_ContEllipse); //Measure: SDMS_R19 //Author: John Hsieh //Date: 2012 HOperatorSet.SetSystem("border_shape_models", "false"); //****Message Args hv_msgOffsetY = 100; hv_msgOffsetX = 100; //****Model Args //STD 中心點 hv_STD_Row = 772; hv_STD_Col = 1003; //目前圖形 中心點 hv_Img_Row = hv_AllModelRow.Clone(); hv_Img_Col = hv_AllModelColumn.Clone(); //目前圖形 Rotate Angle hv_Img_Rotate_Angle = hv_AllModelAngle.Clone(); //目前圖形偏移量 hv_OffsetRow = hv_Img_Row - hv_STD_Row; hv_OffsetCol = hv_Img_Col - hv_STD_Col; //****Display if (HDevWindowStack.IsOpen()) { HOperatorSet.ClearWindow(HDevWindowStack.GetActive()); } if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive()); } //****R19 //STD R19_ 位置 hv_STD_R19_Row = 794; hv_STD_R19_Col = 620; //STD 向量 STD_R19_ hv_STD_R19_V_Row = hv_STD_R19_Row - hv_STD_Row; hv_STD_R19_V_Col = hv_STD_R19_Col - hv_STD_Col; //R19_X, R19_Y 分量 hv_R19_X = (hv_STD_R19_V_Col * (hv_Img_Rotate_Angle.TupleCos())) + (hv_STD_R19_V_Row * (hv_Img_Rotate_Angle.TupleSin() )); hv_R19_Y = (hv_STD_R19_V_Row * (hv_Img_Rotate_Angle.TupleCos())) - (hv_STD_R19_V_Col * (hv_Img_Rotate_Angle.TupleSin() )); //目前圖形 R19_ 位置 hv_R19_Pos_Row = (hv_STD_Row + hv_R19_Y) + hv_OffsetRow; hv_R19_Pos_Col = (hv_STD_Col + hv_R19_X) + hv_OffsetCol; hv_R19_R = 15; ho_R19_Circle.Dispose(); HOperatorSet.GenCircle(out ho_R19_Circle, hv_R19_Pos_Row, hv_R19_Pos_Col, hv_R19_R); if (HDevWindowStack.IsOpen()) { //dev_display (R19_Circle) } //stop () ho_R19_ROI_Image.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_R19_Circle, out ho_R19_ROI_Image); ho_R19_Region.Dispose(); HOperatorSet.FastThreshold(ho_R19_ROI_Image, out ho_R19_Region, 100, 255, 15); ho_R19_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_R19_ROI_Image, ho_R19_Region, out ho_R19_ImageReduced ); //stop () //sobel_fast 具有較寬的選擇範圍,搭配 alpha 參數 (alpha 越大, 容錯範圍大) hv_alpha = 0.9; hv_R19_low = 2; hv_R19_high = 60; ho_R19_Edges.Dispose(); HOperatorSet.EdgesSubPix(ho_R19_ImageReduced, out ho_R19_Edges, "sobel_fast", hv_alpha, hv_R19_low, hv_R19_high); //stop () //*所有的數值越小,表示容錯範圍大,反之亦然 ho_R19_ContoursSplit.Dispose(); HOperatorSet.SegmentContoursXld(ho_R19_Edges, out ho_R19_ContoursSplit, "lines_circles", 17, 1, 1); //Display the results //=========================================================== HOperatorSet.CountObj(ho_R19_ContoursSplit, out hv_R19_NumSegments); hv_NumCircles = 0; hv_Num_Circle_Point = 0; hv_R19 = 999; for (hv_i = 1; hv_i.Continue(hv_R19_NumSegments, 1); hv_i = hv_i.TupleAdd(1)) { ho_R19_SingleSegment.Dispose(); HOperatorSet.SelectObj(ho_R19_ContoursSplit, out ho_R19_SingleSegment, hv_i); HOperatorSet.GetContourGlobalAttribXld(ho_R19_SingleSegment, "cont_approx", out hv_Attrib); if ((int)(new HTuple(hv_Attrib.TupleEqual(1))) != 0) { HOperatorSet.FitCircleContourXld(ho_R19_SingleSegment, "atukey", -1, 2, hv_Num_Circle_Point, 5, 2, out hv_R19_Row, out hv_R19_Column, out hv_R19_Radius, out hv_R19_StartPhi, out hv_R19_EndPhi, out hv_R19_PointOrder); ho_R19_ContEllipse.Dispose(); HOperatorSet.GenEllipseContourXld(out ho_R19_ContEllipse, hv_R19_Row, hv_R19_Column, 0, hv_R19_Radius, hv_R19_Radius, 0, (new HTuple(360)).TupleRad(), "positive", 1.0); if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_R19_ContEllipse, HDevWindowStack.GetActive()); } HOperatorSet.DistEllipseContourXld(ho_R19_SingleSegment, "algebraic", -1, 0, hv_R19_Row, hv_R19_Column, 0, hv_R19_Radius, hv_R19_Radius, out hv_R19_MinDist, out hv_R19_MaxDist, out hv_R19_AvgDist, out hv_R19_SigmaDist); hv_NumCircles = hv_NumCircles + 1; if ((int)(new HTuple(hv_R19.TupleGreater(hv_R19_Radius))) != 0) { hv_R19 = hv_R19_Radius.Clone(); mResult = new CircleResult() { Row = new HTuple(hv_R19_Row), Col = new HTuple(hv_R19_Column), Radius = new HTuple(hv_R19_Radius), StartPhi = new HTuple(hv_R19_StartPhi), EndPhi = new HTuple(hv_R19_EndPhi), PointOrder = new HTuple(hv_R19_PointOrder), }; } } } ho_R19_Circle.Dispose(); ho_R19_ROI_Image.Dispose(); ho_R19_Region.Dispose(); ho_R19_ImageReduced.Dispose(); ho_R19_Edges.Dispose(); ho_R19_ContoursSplit.Dispose(); ho_R19_SingleSegment.Dispose(); ho_R19_ContEllipse.Dispose(); return(mResult); }
public MeasureResult Action() { #region 輸出結果 CircleResult mResult = null; #endregion // Local iconic variables HObject ho_R6_Circle = null; HObject ho_R6_ROI_Image = null, ho_R6_Region = null, ho_R6_RegionBorder = null; HObject ho_R6_RegionDilation = null, ho_R6_ImageReduced = null; HObject ho_R6_Edges = null, ho_R6_ContoursSplit = null, ho_R6_SingleSegment = null; HObject ho_R6_ContEllipse = null; // Local control variables HTuple hv_msgOffsetY, hv_msgOffsetX; HTuple hv_STD_Row; HTuple hv_STD_Col, hv_Img_Row, hv_Img_Col, hv_Img_Rotate_Angle; HTuple hv_OffsetRow, hv_OffsetCol, hv_R6; HTuple hv_STD_R6_Row = new HTuple(), hv_STD_R6_Col = new HTuple(); HTuple hv_STD_R6_V_Row = new HTuple(), hv_STD_R6_V_Col = new HTuple(); HTuple hv_R6_X = new HTuple(), hv_R6_Y = new HTuple(), hv_R6_Pos_Row = new HTuple(); HTuple hv_R6_Pos_Col = new HTuple(), hv_R6_R = new HTuple(); HTuple hv_R6_R_Max = new HTuple(), hv_R6_R_Inc = new HTuple(); HTuple hv_R6_NumSegments = new HTuple(), hv_NumCircles = new HTuple(); HTuple hv_Num_Circle_Point = new HTuple(), hv_i = new HTuple(); HTuple hv_Attrib = new HTuple(), hv_R6_Row = new HTuple(); HTuple hv_R6_Column = new HTuple(), hv_R6_Radius = new HTuple(); HTuple hv_R6_StartPhi = new HTuple(), hv_R6_EndPhi = new HTuple(); HTuple hv_R6_PointOrder = new HTuple(), hv_R6_MinDist = new HTuple(); HTuple hv_R6_MaxDist = new HTuple(), hv_R6_AvgDist = new HTuple(); HTuple hv_R6_SigmaDist = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_R6_Circle); HOperatorSet.GenEmptyObj(out ho_R6_ROI_Image); HOperatorSet.GenEmptyObj(out ho_R6_Region); HOperatorSet.GenEmptyObj(out ho_R6_RegionBorder); HOperatorSet.GenEmptyObj(out ho_R6_RegionDilation); HOperatorSet.GenEmptyObj(out ho_R6_ImageReduced); HOperatorSet.GenEmptyObj(out ho_R6_Edges); HOperatorSet.GenEmptyObj(out ho_R6_ContoursSplit); HOperatorSet.GenEmptyObj(out ho_R6_SingleSegment); HOperatorSet.GenEmptyObj(out ho_R6_ContEllipse); //Measure: SDMS_R6 //Author: John Hsieh //Date: 2012 // dev_update_off(...); only in hdevelop HOperatorSet.SetSystem("border_shape_models", "false"); //****Message Args hv_msgOffsetY = 100; hv_msgOffsetX = 100; //****Model Args //STD 中心點 hv_STD_Row = 772; hv_STD_Col = 1003; //目前圖形 中心點 hv_Img_Row = hv_AllModelRow.Clone(); hv_Img_Col = hv_AllModelColumn.Clone(); //目前圖形 Rotate Angle hv_Img_Rotate_Angle = hv_AllModelAngle.Clone(); //目前圖形偏移量 hv_OffsetRow = hv_Img_Row - hv_STD_Row; hv_OffsetCol = hv_Img_Col - hv_STD_Col; //****Display if (HDevWindowStack.IsOpen()) { HOperatorSet.ClearWindow(HDevWindowStack.GetActive()); } if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive()); } //*****R6 hv_R6 = 999; //STD R6_ 位置 hv_STD_R6_Row = 1292; hv_STD_R6_Col = 639; //STD 向量 STD_R6_ hv_STD_R6_V_Row = hv_STD_R6_Row - hv_STD_Row; hv_STD_R6_V_Col = hv_STD_R6_Col - hv_STD_Col; //R6_X, R6_Y 分量 hv_R6_X = (hv_STD_R6_V_Col * (hv_Img_Rotate_Angle.TupleCos())) + (hv_STD_R6_V_Row * (hv_Img_Rotate_Angle.TupleSin() )); hv_R6_Y = (hv_STD_R6_V_Row * (hv_Img_Rotate_Angle.TupleCos())) - (hv_STD_R6_V_Col * (hv_Img_Rotate_Angle.TupleSin() )); //目前圖形 R4 位置 hv_R6_Pos_Row = (hv_STD_Row + hv_R6_Y) + hv_OffsetRow; hv_R6_Pos_Col = (hv_STD_Col + hv_R6_X) + hv_OffsetCol; //R6_Region 由半徑 29 開始搜尋, 最大搜尋至 41, Inc =2 hv_R6_R = 29; hv_R6_R_Max = 41; hv_R6_R_Inc = 2; while ((int)((new HTuple(hv_R6.TupleEqual(999))).TupleAnd(new HTuple(hv_R6_R.TupleLess( hv_R6_R_Max)))) != 0) { //******************************* ho_R6_Circle.Dispose(); HOperatorSet.GenCircle(out ho_R6_Circle, hv_R6_Pos_Row, hv_R6_Pos_Col, hv_R6_R); ho_R6_ROI_Image.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_R6_Circle, out ho_R6_ROI_Image); ho_R6_Region.Dispose(); HOperatorSet.Threshold(ho_R6_ROI_Image, out ho_R6_Region, 100, 255); ho_R6_RegionBorder.Dispose(); HOperatorSet.Boundary(ho_R6_Region, out ho_R6_RegionBorder, "inner"); ho_R6_RegionDilation.Dispose(); HOperatorSet.DilationCircle(ho_R6_RegionBorder, out ho_R6_RegionDilation, 1.5); ho_R6_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_R6_ROI_Image, ho_R6_RegionDilation, out ho_R6_ImageReduced ); ho_R6_Edges.Dispose(); HOperatorSet.EdgesSubPix(ho_R6_ImageReduced, out ho_R6_Edges, "lanser2", 0.3, 40, 90); //fast_threshold (R6_ROI_Image, R6_Region, 80, 255, 15) //reduce_domain (R6_ROI_Image, R6_Region, R6_ImageReduced) //sobel_fast 具有較寬的選擇範圍,搭配 alpha 參數 (alpha 越大, 容錯範圍大) //alpha := 10 //R6_low := 10 //R6_high := 60 //edges_sub_pix (R6_ImageReduced, R6_Edges, 'sobel_fast', alpha, R6_low, R6_high) //stop () //*所有的數值越小,表示容錯範圍大,反之亦然 ho_R6_ContoursSplit.Dispose(); HOperatorSet.SegmentContoursXld(ho_R6_Edges, out ho_R6_ContoursSplit, "lines_circles", 6, 4, 4); //Display the results //=========================================================== HOperatorSet.CountObj(ho_R6_ContoursSplit, out hv_R6_NumSegments); hv_NumCircles = 0; hv_Num_Circle_Point = 0; for (hv_i = 1; hv_i.Continue(hv_R6_NumSegments, 1); hv_i = hv_i.TupleAdd(1)) { ho_R6_SingleSegment.Dispose(); HOperatorSet.SelectObj(ho_R6_ContoursSplit, out ho_R6_SingleSegment, hv_i); HOperatorSet.GetContourGlobalAttribXld(ho_R6_SingleSegment, "cont_approx", out hv_Attrib); if ((int)(new HTuple(hv_Attrib.TupleEqual(1))) != 0) { HOperatorSet.FitCircleContourXld(ho_R6_SingleSegment, "atukey", -1, 2, hv_Num_Circle_Point, 5, 2, out hv_R6_Row, out hv_R6_Column, out hv_R6_Radius, out hv_R6_StartPhi, out hv_R6_EndPhi, out hv_R6_PointOrder); ho_R6_ContEllipse.Dispose(); HOperatorSet.GenEllipseContourXld(out ho_R6_ContEllipse, hv_R6_Row, hv_R6_Column, 0, hv_R6_Radius, hv_R6_Radius, 0, (new HTuple(360)).TupleRad(), "positive", 1.0); if (HDevWindowStack.IsOpen()) { HOperatorSet.DispObj(ho_R6_ContEllipse, HDevWindowStack.GetActive() ); } HOperatorSet.DistEllipseContourXld(ho_R6_SingleSegment, "algebraic", -1, 0, hv_R6_Row, hv_R6_Column, 0, hv_R6_Radius, hv_R6_Radius, out hv_R6_MinDist, out hv_R6_MaxDist, out hv_R6_AvgDist, out hv_R6_SigmaDist); hv_NumCircles = hv_NumCircles + 1; if ((int)(new HTuple(hv_R6.TupleGreater(hv_R6_Radius))) != 0) { hv_R6 = hv_R6_Radius.Clone(); mResult = new CircleResult() { Row = new HTuple(hv_R6_Row), Col = new HTuple(hv_R6_Column), Radius = new HTuple(hv_R6_Radius), StartPhi = new HTuple(hv_R6_StartPhi), EndPhi = new HTuple(hv_R6_EndPhi), PointOrder = new HTuple(hv_R6_PointOrder), }; } } } hv_R6_R = hv_R6_R + hv_R6_R_Inc; } ho_R6_Circle.Dispose(); ho_R6_ROI_Image.Dispose(); ho_R6_Region.Dispose(); ho_R6_RegionBorder.Dispose(); ho_R6_RegionDilation.Dispose(); ho_R6_ImageReduced.Dispose(); ho_R6_Edges.Dispose(); ho_R6_ContoursSplit.Dispose(); ho_R6_SingleSegment.Dispose(); ho_R6_ContEllipse.Dispose(); return mResult; }