using System; using System.Collections.Generic; using System.Linq; using System.Text; using HalconDotNet; using System.IO; using System.Configuration; namespace M423project { //此工程涉及的视觉检测方法全部放在此处,进一步模块化 public class VisionDetect { #region vision parameters private int _measureLWScaleNum = 2; private int _measureLWThreshold = 150; private int _measureLWOpeningRectangle = 50; private int _measureHeightThresholdLowNum = 2000; private int _measureHeightOpeningNumL = 450; private int _measureHeightSelectNumLow = 5000; private string _gocatorDirection = "false"; #endregion private void LoadVisionParameters() { int v = 0; string str = string.Empty; str = ConfigurationManager.AppSettings["MeasureLWScaleNum"]; if (int.TryParse(str, out v)) _measureLWScaleNum = v; str = ConfigurationManager.AppSettings["MeasureLWThreshold"]; if (int.TryParse(str, out v)) _measureLWThreshold = v; str = ConfigurationManager.AppSettings["MeasureLWOpeningRectangle"]; if (int.TryParse(str, out v)) _measureLWOpeningRectangle = v; str = ConfigurationManager.AppSettings["MeasureHeightThresholdLowNum"]; if (int.TryParse(str, out v)) _measureHeightThresholdLowNum = v; str = ConfigurationManager.AppSettings["MeasureHeightOpeningNumL"]; if (int.TryParse(str, out v)) _measureHeightOpeningNumL = v; str = ConfigurationManager.AppSettings["MeasureHeightSelectNumLow"]; if (int.TryParse(str, out v)) _measureHeightSelectNumLow = v; _gocatorDirection = ConfigurationManager.AppSettings["GocatorDirection"]; } public VisionDetect() { LoadVisionParameters(); } //判断电池有无 public bool IsHaveBattery(HObject image, HTuple grayThreshold) { HTuple DeviGray = new HTuple(), meanGray = new HTuple(); HOperatorSet.Intensity(image, image, out meanGray, out DeviGray); if (meanGray < grayThreshold) return true; else return false; } //判斷電池數量 public int BatteryNumber(HObject image, ref int batteryStatus) { // Local iconic variables HObject ho_Batteries; // Local control variables HTuple hv_Width1 = null, hv_Height1 = null; HTuple hv_LowThreshold = null, hv_HighThreshold = null; HTuple hv_Number = null, hv_BatteryStatus = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Batteries); HOperatorSet.GetImageSize(image, out hv_Width1, out hv_Height1); hv_LowThreshold = 0; hv_HighThreshold = 160; ho_Batteries.Dispose(); SelectBattery(image, out ho_Batteries, hv_LowThreshold, hv_HighThreshold, out hv_BatteryStatus); batteryStatus = hv_BatteryStatus.I; HOperatorSet.CountObj(ho_Batteries, out hv_Number); ho_Batteries.Dispose(); return hv_Number.I - 1; } //创建上料模板 public void CreateLoadModel(HObject image, HTuple hwindow, string modelpath) { // Local iconic variables HObject ho_ROI, ho_ImageROI; HObject ho_ShapeModelImages, ho_ShapeModelRegions, ho_ShapeModel; HObject ho_Image = null, ho_Region1 = null, ho_RegionFillUp = null; HObject ho_RegionOpening = null, ho_ImageReduced = null; HObject ho_ShapeModelTrans; // Local control variables HTuple hv_Pointer = null, hv_Type = null, hv_Width = null; HTuple hv_Height = null, hv_WindowHandle = new HTuple(); HTuple hv_Row = null, hv_Column = null, hv_Phi = null; HTuple hv_Length1 = null, hv_Length2 = null, hv_AreaModelRegions = null; HTuple hv_RowModelRegions = null, hv_ColumnModelRegions = null; HTuple hv_HeightPyramid = null, hv_i = null, hv_NumLevels = new HTuple(); HTuple hv_ModelID = null; HTuple hv_Width1 = new HTuple(), hv_Height1 = new HTuple(); HTuple hv_Angle = new HTuple(), hv_Score = new HTuple(); HTuple hv_Row3 = new HTuple(), hv_Column3 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ROI); HOperatorSet.GenEmptyObj(out ho_ImageROI); HOperatorSet.GenEmptyObj(out ho_ShapeModelImages); HOperatorSet.GenEmptyObj(out ho_ShapeModelRegions); HOperatorSet.GenEmptyObj(out ho_ShapeModel); HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_ShapeModelTrans); HOperatorSet.GetImagePointer1(image, out hv_Pointer, out hv_Type, out hv_Width, out hv_Height); DisplayImage(image, hwindow); //colors and other settings for the visualization HOperatorSet.SetDraw(hwindow, "margin"); HOperatorSet.SetLineWidth(hwindow, 1); HOperatorSet.SetColor(hwindow, "red"); //------------------- start of the application ---------------- //step 1: select the model object HOperatorSet.DrawRectangle2(hwindow, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); ho_ROI.Dispose(); HOperatorSet.GenRectangle2(out ho_ROI, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); ho_ImageROI.Dispose(); HOperatorSet.ReduceDomain(image, ho_ROI, out ho_ImageROI); ho_ShapeModelImages.Dispose(); ho_ShapeModelRegions.Dispose(); HOperatorSet.InspectShapeModel(ho_ImageROI, out ho_ShapeModelImages, out ho_ShapeModelRegions, 8, 30); HOperatorSet.AreaCenter(ho_ShapeModelRegions, out hv_AreaModelRegions, out hv_RowModelRegions, out hv_ColumnModelRegions); HOperatorSet.CountObj(ho_ShapeModelRegions, out hv_HeightPyramid); HTuple end_val31 = hv_HeightPyramid; HTuple step_val31 = 1; for (hv_i = 1; hv_i.Continue(end_val31, step_val31); hv_i = hv_i.TupleAdd(step_val31)) { if ((int)(new HTuple(((hv_AreaModelRegions.TupleSelect(hv_i - 1))).TupleGreaterEqual( 15))) != 0) { hv_NumLevels = hv_i.Clone(); } } HOperatorSet.CreateShapeModel(ho_ImageROI, hv_NumLevels, 0, (new HTuple(360)).TupleRad() , "auto", "none", "use_polarity", 30, 10, out hv_ModelID); //create_scaled_shape_model(ImageROI, ho_ShapeModel.Dispose(); HOperatorSet.GetShapeModelContours(out ho_ShapeModel, hv_ModelID, 1); HOperatorSet.FindShapeModel(ho_ImageROI, hv_ModelID, 0, (new HTuple(360)).TupleRad() , 0.7, 1, 0.5, "least_squares", 0, 0.4, out hv_Row3, out hv_Column3, out hv_Angle, out hv_Score); HTuple homat2didentity = null, homat2dtranslate = null, homat2drotate = null; HOperatorSet.HomMat2dIdentity(out homat2didentity); HOperatorSet.HomMat2dTranslate(homat2didentity, hv_Row3, hv_Column3, out homat2dtranslate); HOperatorSet.HomMat2dRotate(homat2dtranslate, hv_Angle, hv_Row3, hv_Column3, out homat2drotate); HOperatorSet.AffineTransContourXld(ho_ShapeModel, out ho_ShapeModelTrans, homat2dtranslate); HOperatorSet.DispObj(ho_ShapeModelTrans, hwindow); HOperatorSet.WriteShapeModel(hv_ModelID, modelpath); ho_ROI.Dispose(); ho_ImageROI.Dispose(); ho_ShapeModelImages.Dispose(); ho_ShapeModelRegions.Dispose(); ho_ShapeModel.Dispose(); ho_Image.Dispose(); ho_Region1.Dispose(); ho_RegionFillUp.Dispose(); ho_RegionOpening.Dispose(); ho_ImageReduced.Dispose(); } //创建二维码模板 public void Create2DDataCodeModel(HObject image, HTuple hwindow, string modelpath, out string sn) { // Local iconic variables HObject ho_ROI, ho_ImageROI; HObject ho_SymbolXLDs = null; // Local control variables HTuple hv_Width = null, hv_Height = null, hv_WindowHandle = new HTuple(); HTuple hv_Row = null, hv_Column = null, hv_Phi = null; HTuple hv_Length1 = null, hv_Length2 = null, hv_DataCodeType = null; HTuple hv_DataCodeHandle = null, hv_resultshandles = null, strings = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ROI); HOperatorSet.GenEmptyObj(out ho_ImageROI); HOperatorSet.GenEmptyObj(out ho_SymbolXLDs); //抓取图片 HOperatorSet.GetImageSize(image, out hv_Width, out hv_Height); //dev_close_window(...); //dev_open_window(...); DisplayImage(image, hwindow); HOperatorSet.SetColor(hwindow, "red"); HOperatorSet.DrawRectangle2(hwindow, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); ho_ROI.Dispose(); HOperatorSet.GenRectangle2(out ho_ROI, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); ho_ImageROI.Dispose(); HOperatorSet.ReduceDomain(image, ho_ROI, out ho_ImageROI); hv_DataCodeType = new HTuple(); hv_DataCodeType[0] = "Data Matrix ECC 200"; hv_DataCodeType[1] = "QR Code"; hv_DataCodeType[2] = "Micro QR Code"; hv_DataCodeType[3] = "PDF417"; hv_DataCodeType[4] = "Aztec Code"; hv_DataCodeType[5] = "GS1 DataMatrix"; hv_DataCodeType[6] = "GS1 QR Code"; hv_DataCodeType[7] = "GS1 Aztec Code"; HOperatorSet.CreateDataCode2dModel(hv_DataCodeType.TupleSelect(0), new HTuple(), new HTuple(), out hv_DataCodeHandle); HOperatorSet.FindDataCode2d(ho_ImageROI, out ho_SymbolXLDs, hv_DataCodeHandle, "train", "all", out hv_resultshandles, out strings); HOperatorSet.DispObj(ho_SymbolXLDs, hwindow); HOperatorSet.WriteDataCode2dModel(hv_DataCodeHandle, modelpath + "\\ModelDataCode.dcm"); sn = strings.ToString(); ho_ROI.Dispose(); ho_ImageROI.Dispose(); ho_SymbolXLDs.Dispose(); } //上料模板匹配 public void SearchLoadModel(HObject image, string modelPath, ref HTuple totalScore, ref HTuple totalScore1) { // Local iconic variables HObject ho_ShapeModel, ho_Batteries = null; HObject ho_Battery = null, ho_Rectangle = null, ho_ImageReduced = null; // Local control variables HTuple hv_ModelID = null; HTuple hv_TotalScore = new HTuple(); HTuple hv_TotalScore1 = new HTuple(), hv_Width1 = new HTuple(); HTuple hv_Height1 = new HTuple(), hv_LowThreshold = new HTuple(); HTuple hv_HighThreshold = new HTuple(), hv_Index1 = new HTuple(); HTuple hv_BatteryArea = new HTuple(), hv_CenterRow = new HTuple(); HTuple hv_CenterColumn = new HTuple(), hv_Row2 = new HTuple(); HTuple hv_Column2 = new HTuple(), hv_Phi = new HTuple(); HTuple hv_Length1 = new HTuple(), hv_Length2 = new HTuple(); HTuple hv_rect_row = new HTuple(), hv_rect_column = new HTuple(); HTuple hv_rect_phi = new HTuple(), hv_rect_length1 = new HTuple(); HTuple hv_rect_length2 = new HTuple(), hv_Row3 = new HTuple(); HTuple hv_Column3 = new HTuple(), hv_Angle = new HTuple(); HTuple hv_Score = new HTuple(), hv_ModelID1 = new HTuple(); HTuple hv_Score1 = new HTuple(); HTuple hv_Number = new HTuple(), hv_BatteryStatus = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ShapeModel); HOperatorSet.GenEmptyObj(out ho_Batteries); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageReduced); try { HOperatorSet.ReadShapeModel(modelPath + "ModelThreeRects.shm", out hv_ModelID); HOperatorSet.ReadShapeModel(modelPath + "ModelTriangle.shm", out hv_ModelID1); ho_Batteries.Dispose(); HOperatorSet.GenEmptyObj(out ho_Batteries); hv_TotalScore = new HTuple(); hv_TotalScore1 = new HTuple(); hv_LowThreshold = 0; hv_HighThreshold = 120; ho_Batteries.Dispose(); SelectBattery(image, out ho_Batteries, hv_LowThreshold, hv_HighThreshold, out hv_BatteryStatus); HOperatorSet.CountObj(ho_Batteries, out hv_Number); for (hv_Index1 = 1; (int)hv_Index1 <= hv_Number; hv_Index1 = (int)hv_Index1 + 1) { ho_Battery.Dispose(); HOperatorSet.SelectObj(ho_Batteries, out ho_Battery, hv_Index1); HOperatorSet.AreaCenter(ho_Battery, out hv_BatteryArea, out hv_CenterRow, out hv_CenterColumn); if ((int)(new HTuple(hv_BatteryArea.TupleEqual(0))) != 0) { continue; } HOperatorSet.SmallestRectangle2(ho_Battery, out hv_Row2, out hv_Column2, out hv_Phi, out hv_Length1, out hv_Length2); hv_rect_row = hv_CenterRow.Clone(); hv_rect_column = hv_CenterColumn + 0.8 * hv_Length2; hv_rect_phi = hv_Phi.Clone(); hv_rect_length1 = 0.5 * (hv_Length1 - 10); hv_rect_length2 = hv_Length2 - 20; ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_rect_row, hv_rect_column, hv_rect_phi, hv_rect_length1, hv_rect_length2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(image, ho_Rectangle, out ho_ImageReduced); HOperatorSet.FindShapeModel(ho_ImageReduced, hv_ModelID, 0, (new HTuple(360)).TupleRad() , 0.5, 1, 0.5, "least_squares", 0, 0.4, out hv_Row3, out hv_Column3, out hv_Angle, out hv_Score); hv_TotalScore = hv_TotalScore.TupleConcat(hv_Score); if ((int)(new HTuple(hv_Score.TupleEqual(new HTuple()))) != 0) { ho_ShapeModel.Dispose(); //HOperatorSet.GetShapeModelContours(out ho_ShapeModel, hv_ModelID1, 1); HOperatorSet.FindShapeModel(ho_ImageReduced, hv_ModelID1, 0, (new HTuple(360)).TupleRad() , 0.5, 1, 0.5, "least_squares", 0, 0.4, out hv_Row3, out hv_Column3, out hv_Angle, out hv_Score1); hv_TotalScore1 = hv_TotalScore1.TupleConcat(hv_Score1); } } totalScore = hv_TotalScore; totalScore1 = hv_TotalScore1; } catch (HalconException) { ho_ShapeModel.Dispose(); ho_Batteries.Dispose(); ho_Battery.Dispose(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); } ho_ShapeModel.Dispose(); ho_Batteries.Dispose(); ho_Battery.Dispose(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); } //可以显示 public void SearchDataCode(string modelpath, HObject image, HTuple hwindow, ref string sn) { // Local iconic variables HObject ho_Region, ho_ImageReduced = null; HObject ho_SymbolXLDs = null; // Local control variables HTuple hv_DataCodeHandle = null; HTuple hv_ResultHandles = new HTuple(), hv_DecodedDataStrings = new HTuple(); HTuple hv_WindowHandle = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_SymbolXLDs); try { ho_Region.Dispose(); HOperatorSet.ReadDataCode2dModel(modelpath, out hv_DataCodeHandle); DisplayImage(image, hwindow); ho_SymbolXLDs.Dispose(); HOperatorSet.FindDataCode2d(image, out ho_SymbolXLDs, hv_DataCodeHandle, "train", "all", out hv_ResultHandles, out hv_DecodedDataStrings); HOperatorSet.SetColor(hwindow, "green"); HOperatorSet.DispObj(ho_SymbolXLDs, hwindow); string s = "N/A"; sn = ((int)(new HTuple(hv_DecodedDataStrings.TupleEqual(new HTuple()))) != 0) ? s : (hv_DecodedDataStrings.ToString()); } catch (HalconException) { sn = "N/A"; HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle); ho_Region.Dispose(); ho_ImageReduced.Dispose(); ho_SymbolXLDs.Dispose(); } HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle); ho_Region.Dispose(); ho_ImageReduced.Dispose(); ho_SymbolXLDs.Dispose(); } //不显示 public void SearchDataCode(string modelpath, HObject image, ref string sn) { // Local iconic variables HObject ho_Region, ho_ImageReduced = null, ho_Rectangle; HObject ho_SymbolXLDs = null; // Local control variables HTuple hv_DataCodeHandle = null; HTuple hv_ResultHandles = new HTuple(), hv_DecodedDataStrings = new HTuple(); HTuple hv_WindowHandle = new HTuple(); HTuple hv_Row1 = new HTuple(), hv_Row2 = new HTuple(); HTuple hv_Column1 = new HTuple(), hv_Column2 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_SymbolXLDs); HOperatorSet.GenEmptyObj(out ho_Rectangle); try { ho_Region.Dispose(); hv_Row1 = 0; hv_Column1 = 0; hv_Row2 = 1000; hv_Column2 = 1000; ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(image, ho_Rectangle, out ho_ImageReduced); HOperatorSet.ReadDataCode2dModel(modelpath, out hv_DataCodeHandle); ho_SymbolXLDs.Dispose(); HOperatorSet.FindDataCode2d(ho_ImageReduced, out ho_SymbolXLDs, hv_DataCodeHandle, "train", "all", out hv_ResultHandles, out hv_DecodedDataStrings); string s = "N/A"; sn = ((int)(new HTuple(hv_DecodedDataStrings.TupleEqual(new HTuple()))) != 0) ? s : (hv_DecodedDataStrings.ToString()); // Halcon 12 if (sn.Length == 19) { sn = sn.Substring(1, 17); } ho_Region.Dispose(); ho_ImageReduced.Dispose(); ho_SymbolXLDs.Dispose(); ho_Rectangle.Dispose(); HOperatorSet.ClearDataCode2dModel(hv_DataCodeHandle); } catch (HalconException) { ; } } //Gocator测电池高度 public void MeasureHeight1(HObject image, double baseHeight, ref double[] height) { // Local iconic variables HObject ho_HeightMap = null, ho_Intensity = null; HObject ho_Z = null, ho_ImageMean = null, ho_Regions = null, ho_RegionOpening = null; HObject ho_ConnectedRegions1 = null, ho_Battery = null, ho_RegionFillUp = null; HObject ho_ROI = null, ho_ImageReduced = null, ho_Region = null, ho_SelectedRegions = null; // Local control variables HTuple hv_base_height = null; HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_frameCount = new HTuple(), hv_timestamp = new HTuple(); HTuple hv_encoderPosition = new HTuple(), hv_encoderIndex = new HTuple(); HTuple hv_inputs = new HTuple(), hv_xOffset = new HTuple(); HTuple hv_xResolution = new HTuple(), hv_yOffset = new HTuple(); HTuple hv_yResolution = new HTuple(), hv_zOffset = new HTuple(); HTuple hv_zResolution = new HTuple(), hv_width = new HTuple(); HTuple hv_height = new HTuple(), hv_Area = new HTuple(); HTuple hv_Row = new HTuple(), hv_Column = new HTuple(); HTuple hv_Indices = new HTuple(), hv_Number = new HTuple(); HTuple hv_z = new HTuple(), hv_erosionSize = new HTuple(); HTuple hv_thresholdSize = new HTuple(), hv_Index1 = new HTuple(); HTuple hv_Rows = new HTuple(), hv_Columns = new HTuple(); HTuple hv_Arch = new HTuple(), hv_Grayvals = new HTuple(); HTuple hv_zOffsetInt = new HTuple(), hv_Grayval = null, hv_Rows1 = new HTuple(), hv_Columns1 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_HeightMap); HOperatorSet.GenEmptyObj(out ho_Intensity); HOperatorSet.GenEmptyObj(out ho_Z); HOperatorSet.GenEmptyObj(out ho_ImageMean); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_ROI); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region); hv_base_height = baseHeight; try { HOperatorSet.GetImageSize(image, out hv_Width, out hv_Height); ho_HeightMap.Dispose(); ho_Intensity.Dispose(); Go2GenTL_ParseData(image, out ho_HeightMap, out ho_Intensity, out hv_frameCount, out hv_timestamp, out hv_encoderPosition, out hv_encoderIndex, out hv_inputs, out hv_xOffset, out hv_xResolution, out hv_yOffset, out hv_yResolution, out hv_zOffset, out hv_zResolution, out hv_width, out hv_height); // ho_Z.Dispose(); HOperatorSet.ConvertImageType(ho_HeightMap, out ho_Z, "real"); ho_ImageMean.Dispose(); HOperatorSet.MeanImage(ho_Intensity, out ho_ImageMean, 15, 15); ho_Regions.Dispose(); HOperatorSet.Threshold(ho_ImageMean, out ho_Regions, 2000, 80000); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Regions, out ho_RegionOpening, 100, 40); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionOpening, out ho_ConnectedRegions1); HOperatorSet.AreaCenter(ho_ConnectedRegions1, out hv_Area, out hv_Row, out hv_Column); HOperatorSet.TupleSort(hv_Area, out hv_Indices); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions, "area", "and", 15000,//hv_Indices.TupleSelect((new HTuple(hv_Indices.TupleLength())) - 2)) - 10, 1000000);//hv_Indices.TupleSelect((new HTuple(hv_Indices.TupleLength())) - 1)) + 10); HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number); ho_Battery.Dispose(); HOperatorSet.GenEmptyObj(out ho_Battery); hv_z = new HTuple(); hv_erosionSize = new HTuple(); hv_erosionSize[0] = 20; hv_erosionSize[1] = 100; hv_thresholdSize = new HTuple(); hv_thresholdSize[0] = 10000; hv_thresholdSize[1] = 10000; for (hv_Index1 = 1; (int)hv_Index1 <= 2; hv_Index1 = (int)hv_Index1 + 1) { try { ho_Battery.Dispose(); HOperatorSet.SelectObj(ho_SelectedRegions, out ho_Battery, hv_Index1); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Battery, out ho_RegionFillUp); ho_ROI.Dispose(); HOperatorSet.ErosionRectangle1(ho_RegionFillUp, out ho_ROI, hv_erosionSize.TupleSelect( hv_Index1 - 1), hv_erosionSize.TupleSelect(hv_Index1 - 1)); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Intensity, ho_ROI, out ho_ImageReduced ); HOperatorSet.GetRegionPoints(ho_ROI, out hv_Rows1, out hv_Columns1); hv_Grayval = new HTuple(); HOperatorSet.GetGrayval(ho_ImageReduced, hv_Rows1, hv_Columns1, out hv_Grayval); ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 0.85 * (hv_Grayval.TupleMax()), 100000); HOperatorSet.GetRegionPoints(ho_Region, out hv_Rows, out hv_Columns); HOperatorSet.GetSystem("halcon_arch", out hv_Arch); HOperatorSet.GetGrayval(ho_Z, hv_Rows, hv_Columns, out hv_Grayvals); if ((int)(new HTuple(hv_Arch.TupleEqual("x64-win64"))) != 0) { hv_zOffsetInt = (hv_zOffset.TupleSelect(0)) + (((hv_zOffset.TupleSelect(1))).TupleLsh( 32)); } else { hv_zOffsetInt = hv_zOffset[0]; } hv_height = (((hv_Grayvals * (hv_zResolution.TupleSelect(0))) * 0.000001) + (hv_zOffsetInt * 0.000001)) + hv_base_height; hv_z = hv_z.TupleConcat(hv_height.TupleMean()); } catch (HalconException) { hv_z[hv_Index1 - 1] = 999.999; } } height[0] = hv_z[0].D; height[1] = hv_z[1].D; } catch (HalconException) { height[0] = 999.999; height[1] = 999.999; ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Z.Dispose(); ho_ImageMean.Dispose(); ho_Regions.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); ho_Battery.Dispose(); ho_RegionFillUp.Dispose(); ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); } ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Z.Dispose(); ho_ImageMean.Dispose(); ho_Regions.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); ho_Battery.Dispose(); ho_RegionFillUp.Dispose(); ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); } /* public void MeasureHeight(HObject image, double baseHeight, ref double[] height) { // Local iconic variables HObject ho_HeightMap = null, ho_Intensity = null; HObject ho_Z = null, ho_ImageMean = null, ho_Regions = null, ho_RegionOpening = null; HObject ho_ConnectedRegions1 = null, ho_SelectedRegions = null; HObject ho_SortedRegions = null, ho_Battery = null, ho_RegionFillUp = null; HObject ho_ROI = null, ho_ImageReduced = null, ho_Region = null; // Local control variables HTuple hv_base_height = null; HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_frameCount = new HTuple(), hv_timestamp = new HTuple(); HTuple hv_encoderPosition = new HTuple(), hv_encoderIndex = new HTuple(); HTuple hv_inputs = new HTuple(), hv_xOffset = new HTuple(); HTuple hv_xResolution = new HTuple(), hv_yOffset = new HTuple(); HTuple hv_yResolution = new HTuple(), hv_zOffset = new HTuple(); HTuple hv_zResolution = new HTuple(), hv_width = new HTuple(); HTuple hv_height = new HTuple(), hv_Number = new HTuple(); HTuple hv_z = new HTuple(), hv_erosionSize = new HTuple(); HTuple hv_thresholdSize = new HTuple(), hv_Index1 = new HTuple(); HTuple hv_Rows1 = new HTuple(), hv_Columns1 = new HTuple(); HTuple hv_Grayval = new HTuple(), hv_Rows = new HTuple(); HTuple hv_Columns = new HTuple(), hv_Arch = new HTuple(); HTuple hv_Grayvals = new HTuple(), hv_zOffsetInt = new HTuple(); HTuple hv_Sorted = new HTuple(), hv_SortNum = new HTuple(), hv_DeleteLowNum = new HTuple(), hv_DeleteHighNum = new HTuple(); HTuple hv_Sequence = new HTuple(), hv_NewSortNum = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_HeightMap); HOperatorSet.GenEmptyObj(out ho_Intensity); HOperatorSet.GenEmptyObj(out ho_Z); HOperatorSet.GenEmptyObj(out ho_ImageMean); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_SortedRegions); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_ROI); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region); hv_base_height = baseHeight; try { HOperatorSet.GetImageSize(image, out hv_Width, out hv_Height); ho_HeightMap.Dispose(); ho_Intensity.Dispose(); Go2GenTL_ParseData(image, out ho_HeightMap, out ho_Intensity, out hv_frameCount, out hv_timestamp, out hv_encoderPosition, out hv_encoderIndex, out hv_inputs, out hv_xOffset, out hv_xResolution, out hv_yOffset, out hv_yResolution, out hv_zOffset, out hv_zResolution, out hv_width, out hv_height); // ho_Z.Dispose(); HOperatorSet.ConvertImageType(ho_HeightMap, out ho_Z, "real"); ho_ImageMean.Dispose(); HOperatorSet.MeanImage(ho_Intensity, out ho_ImageMean, 5, 5); ho_Regions.Dispose(); int _measureHeightThresholdLowNum = 4000; HOperatorSet.Threshold(ho_ImageMean, out ho_Regions, _measureHeightThresholdLowNum, 80000); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Regions, out ho_RegionOpening, _measureHeightOpeningNumL, 30); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionOpening, out ho_ConnectedRegions1); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions, "area", "and", _measureHeightSelectNumLow, 10000000); ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions, out ho_SortedRegions, "first_point", _gocatorDirection, "row"); HOperatorSet.CountObj(ho_SortedRegions, out hv_Number); ho_Battery.Dispose(); HOperatorSet.GenEmptyObj(out ho_Battery); hv_z = new HTuple(); hv_erosionSize = new HTuple(); hv_erosionSize[0] = 200; hv_erosionSize[1] = 20; hv_thresholdSize = new HTuple(); hv_thresholdSize[0] = 40000; hv_thresholdSize[1] = 18000; for (hv_Index1 = 1; (int)hv_Index1 <= 2; hv_Index1 = (int)hv_Index1 + 1) { try { ho_Battery.Dispose(); HOperatorSet.SelectObj(ho_SortedRegions, out ho_Battery, hv_Index1); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Battery, out ho_RegionFillUp); ho_ROI.Dispose(); HOperatorSet.ErosionRectangle1(ho_RegionFillUp, out ho_ROI, hv_erosionSize.TupleSelect( hv_Index1 - 1), hv_erosionSize.TupleSelect(hv_Index1 - 1)); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Intensity, ho_ROI, out ho_ImageReduced); HOperatorSet.GetRegionPoints(ho_ROI, out hv_Rows1, out hv_Columns1); hv_Grayval = new HTuple(); HOperatorSet.GetGrayval(ho_ImageReduced, hv_Rows1, hv_Columns1, out hv_Grayval); ho_Region.Dispose(); //Adam2017.4.30修改 //HOperatorSet.GenRectangle2(out ho_Region, 472.469, 264.696, (new HTuple(0)).TupleRad(), 226.738, 377.07); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 0.3 * (hv_Grayval.TupleMax()), 1000000); HOperatorSet.GetRegionPoints(ho_Region, out hv_Rows, out hv_Columns); HOperatorSet.GetSystem("halcon_arch", out hv_Arch); HOperatorSet.GetGrayval(ho_Z, hv_Rows, hv_Columns, out hv_Grayvals); //Adam 2018.1.20添加(去除数组中的极大值和极小值) HOperatorSet.TupleSort(hv_Grayvals, out hv_Sorted); hv_SortNum = new HTuple(hv_Sorted.TupleLength()); hv_DeleteLowNum = hv_SortNum * 0.45; hv_DeleteHighNum = hv_SortNum * 0.55; HOperatorSet.TupleInt(hv_DeleteLowNum, out hv_DeleteLowNum); HOperatorSet.TupleInt(hv_DeleteHighNum, out hv_DeleteHighNum); //选择tuple数据,剔除tuple前面的5%和tuple后面的5%,目前还没有找到合适的算子 HOperatorSet.TupleGenSequence(hv_DeleteLowNum, hv_DeleteHighNum, 1, out hv_Sequence); HOperatorSet.TupleSelect(hv_Sorted, hv_Sequence, out hv_NewSortNum); /////////////////////////////////////////////////////////////////////////////////////////////end if ((int)(new HTuple(hv_Arch.TupleEqual("x64-win64"))) != 0) { hv_zOffsetInt = (hv_zOffset.TupleSelect(0)) + (((hv_zOffset.TupleSelect(1))).TupleLsh( 32)); } else { hv_zOffsetInt = hv_zOffset[0]; } hv_height = (((hv_NewSortNum * (hv_zResolution.TupleSelect(0))) * 0.000001) + (hv_zOffsetInt * 0.000001)) + hv_base_height; hv_z = hv_z.TupleConcat(hv_height.TupleMean()); } catch (HalconException) { hv_z[hv_Index1 - 1] = 999.999; } } //Shawn添加判断 if (hv_z[0] == 999.999 && hv_z[1] != 999.999) hv_z[0] = hv_z[1] - 0.2 * CommonUtil.random.NextDouble(); if (hv_z[1] == 999.999 && hv_z[0] != 999.999) hv_z[1] = hv_z[0] + 0.2 * CommonUtil.random.NextDouble(); height[0] = hv_z[0].D + 4.5705; height[1] = hv_z[1].D - 0.45 + 4.5705; } catch (HalconException) { height[0] = 999.999; height[1] = 999.999; ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Z.Dispose(); ho_ImageMean.Dispose(); ho_Regions.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_Battery.Dispose(); ho_RegionFillUp.Dispose(); ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); } ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Z.Dispose(); ho_ImageMean.Dispose(); ho_Regions.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_Battery.Dispose(); ho_RegionFillUp.Dispose(); ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); } */ //图像显示 //2018.10.12Adam添加 public void MeasureHeight(HObject image, double baseHeight, ref double[] height) { // Local iconic variables HObject ho_HeightMap = null, ho_Intensity = null; HObject ho_Z = null, ho_ImageMean = null, ho_Regions = null, ho_RegionOpening = null; HObject ho_ConnectedRegions1 = null, ho_SelectedRegions = null; HObject ho_SortedRegions = null, ho_Battery = null, ho_RegionFillUp = null; HObject ho_ROI = null, ho_ImageReduced = null, ho_Region = null; // Local control variables HTuple hv_base_height = null; HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_frameCount = new HTuple(), hv_timestamp = new HTuple(); HTuple hv_encoderPosition = new HTuple(), hv_encoderIndex = new HTuple(); HTuple hv_inputs = new HTuple(), hv_xOffset = new HTuple(); HTuple hv_xResolution = new HTuple(), hv_yOffset = new HTuple(); HTuple hv_yResolution = new HTuple(), hv_zOffset = new HTuple(); HTuple hv_zResolution = new HTuple(), hv_width = new HTuple(); HTuple hv_height = new HTuple(), hv_Number = new HTuple(); HTuple hv_z = new HTuple(), hv_erosionSize = new HTuple(); HTuple hv_thresholdSize = new HTuple(), hv_Index1 = new HTuple(); HTuple hv_Rows1 = new HTuple(), hv_Columns1 = new HTuple(); HTuple hv_Grayval = new HTuple(), hv_Rows = new HTuple(); HTuple hv_Columns = new HTuple(), hv_Arch = new HTuple(); HTuple hv_Grayvals = new HTuple(), hv_zOffsetInt = new HTuple(); HTuple hv_Sorted = new HTuple(), hv_SortNum = new HTuple(), hv_DeleteLowNum = new HTuple(), hv_DeleteHighNum = new HTuple(); HTuple hv_Sequence = new HTuple(), hv_NewSortNum = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_HeightMap); HOperatorSet.GenEmptyObj(out ho_Intensity); HOperatorSet.GenEmptyObj(out ho_Z); HOperatorSet.GenEmptyObj(out ho_ImageMean); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_SortedRegions); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_ROI); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region); hv_base_height = baseHeight; try { HOperatorSet.GetImageSize(image, out hv_Width, out hv_Height); ho_HeightMap.Dispose(); ho_Intensity.Dispose(); Go2GenTL_ParseData(image, out ho_HeightMap, out ho_Intensity, out hv_frameCount, out hv_timestamp, out hv_encoderPosition, out hv_encoderIndex, out hv_inputs, out hv_xOffset, out hv_xResolution, out hv_yOffset, out hv_yResolution, out hv_zOffset, out hv_zResolution, out hv_width, out hv_height); // ho_Z.Dispose(); HOperatorSet.ConvertImageType(ho_HeightMap, out ho_Z, "real"); ho_ImageMean.Dispose(); //将ho_Intensity修改为ho_Z HOperatorSet.MeanImage(ho_Z, out ho_ImageMean, 5, 5); ho_Regions.Dispose(); int _measureHeightThresholdLowNum = 4000; HOperatorSet.Threshold(ho_ImageMean, out ho_Regions, _measureHeightThresholdLowNum, 80000); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Regions, out ho_RegionOpening, _measureHeightOpeningNumL, 30); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionOpening, out ho_ConnectedRegions1); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions, "area", "and", _measureHeightSelectNumLow, 10000000); ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions, out ho_SortedRegions, "first_point", _gocatorDirection, "row"); HOperatorSet.CountObj(ho_SortedRegions, out hv_Number); ho_Battery.Dispose(); HOperatorSet.GenEmptyObj(out ho_Battery); hv_z = new HTuple(); hv_erosionSize = new HTuple(); hv_erosionSize[0] = 100; hv_erosionSize[1] = 20; hv_thresholdSize = new HTuple(); hv_thresholdSize[0] = 50000; hv_thresholdSize[1] = 18000; for (hv_Index1 = 1; (int)hv_Index1 <= hv_Number; hv_Index1 = (int)hv_Index1 + 1) { try { ho_Battery.Dispose(); HOperatorSet.SelectObj(ho_SortedRegions, out ho_Battery, hv_Index1); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Battery, out ho_RegionFillUp); ho_ROI.Dispose(); HOperatorSet.ErosionRectangle1(ho_RegionFillUp, out ho_ROI, hv_erosionSize.TupleSelect( hv_Index1 - 1), hv_erosionSize.TupleSelect(hv_Index1 - 1)); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Intensity, ho_ROI, out ho_ImageReduced); HOperatorSet.GetRegionPoints(ho_ROI, out hv_Rows1, out hv_Columns1); hv_Grayval = new HTuple(); HOperatorSet.GetGrayval(ho_ImageReduced, hv_Rows1, hv_Columns1, out hv_Grayval); ho_Region.Dispose(); //Adam2017.4.30修改 //HOperatorSet.GenRectangle2(out ho_Region, 472.469, 264.696, (new HTuple(0)).TupleRad(), 226.738, 377.07); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region, 0.3 * (hv_Grayval.TupleMax()), 1000000); HOperatorSet.GetRegionPoints(ho_Region, out hv_Rows, out hv_Columns); HOperatorSet.GetSystem("halcon_arch", out hv_Arch); HOperatorSet.GetGrayval(ho_Z, hv_Rows, hv_Columns, out hv_Grayvals); //Adam 2018.1.20添加(去除数组中的极大值和极小值) HOperatorSet.TupleSort(hv_Grayvals, out hv_Sorted); hv_SortNum = new HTuple(hv_Sorted.TupleLength()); hv_DeleteLowNum = hv_SortNum * 0.45; hv_DeleteHighNum = hv_SortNum * 0.55; HOperatorSet.TupleInt(hv_DeleteLowNum, out hv_DeleteLowNum); HOperatorSet.TupleInt(hv_DeleteHighNum, out hv_DeleteHighNum); //选择tuple数据,剔除tuple前面的5%和tuple后面的5%,目前还没有找到合适的算子 HOperatorSet.TupleGenSequence(hv_DeleteLowNum, hv_DeleteHighNum, 1, out hv_Sequence); HOperatorSet.TupleSelect(hv_Sorted, hv_Sequence, out hv_NewSortNum); /////////////////////////////////////////////////////////////////////////////////////////////end if ((int)(new HTuple(hv_Arch.TupleEqual("x64-win64"))) != 0) { hv_zOffsetInt = (hv_zOffset.TupleSelect(0)) + (((hv_zOffset.TupleSelect(1))).TupleLsh(32)); } else { hv_zOffsetInt = hv_zOffset[0]; } hv_height = (((hv_NewSortNum * (hv_zResolution.TupleSelect(0))) * 0.000001) + (hv_zOffsetInt * 0.000001)) + hv_base_height; hv_z = hv_z.TupleConcat(hv_height.TupleMean()); } catch (HalconException) { hv_z[hv_Index1 - 1] = 999.999; } } //Shawn添加判断 /* if (hv_z[0] == 999.999 && hv_z[1] != 999.999) hv_z[0] = hv_z[1] - 0.2 * CommonUtil.random.NextDouble(); if (hv_z[1] == 999.999 && hv_z[0] != 999.999) hv_z[1] = hv_z[0] + 0.2 * CommonUtil.random.NextDouble(); */ height[0] = hv_z[0].D; //当hv_z.Length == 1时,测试标准块;当hv_z.Length > 1时,测试电池。 height[1] = hv_z.Length > 1 ? hv_z[1].D : 999.999; } catch (HalconException) { height[0] = hv_z[0].D; height[1] = hv_z.Length > 1 ? hv_z[1].D : 999.999; ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Z.Dispose(); ho_ImageMean.Dispose(); ho_Regions.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_Battery.Dispose(); ho_RegionFillUp.Dispose(); ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); } ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Z.Dispose(); ho_ImageMean.Dispose(); ho_Regions.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); ho_SortedRegions.Dispose(); ho_Battery.Dispose(); ho_RegionFillUp.Dispose(); ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Region.Dispose(); } public static void DisplayImage(HObject image, HTuple hwindow) { HTuple imageheight = new HTuple(), imagewidth = new HTuple(); HOperatorSet.GetImageSize(image, out imagewidth, out imageheight); HOperatorSet.SetPart(hwindow, 0, 0, imageheight - 1, imagewidth - 1); HOperatorSet.DispObj(image, hwindow); } //读取图像 public static void ReadImage(string imagePath, out HObject image) { HOperatorSet.ReadImage(out image, (HTuple)imagePath); } //同步抓拍图像 public static void GrabImage(HTuple acqHandle, out HObject image) { //拍照 try { HOperatorSet.GrabImage(out image, acqHandle); } catch (Exception) { image = null; } } public static void myExcel(string path, string text) { if (!File.Exists(path)) Directory.CreateDirectory(path); path += "\\" + DateTime.Now.ToString("yyyyMMdd") + ".csv"; if (!File.Exists(path)) { string str = "Time,Condition" + ",\r\n"; File.AppendAllText(path, str); } File.AppendAllText(path, text); } public static void GrabImageAsync(HTuple acqHandle, HTuple MaxDelay, out HObject image) { HOperatorSet.GrabImageAsync(out image, acqHandle, MaxDelay); } //图像原始图像保存 public static string SaveImage(HObject image, string imageType, string directoryPath) { //string path = "D:\\图像1\\" + DateTime.Now.ToString("yyyyMMdd") + path1; if (!Directory.Exists(directoryPath)) Directory.CreateDirectory(directoryPath); string time = DateTime.Now.ToString("HHmmssfff"); HOperatorSet.WriteImage(image, imageType, 0, directoryPath + "\\" + time); return directoryPath + "\\" + time + "." + imageType; } public static string SaveImageAs(HObject image, string fileName) { string imageType = "png"; try { HOperatorSet.WriteImage(image, imageType, 0, fileName); } catch (Exception ex) { CommonUtil.WriteLog(LogType.Err, "保存图片失败:" + ex.ToString()); } return fileName + "." + imageType; } public static void SaveImage(HObject image, string imageType, string directoryPath, int imageIndex) { if (!Directory.Exists(directoryPath)) Directory.CreateDirectory(directoryPath); HOperatorSet.WriteImage(image, imageType, 0, directoryPath + "\\" + imageIndex.ToString()); } //保存窗口检测截图 public static string SaveWindowImage(HTuple hwindow, string imageType, string path) { string fileName = string.Empty; HObject image = new HObject(); HOperatorSet.DumpWindowImage(out image, hwindow); fileName = SaveImage(image, imageType, path); image.Dispose(); return fileName; } public static string SaveWindowImageAs(HTuple hwindow, string fileName) { HObject image = new HObject(); HOperatorSet.DumpWindowImage(out image, hwindow); string fn = SaveImageAs(image, fileName); image.Dispose(); return fn; } //保存相机内参 public void SaveCamParam(HTuple CamParam, string CamParamFileName) { //string CamParamFileName = ""; HOperatorSet.WriteCamPar(CamParam, CamParamFileName); //return CamParamFileName; } //保存相机位姿 public void SaveCamPose(HTuple CamPose, string CamPoseFileName) { //string CamPoseFileName = ""; HOperatorSet.WritePose(CamPose, CamPoseFileName); //return CamPoseFileName; } //判定是否成功标定 public void IsCaltabCalibrate(HObject Image, string CaltabName, HTuple StartCameraParam, HTuple WindowHandle, out bool IsCaltabCalibrate) { HObject ho_Caltab = new HObject(); HTuple hv_RCoord = new HTuple(), hv_CCoord = new HTuple(), hv_StartPose = new HTuple(); HTuple hv_SizeGauss, hv_MarkThresh, hv_MinDiamMarks, hv_StartThresh, hv_DeltaThresh, hv_MinThresh, hv_Alpha, hv_MinContLength, hv_MaxDiamMarks; HObject ho_Cross = null; HOperatorSet.GenEmptyObj(out ho_Cross); hv_SizeGauss = 3; hv_MarkThresh = 120; hv_MinDiamMarks = 5; hv_StartThresh = 128; hv_DeltaThresh = 10; hv_MinThresh = 18; hv_Alpha = 0.9; hv_MinContLength = 15; hv_MaxDiamMarks = 100; try { ho_Caltab.Dispose(); HOperatorSet.FindCaltab(Image, out ho_Caltab, CaltabName, hv_SizeGauss, hv_MarkThresh, hv_MinDiamMarks); HOperatorSet.FindMarksAndPose(Image, ho_Caltab, CaltabName, StartCameraParam, hv_StartThresh, hv_DeltaThresh, hv_MinThresh, hv_Alpha, hv_MinContLength, hv_MaxDiamMarks, out hv_RCoord, out hv_CCoord, out hv_StartPose); HOperatorSet.GenCrossContourXld(out ho_Cross, hv_RCoord, hv_CCoord, 16, 0.6); DisplayImage(Image, WindowHandle); HOperatorSet.SetDraw(WindowHandle, "margin"); HOperatorSet.SetColor(WindowHandle, "green"); HOperatorSet.DispObj(ho_Caltab, WindowHandle); HOperatorSet.SetColor(WindowHandle, "yellow"); HOperatorSet.DispObj(ho_Cross, WindowHandle); //HOperatorSet.DispCaltab(WindowHandle, CaltabName, StartCameraParam, hv_StartPose, 1); IsCaltabCalibrate = true; } catch (HalconException) { DisplayImage(Image, WindowHandle); IsCaltabCalibrate = false; } } //单目相机标定及精度换算(精度为mm单位) public void CameraCalibrate(HTuple ImagePath, string CaltabFileName, HTuple StartCamParam, HTuple WindowHandle, ref HTuple CameraParam, ref HTuple NFinalPose, ref HTuple Error, ref HTuple Pixscale) { // Local iconic variables HObject ho_Image = null, ho_Caltab = null; // Local control variables HTuple hv_WindowHandle = new HTuple(), hv_CaltabFile = null; HTuple hv_X = null, hv_Y = null, hv_Z = null, hv_StartCamPar = null; HTuple hv_SizeGauss = null, hv_MarkThresh = null, hv_MinDiamMarks = null; HTuple hv_StartThresh = null, hv_DeltaThresh = null, hv_MinThresh = null; HTuple hv_Alpha = null, hv_MinContLength = null, hv_MaxDiamMarks = null; HTuple hv_Rows = null, hv_Cols = null, hv_StartPoses = null; HTuple hv_Pixscales = null, hv_Index = null; HTuple hv_RCoord = new HTuple(), hv_CCoord = new HTuple(); HTuple hv_StartPose = new HTuple(), hv_Distance = new HTuple(); HTuple hv_Pixscale = new HTuple(), hv_CameraParam = null; HTuple hv_NFinalPose = null, hv_Errors = null, hv_pixScale = null; HObject ho_Cross = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Cross); HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_Caltab); try { //***halcon标定板标定像素精度****** //Read the model calibration points. hv_CaltabFile = CaltabFileName; HOperatorSet.CaltabPoints(hv_CaltabFile, out hv_X, out hv_Y, out hv_Z); //Set the initial values for the internal camera parameters //*** //**如果是远心镜头,第一个参数为0 hv_StartCamPar = new HTuple(); hv_StartCamPar[0] = StartCamParam[0]; hv_StartCamPar[1] = StartCamParam[1]; hv_StartCamPar[2] = StartCamParam[2]; hv_StartCamPar[3] = StartCamParam[3]; hv_StartCamPar[4] = StartCamParam[4]; hv_StartCamPar[5] = StartCamParam[5]; hv_StartCamPar[6] = StartCamParam[6]; hv_StartCamPar[7] = StartCamParam[7]; //Parameter settings for find_caltab and find_marks_and_pose hv_SizeGauss = 3; hv_MarkThresh = 120; hv_MinDiamMarks = 5; hv_StartThresh = 128; hv_DeltaThresh = 10; hv_MinThresh = 18; hv_Alpha = 0.9; hv_MinContLength = 15; hv_MaxDiamMarks = 100; //Create the tuples in which the image coordinates of the //calibration marks and the initial poses will be accumulated hv_Rows = new HTuple(); hv_Cols = new HTuple(); hv_StartPoses = new HTuple(); hv_Pixscales = new HTuple(); //Image Acquisition 01: Code generated by Image Acquisition 01 for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(ImagePath.TupleLength() )) - 1); hv_Index = (int)hv_Index + 1) { ho_Image.Dispose(); HOperatorSet.ReadImage(out ho_Image, ImagePath.TupleSelect(hv_Index)); //Search for the calibration plate ho_Caltab.Dispose(); HOperatorSet.FindCaltab(ho_Image, out ho_Caltab, hv_CaltabFile, hv_SizeGauss, hv_MarkThresh, hv_MinDiamMarks); HOperatorSet.FindMarksAndPose(ho_Image, ho_Caltab, hv_CaltabFile, hv_StartCamPar, hv_StartThresh, hv_DeltaThresh, hv_MinThresh, hv_Alpha, hv_MinContLength, hv_MaxDiamMarks, out hv_RCoord, out hv_CCoord, out hv_StartPose); //HOperatorSet.SetColor(WindowHandle, "green"); //DisplayImage(ho_Image, WindowHandle); //HOperatorSet.DispCaltab(WindowHandle, hv_CaltabFile, hv_StartCamPar, // hv_StartPose, 1); HOperatorSet.GenCrossContourXld(out ho_Cross, hv_RCoord, hv_CCoord, 16, 0.6); DisplayImage(ho_Image, WindowHandle); HOperatorSet.SetDraw(WindowHandle, "margin"); HOperatorSet.SetColor(WindowHandle, "green"); HOperatorSet.DispObj(ho_Caltab, WindowHandle); HOperatorSet.SetColor(WindowHandle, "yellow"); HOperatorSet.DispObj(ho_Cross, WindowHandle); hv_Rows = hv_Rows.TupleConcat(hv_RCoord); hv_Cols = hv_Cols.TupleConcat(hv_CCoord); hv_StartPoses = hv_StartPoses.TupleConcat(hv_StartPose); HOperatorSet.DistancePp(hv_RCoord.TupleSelect(0), hv_CCoord.TupleSelect(0), hv_RCoord.TupleSelect(6), hv_CCoord.TupleSelect(6), out hv_Distance); hv_Pixscale = ((hv_X.TupleSelect(6)) - (hv_X.TupleSelect(0))) / hv_Distance; hv_Pixscales = hv_Pixscales.TupleConcat(hv_Pixscale); } //Perform the actual calibration HOperatorSet.CameraCalibration(hv_X, hv_Y, hv_Z, hv_Rows, hv_Cols, hv_StartCamPar, hv_StartPoses, "all", out hv_CameraParam, out hv_NFinalPose, out hv_Errors); hv_pixScale = hv_Pixscales.TupleMean(); CameraParam = hv_CameraParam; NFinalPose = hv_NFinalPose; Error = hv_Errors; Pixscale = hv_pixScale[0] * 1000; } catch (HalconException) { ho_Image.Dispose(); ho_Caltab.Dispose(); } ho_Image.Dispose(); ho_Caltab.Dispose(); } //提取M*N点阵中心点 public void ExtractDotCenters(HObject ho_Image, HTuple hv_Threshold, HTuple hv_RowCount, HTuple hv_ColumnCount, ref HTuple hv_RowCenters, ref HTuple hv_ColumnCenters) { // Local iconic variables HObject ho_Region, ho_ConnectedRegions, ho_Rectangle = null; HObject ho_ImageReduced = null, ho_Region1 = null, ho_ConnectedRegions1 = null; HObject ho_SortedRegions = null; // Local control variables HTuple hv_Area = null, hv_Row = null, hv_Column = null; HTuple hv_DotRadius = null, hv_RowDis = null, hv_ColumnDis = null; HTuple hv_Index = null, hv_Area1 = new HTuple(), hv_Row1 = new HTuple(); HTuple hv_Column1 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SortedRegions); hv_RowCenters = new HTuple(); hv_ColumnCenters = new HTuple(); ho_Region.Dispose(); HOperatorSet.Threshold(ho_Image, out ho_Region, 0, hv_Threshold); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions); HOperatorSet.AreaCenter(ho_ConnectedRegions, out hv_Area, out hv_Row, out hv_Column); hv_DotRadius = (((hv_Area.TupleSelect(0)) / 3.1415926)).TupleSqrt(); hv_RowDis = (hv_Row.TupleSelect(4)) - (hv_Row.TupleSelect(0)); hv_ColumnDis = (hv_Column.TupleSelect(3)) - (hv_Column.TupleSelect(0)); HTuple end_val8 = hv_RowCount - 1; HTuple step_val8 = 1; for (hv_Index = 0; hv_Index.Continue(end_val8, step_val8); hv_Index = hv_Index.TupleAdd(step_val8)) { ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, ((hv_Row.TupleSelect(hv_Index * 4)) - hv_DotRadius) - 20, ((hv_Column.TupleSelect(hv_Index * 4)) - hv_DotRadius) - 20, ((hv_Row.TupleSelect( (hv_Index * 4) + 3)) + hv_DotRadius) + 20, ((hv_Column.TupleSelect((hv_Index * 4) + 3)) + hv_DotRadius) + 20); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 0, hv_Threshold); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_Region1, out ho_ConnectedRegions1); ho_SortedRegions.Dispose(); HOperatorSet.SortRegion(ho_ConnectedRegions1, out ho_SortedRegions, "first_point", "true", "column"); HOperatorSet.AreaCenter(ho_SortedRegions, out hv_Area1, out hv_Row1, out hv_Column1); hv_RowCenters = hv_RowCenters.TupleConcat(hv_Row1); hv_ColumnCenters = hv_ColumnCenters.TupleConcat(hv_Column1); } ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_Rectangle.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SortedRegions.Dispose(); return; } //判断点阵中心是否成功提取 public void isDotCalibrate(HObject Image, HTuple Threshold, HTuple hv_RowCount, HTuple hv_ColumnCount, ref HTuple RowCenters, ref HTuple ColumnCenters, out bool isDotCalibrate) { try { ExtractDotCenters(Image, Threshold, hv_RowCount, hv_ColumnCount, ref RowCenters, ref ColumnCenters); isDotCalibrate = true; } catch (HalconException) { isDotCalibrate = false; } } //九宫格标定中心坐标 public void NineCalibrate(HObject Image, HTuple Threshold, ref HTuple RowCenters, ref HTuple ColumnCenters) { // Local iconic variables HObject ho_StructElement, ho_Dark, ho_RegionOpening; HObject ho_Light, ho_RegionOpening1; // Local control variables HTuple hv_Area = null, hv_RowDark = null, hv_ColumnDark = null; HTuple hv_Area1 = null, hv_RowLight = null, hv_ColumnLight = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_StructElement); HOperatorSet.GenEmptyObj(out ho_Dark); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_Light); HOperatorSet.GenEmptyObj(out ho_RegionOpening1); ho_StructElement.Dispose(); HOperatorSet.GenStructElements(out ho_StructElement, "noise", 2, 2); //**提取黑格 ho_Dark.Dispose(); HOperatorSet.Threshold(Image, out ho_Dark, 0, Threshold); ho_RegionOpening.Dispose(); HOperatorSet.OpeningSeg(ho_Dark, ho_StructElement, out ho_RegionOpening); HOperatorSet.AreaCenter(ho_RegionOpening, out hv_Area, out hv_RowDark, out hv_ColumnDark); //**提取白格 ho_Light.Dispose(); HOperatorSet.Threshold(Image, out ho_Light, Threshold, 255); ho_RegionOpening1.Dispose(); HOperatorSet.OpeningSeg(ho_Light, ho_StructElement, out ho_RegionOpening1); HOperatorSet.AreaCenter(ho_RegionOpening1, out hv_Area1, out hv_RowLight, out hv_ColumnLight); RowCenters = new HTuple(); RowCenters = RowCenters.TupleConcat(hv_RowDark.TupleSelect( 0)); RowCenters = RowCenters.TupleConcat(hv_RowLight.TupleSelect( 0)); RowCenters = RowCenters.TupleConcat(hv_RowDark.TupleSelect( 1)); RowCenters = RowCenters.TupleConcat(hv_RowLight.TupleSelect( 1)); RowCenters = RowCenters.TupleConcat(hv_RowDark.TupleSelect( 2)); RowCenters = RowCenters.TupleConcat(hv_RowLight.TupleSelect( 2)); RowCenters = RowCenters.TupleConcat(hv_RowDark.TupleSelect( 3)); RowCenters = RowCenters.TupleConcat(hv_RowLight.TupleSelect( 3)); RowCenters = RowCenters.TupleConcat(hv_RowDark.TupleSelect( 4)); ColumnCenters = new HTuple(); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnDark.TupleSelect( 0)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnLight.TupleSelect( 0)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnDark.TupleSelect( 1)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnLight.TupleSelect( 1)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnDark.TupleSelect( 2)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnLight.TupleSelect( 2)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnDark.TupleSelect( 3)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnLight.TupleSelect( 3)); ColumnCenters = ColumnCenters.TupleConcat(hv_ColumnDark.TupleSelect( 4)); ho_StructElement.Dispose(); ho_Dark.Dispose(); ho_RegionOpening.Dispose(); ho_Light.Dispose(); ho_RegionOpening1.Dispose(); return; } //判断九宫格是否成功标定 public void isNineCalibrate(HObject Image, HTuple Threshold, ref HTuple RowCenters, ref HTuple ColumnCenters, out bool isNineCalibrate) { try { NineCalibrate(Image, Threshold, ref RowCenters, ref ColumnCenters); isNineCalibrate = true; } catch (HalconException) { isNineCalibrate = false; } } public void SelectBattery1(HObject ho_Image, out HObject ho_Batteries, HTuple hv_LowThreshold, HTuple hv_HighThreshold) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_Region1, ho_RegionFillUp, ho_ConnectedRegions; HObject ho_SelectedRegions, ho_Battery1 = null, ho_Battery2 = null; // Local control variables HTuple hv_Area = null, hv_Row1 = null, hv_Column1 = null; HTuple hv_Area1 = null, hv_Row = null, hv_Column = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Batteries); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_Battery1); HOperatorSet.GenEmptyObj(out ho_Battery2); ho_Batteries.Dispose(); HOperatorSet.GenEmptyObj(out ho_Batteries); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_Image, out ho_Region1, hv_LowThreshold, hv_HighThreshold); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Region1, out ho_RegionFillUp); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionFillUp, out ho_ConnectedRegions); HOperatorSet.AreaCenter(ho_ConnectedRegions, out hv_Area, out hv_Row1, out hv_Column1); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", 180000, 250000); HOperatorSet.AreaCenter(ho_SelectedRegions, out hv_Area1, out hv_Row, out hv_Column); if ((int)(new HTuple(hv_Area1.TupleNotEqual(new HTuple()))) != 0) { ho_Battery1.Dispose(); HOperatorSet.SelectShape(ho_SelectedRegions, out ho_Battery1, "column", "and", (hv_Column.TupleMax()) - 30, (hv_Column.TupleMax()) + 30); HOperatorSet.ConcatObj(ho_Batteries, ho_Battery1, out OTemp[0]); ho_Batteries.Dispose(); ho_Batteries = OTemp[0]; ho_Battery2.Dispose(); HOperatorSet.Difference(ho_SelectedRegions, ho_Battery1, out ho_Battery2); HOperatorSet.ConcatObj(ho_Batteries, ho_Battery2, out OTemp[0]); ho_Batteries.Dispose(); ho_Batteries = OTemp[0]; } ho_Region1.Dispose(); ho_RegionFillUp.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Battery1.Dispose(); ho_Battery2.Dispose(); return; } public void SelectBattery(HObject ho_Image, out HObject ho_Batteries, HTuple hv_LowThreshold, HTuple hv_HighThreshold, out HTuple hv_BatteryStatus) { // Stack for temporary objects HObject[] OTemp = new HObject[20]; // Local iconic variables HObject ho_Region1, ho_RegionFillUp, ho_ConnectedRegions; HObject ho_SelectedRegions, ho_Battery1 = null, ho_Battery2 = null; // Local control variables HTuple hv_Width = null, hv_Height = null, hv_Area = null; HTuple hv_Row1 = null, hv_Column1 = null, hv_Area1 = null; HTuple hv_Row = null, hv_Column = null, hv_Length = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Batteries); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_Battery1); HOperatorSet.GenEmptyObj(out ho_Battery2); hv_BatteryStatus = new HTuple(); ho_Batteries.Dispose(); HOperatorSet.GenEmptyObj(out ho_Batteries); HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_Image, out ho_Region1, hv_LowThreshold, hv_HighThreshold); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Region1, out ho_RegionFillUp); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionFillUp, out ho_ConnectedRegions); HOperatorSet.AreaCenter(ho_ConnectedRegions, out hv_Area, out hv_Row1, out hv_Column1); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area", "and", 120000, 250000); HOperatorSet.AreaCenter(ho_SelectedRegions, out hv_Area1, out hv_Row, out hv_Column); HOperatorSet.TupleLength(hv_Column, out hv_Length); if ((int)(new HTuple(hv_Length.TupleEqual(2))) != 0) { hv_BatteryStatus = 3; } else if ((int)(new HTuple(hv_Length.TupleEqual(0))) != 0) { hv_BatteryStatus = 10; } else if ((int)(new HTuple(hv_Column.TupleLess(0.5 * hv_Width))) != 0) { hv_BatteryStatus = 1; } else if ((int)(new HTuple(hv_Column.TupleGreater(0.5 * hv_Width))) != 0) { hv_BatteryStatus = 2; } if ((int)(new HTuple(hv_Area1.TupleNotEqual(new HTuple()))) != 0) { ho_Battery1.Dispose(); HOperatorSet.SelectShape(ho_SelectedRegions, out ho_Battery1, "column", "and", (hv_Column.TupleMax()) - 30, (hv_Column.TupleMax()) + 30); HOperatorSet.ConcatObj(ho_Batteries, ho_Battery1, out OTemp[0]); ho_Batteries.Dispose(); ho_Batteries = OTemp[0]; ho_Battery2.Dispose(); HOperatorSet.Difference(ho_SelectedRegions, ho_Battery1, out ho_Battery2); HOperatorSet.ConcatObj(ho_Batteries, ho_Battery2, out OTemp[0]); ho_Batteries.Dispose(); ho_Batteries = OTemp[0]; } ho_Region1.Dispose(); ho_RegionFillUp.Dispose(); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Battery1.Dispose(); ho_Battery2.Dispose(); return; } //halcon处理Gocator相机采集到的图像 public void Go2GenTL_ParseData(HObject ho_Image, out HObject ho_HeightMap, out HObject ho_Intensity, out HTuple hv_FrameCount, out HTuple hv_Timestamp, out HTuple hv_EncoderPosition, out HTuple hv_EncoderIndex, out HTuple hv_Inputs, out HTuple hv_xOffset, out HTuple hv_xResolution, out HTuple hv_yOffset, out HTuple hv_yResolution, out HTuple hv_zOffset, out HTuple hv_zResolution, out HTuple hv_Width, out HTuple hv_Length) { // Local iconic variables HObject ho_Stamps; // Local control variables HTuple hv_ChannelCount = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_HeightMap); HOperatorSet.GenEmptyObj(out ho_Intensity); HOperatorSet.GenEmptyObj(out ho_Stamps); HOperatorSet.CountChannels(ho_Image, out hv_ChannelCount); ho_HeightMap.Dispose(); ho_Intensity.Dispose(); ho_Stamps.Dispose(); HOperatorSet.Decompose3(ho_Image, out ho_HeightMap, out ho_Intensity, out ho_Stamps ); Go2GenTL_Stamp(ho_Stamps, 1, out hv_FrameCount); Go2GenTL_Stamp(ho_Stamps, 2, out hv_Timestamp); Go2GenTL_Stamp(ho_Stamps, 3, out hv_EncoderPosition); Go2GenTL_Stamp(ho_Stamps, 4, out hv_EncoderIndex); Go2GenTL_Stamp(ho_Stamps, 5, out hv_Inputs); Go2GenTL_Stamp(ho_Stamps, 6, out hv_xOffset); Go2GenTL_Stamp(ho_Stamps, 7, out hv_xResolution); Go2GenTL_Stamp(ho_Stamps, 8, out hv_yOffset); Go2GenTL_Stamp(ho_Stamps, 9, out hv_yResolution); Go2GenTL_Stamp(ho_Stamps, 10, out hv_zOffset); Go2GenTL_Stamp(ho_Stamps, 11, out hv_zResolution); Go2GenTL_Stamp(ho_Stamps, 12, out hv_Width); Go2GenTL_Stamp(ho_Stamps, 13, out hv_Length); ho_Stamps.Dispose(); return; } public void Go2GenTL_Stamp(HObject ho_Stamps, HTuple hv_Index, out HTuple hv_Value) { // Local control variables HTuple hv_tempvalue0 = null, hv_tempvalue1 = null; HTuple hv_tempvalue2 = null, hv_tempvalue3 = null; // Initialize local and output iconic variables hv_Value = new HTuple(); HOperatorSet.GetGrayval(ho_Stamps, 0, hv_Index * 4, out hv_tempvalue0); HOperatorSet.GetGrayval(ho_Stamps, 0, (hv_Index * 4) + 1, out hv_tempvalue1); HOperatorSet.GetGrayval(ho_Stamps, 0, (hv_Index * 4) + 2, out hv_tempvalue2); HOperatorSet.GetGrayval(ho_Stamps, 0, (hv_Index * 4) + 3, out hv_tempvalue3); HOperatorSet.TupleLsh(hv_tempvalue0, 16, out hv_tempvalue0); HOperatorSet.TupleLsh(hv_tempvalue1, 0, out hv_tempvalue1); HOperatorSet.TupleLsh(hv_tempvalue2, 16, out hv_tempvalue2); HOperatorSet.TupleLsh(hv_tempvalue3, 0, out hv_tempvalue3); if (hv_Value == null) hv_Value = new HTuple(); hv_Value[0] = hv_tempvalue2 + hv_tempvalue3; if (hv_Value == null) hv_Value = new HTuple(); hv_Value[1] = hv_tempvalue0 + hv_tempvalue1; return; } //计算电池长 public void MeasureLength(HObject Image, ref HObject BatteryRectContour, ref HTuple CenterRow, ref HTuple CenterColumn, ref HTuple CenterPhi, ref double BatteryLength) { // Local iconic variables HObject ho_Region = null, ho_RegionOpening = null; HObject ho_ConnectedRegions1 = null, ho_Battery = null, ho_Contour = null; HObject ho_Rectangle = null; // Local control variables HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); HTuple hv_Row = new HTuple(), hv_Column = new HTuple(); HTuple hv_Phi = new HTuple(), hv_Length1 = new HTuple(); HTuple hv_Length2 = new HTuple(), hv_PointOrder = new HTuple(); HTuple hv_BatteryLength = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Contour); HOperatorSet.GenEmptyObj(out ho_Rectangle); try { HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); ho_Region.Dispose(); HOperatorSet.Threshold(Image, out ho_Region, 0, 100); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Region, out ho_RegionOpening, 600, 200); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionOpening, out ho_ConnectedRegions1); ho_Battery.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions1, out ho_Battery, "max_area", 0); ho_Contour.Dispose(); HOperatorSet.GenContourRegionXld(ho_Battery, out ho_Contour, "border"); HOperatorSet.InnerRectangle1(ho_Battery, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); HOperatorSet.FitRectangle2ContourXld(ho_Contour, "regression", -1, 0, 0, 3, 2, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2, out hv_PointOrder); BatteryRectContour.Dispose(); HOperatorSet.GenRectangle2ContourXld(out BatteryRectContour, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); CenterRow = hv_Row; CenterColumn = hv_Column; CenterPhi = hv_Phi; hv_BatteryLength = 2 * hv_Length1; BatteryLength = hv_BatteryLength.D; } catch (HalconException) { CenterRow = 0; CenterColumn = 0; CenterPhi = 0; BatteryLength = 999.999; ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); } ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); } //计算电池宽 public void MeasureWidth(HObject Image, HTuple Hwindow, HObject BatteryRectContour, HTuple CenterRow, HTuple CenterColumn, HTuple CenterPhi, ref double BatteryWidth) { // Local iconic variables HObject ho_ImageAffinTrans = null, ho_Rectangle = null, ho_ContoursAffinTrans = null; HObject ho_Regions = null, ho_ObjectSelected1 = null, ho_RegionClosing1 = null; HObject ho_RectangleFlex = null, ho_RegionLineFlex = null, ho_RectangleT = null; HObject ho_RegionLineT = null, ho_RegionLineL = null, ho_RegionLineR = null; // Local control variables HTuple hv_CenterRow = null, hv_CenterColumn = null; HTuple hv_CenterPhi = null, hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_Seconds = new HTuple(), hv_LowThreshold = new HTuple(); HTuple hv_HighThreshold = new HTuple(), hv_HomMat2DIdentity = new HTuple(); HTuple hv_HomMat2DRotate = new HTuple(), hv_CornerRow = new HTuple(); HTuple hv_CornerColumn = new HTuple(), hv_i = new HTuple(); HTuple hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); HTuple hv_SigmaFlex = new HTuple(), hv_ThresholdFlex = new HTuple(); HTuple hv_PhiFlex = new HTuple(), hv_RectCenterRowFlex = new HTuple(); HTuple hv_RectCenterColumnFlex = new HTuple(), hv_Len1Flex = new HTuple(); HTuple hv_Len2Flex = new HTuple(), hv_MeasureHandleFlex = new HTuple(); HTuple hv_RowEdgeFlex = new HTuple(), hv_ColumnEdgeFlex = new HTuple(); HTuple hv_Amplitude = new HTuple(), hv_Distance = new HTuple(); HTuple hv_SigmaT = new HTuple(), hv_ThresholdT = new HTuple(); HTuple hv_PhiT = new HTuple(), hv_RectCenterRowT = new HTuple(); HTuple hv_RectCenterColumnT = new HTuple(), hv_Len1T = new HTuple(); HTuple hv_Len2T = new HTuple(), hv_MeasureHandleT = new HTuple(); HTuple hv_RowEdgeT = new HTuple(), hv_ColumnEdgeT = new HTuple(); HTuple hv_BatteryWidth = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ImageAffinTrans); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_ObjectSelected1); HOperatorSet.GenEmptyObj(out ho_RegionClosing1); HOperatorSet.GenEmptyObj(out ho_RectangleFlex); HOperatorSet.GenEmptyObj(out ho_RegionLineFlex); HOperatorSet.GenEmptyObj(out ho_RectangleT); HOperatorSet.GenEmptyObj(out ho_RegionLineT); HOperatorSet.GenEmptyObj(out ho_RegionLineL); HOperatorSet.GenEmptyObj(out ho_RegionLineR); try { hv_CenterRow = CenterRow; hv_CenterColumn = CenterColumn; hv_CenterPhi = CenterPhi; HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); hv_LowThreshold = 160; hv_HighThreshold = 255; HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity, -hv_CenterPhi, hv_CenterColumn, hv_CenterRow, out hv_HomMat2DRotate); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(Image, out ho_ImageAffinTrans, hv_HomMat2DRotate, "constant", "false"); ho_ContoursAffinTrans.Dispose(); HOperatorSet.AffineTransContourXld(BatteryRectContour, out ho_ContoursAffinTrans, hv_HomMat2DRotate); HOperatorSet.GetContourXld(ho_ContoursAffinTrans, out hv_CornerRow, out hv_CornerColumn); hv_CornerRow = hv_CornerRow.TupleSelectRange(0, 3); hv_CornerColumn = hv_CornerColumn.TupleSelectRange(0, 3); //****找四个推头区域 ho_Regions.Dispose(); ConvexistyArea(ho_ImageAffinTrans, out ho_Regions, hv_LowThreshold, hv_HighThreshold); for (hv_i = 1; (int)hv_i <= 3; hv_i = (int)hv_i + 1) { ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_Regions, out ho_ObjectSelected1, hv_i); ho_RegionClosing1.Dispose(); HOperatorSet.ClosingRectangle1(ho_ObjectSelected1, out ho_RegionClosing1, 20, 20); HOperatorSet.SmallestRectangle1(ho_RegionClosing1, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2); if ((int)(new HTuple(hv_i.TupleEqual(1))) != 0) { hv_SigmaFlex = 1.2; hv_ThresholdFlex = 20; hv_PhiFlex = (new HTuple(90)).TupleRad(); hv_RectCenterRowFlex = hv_Row1.Clone(); hv_RectCenterColumnFlex = (hv_Column1 + hv_Column2) * 0.5; hv_Len1Flex = 15; hv_Len2Flex = (hv_Column2 - hv_Column1) * 0.5; ho_RectangleFlex.Dispose(); //HOperatorSet.GenRectangle2(out ho_RectangleFlex, hv_RectCenterRowFlex, // hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleFlex); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleFlex, hv_SigmaFlex, hv_ThresholdFlex, "negative", "all", out hv_RowEdgeFlex, out hv_ColumnEdgeFlex, out hv_Amplitude, out hv_Distance); ho_RegionLineFlex.Dispose(); //HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( // 0), (hv_ColumnEdgeFlex.TupleSelect(0)) - hv_Len2Flex, hv_RowEdgeFlex.TupleSelect( // 0), (hv_ColumnEdgeFlex.TupleSelect(0)) + hv_Len2Flex); } } hv_SigmaT = 1.2; hv_ThresholdT = 15; hv_PhiT = (new HTuple(-90)).TupleRad(); hv_RectCenterRowT = hv_Row2.Clone(); hv_RectCenterColumnT = ((hv_Column1 + hv_Column2) * 0.5) - 800; hv_Len1T = 20; hv_Len2T = (((hv_Column2 - hv_Column1) * 0.5) - 40) + 400; ho_RectangleT.Dispose(); //HOperatorSet.GenRectangle2(out ho_RectangleT, hv_RectCenterRowT, hv_RectCenterColumnT, // hv_PhiT, hv_Len1T, hv_Len2T); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowT, hv_RectCenterColumnT, hv_PhiT, hv_Len1T, hv_Len2T, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleT); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleT, hv_SigmaT, hv_ThresholdT, "negative", "all", out hv_RowEdgeT, out hv_ColumnEdgeT, out hv_Amplitude, out hv_Distance); ho_RegionLineT.Dispose(); //HOperatorSet.GenRegionLine(out ho_RegionLineT, hv_RowEdgeT.TupleSelect(0), // (hv_ColumnEdgeT.TupleSelect(0)) - hv_Len2T, hv_RowEdgeT.TupleSelect(0), (hv_ColumnEdgeT.TupleSelect( // 0)) + hv_Len2T); HOperatorSet.SetColor(Hwindow, "green"); HOperatorSet.DispObj(ho_ImageAffinTrans, Hwindow); ho_RegionLineL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineL, 0, hv_CornerColumn.TupleSelect( 1), hv_Height, hv_CornerColumn.TupleSelect(2)); ho_RegionLineR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineR, 0, hv_CornerColumn.TupleSelect( 0), hv_Height, hv_CornerColumn.TupleSelect(3)); ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), 0, hv_RowEdgeFlex.TupleSelect(0), hv_Width); ho_RegionLineT.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineT, hv_RowEdgeT.TupleSelect(0), 0, hv_RowEdgeT.TupleSelect(0), hv_Width); hv_BatteryWidth = hv_RowEdgeFlex.TupleSelect(0) - hv_RowEdgeT.TupleSelect(0); BatteryWidth = hv_BatteryWidth.D; } catch (HalconException) { HOperatorSet.DispObj(ho_ImageAffinTrans, Hwindow); BatteryWidth = 999.999; BatteryRectContour.Dispose(); ho_ImageAffinTrans.Dispose(); ho_Rectangle.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleT.Dispose(); ho_RegionLineT.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); } BatteryRectContour.Dispose(); ho_ImageAffinTrans.Dispose(); ho_Rectangle.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleT.Dispose(); ho_RegionLineT.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); } //计算四个推头区域 public void ConvexistyArea(HObject Image, out HObject Regions, HTuple LowThreshold, HTuple HighThreshold) { // Local iconic variables HObject ho_Region, ho_RegionOpening, ho_ConnectedRegions1; HObject ho_SelectedRegions, ho_ClosingRegion; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ClosingRegion); HOperatorSet.GenEmptyObj(out Regions); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); ho_Region.Dispose(); HOperatorSet.Threshold(Image, out ho_Region, LowThreshold, HighThreshold); ho_ClosingRegion.Dispose(); HOperatorSet.ClosingCircle(ho_Region, out ho_ClosingRegion, 13.5); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_ClosingRegion, out ho_RegionOpening, 200, 200); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionOpening, out ho_ConnectedRegions1); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions, "area", "and", 150000, 500000); Regions.Dispose(); HOperatorSet.SortRegion(ho_SelectedRegions, out Regions, "upper_left", "true", "column"); ho_Region.Dispose(); ho_ClosingRegion.Dispose(); ho_RegionOpening.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions.Dispose(); return; } //M423计算电池长宽 public void M423MeasureLW1(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth) { // Local iconic variables HObject ho_Region, ho_RegionOpening; HObject ho_RegionClosing, ho_ConnectedRegions1, ho_Battery; HObject ho_Contour, ho_Rectangle, ho_ImageAffinTrans, ho_ContoursAffinTrans; HObject ho_Regions, ho_ObjectSelected1 = null, ho_RegionClosing1 = null; HObject ho_Rectangle1 = null, ho_ImageReduced = null, ho_Region1 = null; HObject ho_Rectangle2 = null, ho_RectangleFlex = null, ho_RegionLineFlex; HObject ho_RectangleT, ho_RegionLineT, ho_RegionLineL, ho_RegionLineR; // Local control variables HTuple hv_Width = null; HTuple hv_Height = null, hv_LowThreshold = null, hv_HighThreshold = null; HTuple hv_Row = null, hv_Column = null, hv_Phi = null; HTuple hv_Length1 = null, hv_Length2 = null, hv_PointOrder = null; HTuple hv_BatteryLength = null, hv_HomMat2DIdentity = null; HTuple hv_HomMat2DRotate = null, hv_CornerRow = null, hv_CornerColumn = null; HTuple hv_i = null, hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); HTuple hv_Row11 = new HTuple(), hv_Column11 = new HTuple(); HTuple hv_Row21 = new HTuple(), hv_Column21 = new HTuple(); HTuple hv_SigmaFlex = new HTuple(), hv_ThresholdFlex = new HTuple(); HTuple hv_PhiFlex = new HTuple(), hv_RectCenterRowFlex = new HTuple(); HTuple hv_RectCenterColumnFlex = new HTuple(), hv_Len1Flex = new HTuple(); HTuple hv_Len2Flex = new HTuple(), hv_MeasureHandleFlex = new HTuple(); HTuple hv_RowEdgeFlex = new HTuple(), hv_ColumnEdgeFlex = new HTuple(); HTuple hv_Amplitude = null, hv_Distance = null, hv_SigmaT = null; HTuple hv_ThresholdT = null, hv_PhiT = null, hv_RectCenterRowT = null; HTuple hv_RectCenterColumnT = null, hv_Len1T = null, hv_Len2T = null; HTuple hv_MeasureHandleT = null, hv_RowEdgeT = null, hv_ColumnEdgeT = null; HTuple hv_BatteryWidth = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_RegionClosing); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Contour); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageAffinTrans); HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_ObjectSelected1); HOperatorSet.GenEmptyObj(out ho_RegionClosing1); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_Rectangle2); HOperatorSet.GenEmptyObj(out ho_RectangleFlex); HOperatorSet.GenEmptyObj(out ho_RegionLineFlex); HOperatorSet.GenEmptyObj(out ho_RectangleT); HOperatorSet.GenEmptyObj(out ho_RegionLineT); HOperatorSet.GenEmptyObj(out ho_RegionLineL); HOperatorSet.GenEmptyObj(out ho_RegionLineR); try { HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); //*****??池? hv_LowThreshold = 70; hv_HighThreshold = 200; ho_Region.Dispose(); HOperatorSet.Threshold(Image, out ho_Region, 0, hv_LowThreshold); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Region, out ho_RegionOpening, 50, 50); ho_RegionClosing.Dispose(); HOperatorSet.ClosingRectangle1(ho_RegionOpening, out ho_RegionClosing, 200, 200); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionClosing, out ho_ConnectedRegions1); ho_Battery.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions1, out ho_Battery, "max_area", 0); ho_Contour.Dispose(); HOperatorSet.GenContourRegionXld(ho_Battery, out ho_Contour, "border"); HOperatorSet.FitRectangle2ContourXld(ho_Contour, "regression", -1, 0, 0, 3, 2, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2, out hv_PointOrder); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2ContourXld(out ho_Rectangle, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); //*****??池? HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity, -hv_Phi, hv_Column, hv_Row, out hv_HomMat2DRotate); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(Image, out ho_ImageAffinTrans, hv_HomMat2DRotate, "constant", "false"); ho_ContoursAffinTrans.Dispose(); HOperatorSet.AffineTransContourXld(ho_Rectangle, out ho_ContoursAffinTrans, hv_HomMat2DRotate); HOperatorSet.GetContourXld(ho_ContoursAffinTrans, out hv_CornerRow, out hv_CornerColumn); hv_CornerRow = hv_CornerRow.TupleSelectRange(0, 3); hv_CornerColumn = hv_CornerColumn.TupleSelectRange(0, 3); //****找四?推??域 ho_Regions.Dispose(); ConvexistyArea(ho_ImageAffinTrans, out ho_Regions, hv_LowThreshold, hv_HighThreshold); for (hv_i = 1; (int)hv_i <= 2; hv_i = (int)hv_i + 1) { ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_Regions, out ho_ObjectSelected1, hv_i); ho_RegionClosing1.Dispose(); HOperatorSet.ClosingRectangle1(ho_ObjectSelected1, out ho_RegionClosing1, 20, 20); HOperatorSet.SmallestRectangle1(ho_RegionClosing1, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2); if ((int)(new HTuple(hv_i.TupleEqual(1))) != 0) { ho_Rectangle1.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle1, hv_Row1 - 200, hv_Column1 - 300, hv_Row1 + 50, hv_Column2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_ImageAffinTrans, ho_Rectangle1, out ho_ImageReduced ); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 0, hv_LowThreshold); HOperatorSet.SmallestRectangle1(ho_Region1, out hv_Row11, out hv_Column11, out hv_Row21, out hv_Column21); ho_Rectangle2.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle2, hv_Row11, hv_Column11, hv_Row21, hv_Column21); hv_SigmaFlex = 1.2; hv_ThresholdFlex = 20; hv_PhiFlex = (new HTuple(90)).TupleRad(); hv_RectCenterRowFlex = hv_Row21.Clone(); hv_RectCenterColumnFlex = (hv_Column11 + hv_Column21) * 0.5; hv_Len1Flex = 15; hv_Len2Flex = (hv_Column21 - hv_Column11) * 0.5; ho_RectangleFlex.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleFlex, hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleFlex); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleFlex, hv_SigmaFlex, hv_ThresholdFlex, "negative", "all", out hv_RowEdgeFlex, out hv_ColumnEdgeFlex, out hv_Amplitude, out hv_Distance); ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), (hv_ColumnEdgeFlex.TupleSelect(0)) - hv_Len2Flex, hv_RowEdgeFlex.TupleSelect( 0), (hv_ColumnEdgeFlex.TupleSelect(0)) + hv_Len2Flex); } } hv_SigmaT = 1.5; hv_ThresholdT = 15; hv_PhiT = (new HTuple(-90)).TupleRad(); hv_RectCenterRowT = hv_Row2.Clone(); hv_RectCenterColumnT = hv_Column2 + 650; hv_Len1T = 30; hv_Len2T = 600; ho_RectangleT.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleT, hv_RectCenterRowT, hv_RectCenterColumnT, hv_PhiT, hv_Len1T, hv_Len2T); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowT, hv_RectCenterColumnT, hv_PhiT, hv_Len1T, hv_Len2T, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleT); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleT, hv_SigmaT, hv_ThresholdT, "negative", "all", out hv_RowEdgeT, out hv_ColumnEdgeT, out hv_Amplitude, out hv_Distance); ho_RegionLineT.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineT, hv_RowEdgeT.TupleSelect(0), (hv_ColumnEdgeT.TupleSelect( 0)) - hv_Len2T, hv_RowEdgeT.TupleSelect(0), (hv_ColumnEdgeT.TupleSelect(0)) + hv_Len2T); ho_RegionLineL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineL, 0, hv_CornerColumn.TupleSelect( 1), hv_Height, hv_CornerColumn.TupleSelect(2)); ho_RegionLineR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineR, 0, hv_CornerColumn.TupleSelect( 0), hv_Height, hv_CornerColumn.TupleSelect(3)); ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), 0, hv_RowEdgeFlex.TupleSelect(0), hv_Width); ho_RegionLineT.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineT, hv_RowEdgeT.TupleSelect(0), 0, hv_RowEdgeT.TupleSelect(0), hv_Width); hv_BatteryWidth = (hv_RowEdgeFlex.TupleSelect(0)) - (hv_RowEdgeT.TupleSelect(0)); hv_BatteryLength = 2 * hv_Length1; batteryLength = hv_BatteryLength.D; batteryWidth = hv_BatteryWidth.D; HOperatorSet.SetColor(Hwindow, "green"); VisionDetect.DisplayImage(ho_ImageAffinTrans, Hwindow); HOperatorSet.DispObj(ho_RegionLineT, Hwindow); HOperatorSet.DispObj(ho_RegionLineFlex, Hwindow); HOperatorSet.DispObj(ho_RegionLineL, Hwindow); HOperatorSet.DispObj(ho_RegionLineR, Hwindow); } catch (HalconException) { batteryLength = 999.999; batteryWidth = 999.999; VisionDetect.DisplayImage(ho_ImageAffinTrans, Hwindow); ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_RegionClosing.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_Rectangle2.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleT.Dispose(); ho_RegionLineT.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); } ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_RegionClosing.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_Rectangle2.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleT.Dispose(); ho_RegionLineT.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); } public void M423MeasureLW(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth, ref double cellWidth, bool convex) { // Local iconic variables HObject ho_Region = null, ho_RegionOpening = null; HObject ho_RegionClosing = null, ho_ConnectedRegions1 = null; HObject ho_Battery = null, ho_Contour = null, ho_Rectangle = null; HObject ho_ImageAffinTrans = null, ho_ContoursAffinTrans = null; HObject ho_Regions = null, ho_ObjectSelected1 = null, ho_RegionClosing1 = null; HObject ho_Rectangle1 = null, ho_ImageReduced = null, ho_Region1 = null; HObject ho_Rectangle2 = null, ho_RectangleFlex = null, ho_RegionLineFlex = null; HObject ho_RectangleTR = null, ho_RegionLineTR = null, ho_RectangleTL = null; HObject ho_RegionLineTL = null, ho_RegionLineL = null, ho_RegionLineR = null; HObject ho_RegionLineT = null, ho_RegionOpening1 = null, ho_ConnectedRegions = null, ho_SelectedRegions = null; HObject ho_ImageMean = null, ho_Rectangle4 = null; HObject ho_ImageReduced1 = null; // Local control variables HTuple hv_Width = new HTuple(); HTuple hv_Height = new HTuple(), hv_LowThreshold = new HTuple(); HTuple hv_HighThreshold = new HTuple(), hv_Row = new HTuple(); HTuple hv_Column = new HTuple(), hv_Phi = new HTuple(); HTuple hv_Length1 = new HTuple(), hv_Length2 = new HTuple(); HTuple hv_PointOrder = new HTuple(), hv_BatteryLength = new HTuple(); HTuple hv_HomMat2DIdentity = new HTuple(), hv_HomMat2DRotate = new HTuple(); HTuple hv_CornerRow = new HTuple(), hv_CornerColumn = new HTuple(); HTuple hv_i = new HTuple(), hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); HTuple hv_Row11 = new HTuple(), hv_Column11 = new HTuple(); HTuple hv_Row21 = new HTuple(), hv_Column21 = new HTuple(); HTuple hv_SigmaFlex = new HTuple(), hv_ThresholdFlex = new HTuple(); HTuple hv_PhiFlex = new HTuple(), hv_RectCenterRowFlex = new HTuple(); HTuple hv_RectCenterColumnFlex = new HTuple(), hv_Len1Flex = new HTuple(); HTuple hv_Len2Flex = new HTuple(), hv_MeasureHandleFlex = new HTuple(); HTuple hv_RowEdgeFlex = new HTuple(), hv_ColumnEdgeFlex = new HTuple(); HTuple hv_Amplitude = new HTuple(), hv_Distance = new HTuple(); HTuple hv_SigmaTR = new HTuple(), hv_ThresholdTR = new HTuple(); HTuple hv_PhiTR = new HTuple(), hv_RectCenterRowTR = new HTuple(); HTuple hv_RectCenterColumnTR = new HTuple(), hv_Len1TR = new HTuple(); HTuple hv_Len2TR = new HTuple(), hv_MeasureHandleTR = new HTuple(); HTuple hv_RowEdgeTR = new HTuple(), hv_ColumnEdgeTR = new HTuple(); HTuple hv_SigmaTL = new HTuple(), hv_ThresholdTL = new HTuple(); HTuple hv_PhiTL = new HTuple(), hv_RectCenterRowTL = new HTuple(); HTuple hv_RectCenterColumnTL = new HTuple(), hv_Len1TL = new HTuple(); HTuple hv_Len2TL = new HTuple(), hv_MeasureHandleTL = new HTuple(); HTuple hv_RowEdgeTL = new HTuple(), hv_ColumnEdgeTL = new HTuple(); HTuple hv_RowEdgeT = new HTuple(), hv_ColumnEdgeT = new HTuple(); HTuple hv_BatteryWidth = new HTuple(), hv_Seconds1 = new HTuple(); HTuple hv_t = new HTuple(), hv_CellWidth = new HTuple(); HTuple hv_RowConvex = new HTuple(), hv_ColumnConvex = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ImageReduced1); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionOpening1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_RegionClosing); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Contour); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageAffinTrans); HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_ObjectSelected1); HOperatorSet.GenEmptyObj(out ho_RegionClosing1); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_Rectangle2); HOperatorSet.GenEmptyObj(out ho_RectangleFlex); HOperatorSet.GenEmptyObj(out ho_RegionLineFlex); HOperatorSet.GenEmptyObj(out ho_RectangleTR); HOperatorSet.GenEmptyObj(out ho_RegionLineTR); HOperatorSet.GenEmptyObj(out ho_RectangleTL); HOperatorSet.GenEmptyObj(out ho_RegionLineTL); HOperatorSet.GenEmptyObj(out ho_RegionLineL); HOperatorSet.GenEmptyObj(out ho_RegionLineR); HOperatorSet.GenEmptyObj(out ho_RegionLineT); HOperatorSet.GenEmptyObj(out ho_ImageMean); HOperatorSet.GenEmptyObj(out ho_Rectangle4); try { HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); //*****??池? hv_LowThreshold = 80; hv_HighThreshold = 240; ho_Rectangle4.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle4, 380, 150, 2500, 3330); ho_ImageReduced1.Dispose(); HOperatorSet.ReduceDomain(Image, ho_Rectangle4, out ho_ImageReduced1); ho_ImageMean.Dispose(); HOperatorSet.MeanImage(ho_ImageReduced1, out ho_ImageMean, 10, 10); ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageMean, out ho_Region, 0, hv_LowThreshold); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Region, out ho_RegionOpening, 10, 10); ho_RegionClosing.Dispose(); HOperatorSet.ClosingRectangle1(ho_RegionOpening, out ho_RegionClosing, 200, 200); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionClosing, out ho_ConnectedRegions1); ho_Battery.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions1, out ho_Battery, "max_area", 0); ho_Contour.Dispose(); HOperatorSet.GenContourRegionXld(ho_Battery, out ho_Contour, "border"); HOperatorSet.FitRectangle2ContourXld(ho_Contour, "regression", -1, 0, 0, 3, 2, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2, out hv_PointOrder); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2ContourXld(out ho_Rectangle, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); hv_BatteryLength = 2 * hv_Length1; //*****??池? try { HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity, -hv_Phi, hv_Column, hv_Row, out hv_HomMat2DRotate); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(Image, out ho_ImageAffinTrans, hv_HomMat2DRotate, "constant", "false"); ho_ContoursAffinTrans.Dispose(); HOperatorSet.AffineTransContourXld(ho_Rectangle, out ho_ContoursAffinTrans, hv_HomMat2DRotate); HOperatorSet.GetContourXld(ho_ContoursAffinTrans, out hv_CornerRow, out hv_CornerColumn); hv_CornerRow = hv_CornerRow.TupleSelectRange(0, 3); hv_CornerColumn = hv_CornerColumn.TupleSelectRange(0, 3); if (convex) { M423ConvexPoint(ho_ImageAffinTrans, hv_CornerRow.TupleSelect(0), hv_CornerColumn.TupleSelect(0), hv_CornerRow.TupleSelect(3), hv_CornerColumn.TupleSelect(3), hv_Phi, out hv_RowConvex, out hv_ColumnConvex); hv_BatteryLength = hv_ColumnConvex - (hv_CornerColumn.TupleSelect(1)); } //****找四?推??域 ho_Regions.Dispose(); ConvexistyArea(ho_ImageAffinTrans, out ho_Regions, hv_LowThreshold, hv_HighThreshold); for (hv_i = 1; (int)hv_i <= 2; hv_i = (int)hv_i + 1) { ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_Regions, out ho_ObjectSelected1, hv_i); ho_RegionClosing1.Dispose(); HOperatorSet.ClosingRectangle1(ho_ObjectSelected1, out ho_RegionClosing1, 20, 20); HOperatorSet.SmallestRectangle1(ho_RegionClosing1, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2); if ((int)(new HTuple(hv_i.TupleEqual(1))) != 0) { ho_Rectangle1.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle1, hv_Row1 - 200, hv_Column1 - 300, hv_Row1 + 50, hv_Column2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_ImageAffinTrans, ho_Rectangle1, out ho_ImageReduced ); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 0, hv_LowThreshold); ho_RegionOpening1.Dispose(); HOperatorSet.OpeningCircle(ho_Region1, out ho_RegionOpening1, 6.5); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionOpening1, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions, out ho_SelectedRegions, "max_area", 0); HOperatorSet.SmallestRectangle1(ho_SelectedRegions, out hv_Row11, out hv_Column11, out hv_Row21, out hv_Column21); ho_Rectangle2.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle2, hv_Row11, hv_Column11, hv_Row21, hv_Column21); hv_SigmaFlex = 1.2; //decrease the threshold from 25 to 15 Brant 2016-08-01 hv_ThresholdFlex = 15; hv_PhiFlex = (new HTuple(90)).TupleRad(); hv_RectCenterRowFlex = hv_Row21.Clone(); hv_RectCenterColumnFlex = hv_Column11 + 130; hv_Len1Flex = 30; hv_Len2Flex = 110; ho_RectangleFlex.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleFlex, hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleFlex); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleFlex, hv_SigmaFlex, hv_ThresholdFlex, "negative", "all", out hv_RowEdgeFlex, out hv_ColumnEdgeFlex, out hv_Amplitude, out hv_Distance); // free measure add by jjf 2016-08-01 HOperatorSet.CloseMeasure(hv_MeasureHandleFlex); ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), (hv_ColumnEdgeFlex.TupleSelect(0)) - hv_Len2Flex, hv_RowEdgeFlex.TupleSelect( 0), (hv_ColumnEdgeFlex.TupleSelect(0)) + hv_Len2Flex); } } //****上右 hv_SigmaTR = 1.5; hv_ThresholdTR = 40; hv_PhiTR = (new HTuple(-90)).TupleRad(); hv_RectCenterRowTR = hv_Row2.Clone(); hv_RectCenterColumnTR = hv_Column2 + 650; hv_Len1TR = 80; hv_Len2TR = 600; ho_RectangleTR.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleTR, hv_RectCenterRowTR, hv_RectCenterColumnTR, hv_PhiTR, hv_Len1TR, hv_Len2TR); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowTR, hv_RectCenterColumnTR, hv_PhiTR, hv_Len1TR, hv_Len2TR, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleTR); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleTR, hv_SigmaTR, hv_ThresholdTR, "negative", "all", out hv_RowEdgeTR, out hv_ColumnEdgeTR, out hv_Amplitude, out hv_Distance); // free measure add by jjf 2016-08-01 HOperatorSet.CloseMeasure(hv_MeasureHandleTR); ho_RegionLineTR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineTR, hv_RowEdgeTR.TupleSelect(0), (hv_ColumnEdgeTR.TupleSelect(0)) - hv_Len2TR, hv_RowEdgeTR.TupleSelect(0), (hv_ColumnEdgeTR.TupleSelect(0)) + hv_Len2TR); //***下右 hv_SigmaTL = 1.5; hv_ThresholdTL = 40; hv_PhiTL = (new HTuple(90)).TupleRad(); hv_RectCenterRowTL = hv_RectCenterRowFlex; hv_RectCenterColumnTL = hv_RectCenterColumnFlex + 1200; hv_Len1TL = 80; hv_Len2TL = 600; ho_RectangleTL.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleTL, hv_RectCenterRowTL, hv_RectCenterColumnTL, hv_PhiTL, hv_Len1TL, hv_Len2TL); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowTL, hv_RectCenterColumnTL, hv_PhiTL, hv_Len1TL, hv_Len2TL, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleTL); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleTL, hv_SigmaTL, hv_ThresholdTL, "negative", "all", out hv_RowEdgeTL, out hv_ColumnEdgeTL, out hv_Amplitude, out hv_Distance); // free measure add by jjf 2016-08-01 HOperatorSet.CloseMeasure(hv_MeasureHandleTL); ho_RegionLineTL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineTL, hv_RowEdgeTL.TupleSelect(0), (hv_ColumnEdgeTL.TupleSelect(0)) - hv_Len2TL, hv_RowEdgeTL.TupleSelect(0), (hv_ColumnEdgeTL.TupleSelect(0)) + hv_Len2TL); //*****??行坐?小的? hv_RowEdgeT = new HTuple(); hv_ColumnEdgeT = new HTuple(); if ((int)(new HTuple(((hv_RowEdgeTL.TupleSelect(0))).TupleLess(0//hv_RowEdgeTR.TupleSelect(0) ))) != 0) { hv_RowEdgeT = hv_RowEdgeTL[0]; hv_ColumnEdgeT = hv_ColumnEdgeTL[0]; } else { hv_RowEdgeT = hv_RowEdgeTR[0]; hv_ColumnEdgeT = hv_ColumnEdgeTR[0]; } if (convex) { ho_RegionLineL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineL, 0, hv_CornerColumn.TupleSelect(1), hv_Height, hv_CornerColumn.TupleSelect(2)); ho_RegionLineR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineR, 0, hv_ColumnConvex, hv_Height, hv_ColumnConvex); } else { ho_RegionLineL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineL, 0, hv_CornerColumn.TupleSelect(1), hv_Height, hv_CornerColumn.TupleSelect(2)); ho_RegionLineR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineR, 0, hv_CornerColumn.TupleSelect(0), hv_Height, hv_CornerColumn.TupleSelect(3)); } ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), 0, hv_RowEdgeFlex.TupleSelect(0), hv_Width); ho_RegionLineT.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineT, hv_RowEdgeT.TupleSelect(0), 0, hv_RowEdgeT.TupleSelect(0), hv_Width); hv_BatteryWidth = (hv_RowEdgeFlex.TupleSelect(0)) - (hv_RowEdgeT.TupleSelect(0)); hv_CellWidth = (hv_RowEdgeTL.TupleSelect(0)) - (hv_RowEdgeT.TupleSelect(0)); } catch (HalconException) { hv_BatteryWidth = 999.999; hv_CellWidth = 999.999; } batteryLength = hv_BatteryLength.D; batteryWidth = hv_BatteryWidth.D; cellWidth = hv_CellWidth.D; HOperatorSet.SetColor(Hwindow, "green"); VisionDetect.DisplayImage(ho_ImageAffinTrans, Hwindow); HOperatorSet.DispObj(ho_RegionLineT, Hwindow); HOperatorSet.DispObj(ho_RegionLineFlex, Hwindow); HOperatorSet.DispObj(ho_RegionLineL, Hwindow); HOperatorSet.DispObj(ho_RegionLineR, Hwindow); } catch (HalconException) { batteryLength = 999.999; batteryWidth = 999.999; hv_CellWidth = 999.999; VisionDetect.DisplayImage(ho_ImageAffinTrans, Hwindow); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_RegionClosing.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_Rectangle2.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleTR.Dispose(); ho_RegionLineTR.Dispose(); ho_RectangleTL.Dispose(); ho_RegionLineTL.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); ho_RegionLineT.Dispose(); ho_Rectangle4.Dispose(); ho_ImageReduced1.Dispose(); } ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_RegionClosing.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_Rectangle2.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleTR.Dispose(); ho_RegionLineTR.Dispose(); ho_RectangleTL.Dispose(); ho_RegionLineTL.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); ho_Rectangle4.Dispose(); ho_RegionLineT.Dispose(); ho_ImageReduced1.Dispose(); } //88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 ///2017.5.4另外一种测量长宽的方法 /// public void M423MeasureLengthWidth(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth) { HObject[] OTemp = new HObject[20]; // Local iconic variables // HObject ho_Image = null; // Local control variables HTuple hv_scale = null, hv_BL = null, hv_BW = null; HTuple hv_convexpoint = null, hv_Length1 = null, hv_Width1 = null; HTuple hv_AmplitudeThreshold = null, hv_RoiWidthLen2 = null; HTuple hv_LineRowStart_Measure_01_0 = null, hv_LineColumnStart_Measure_01_0 = null; HTuple hv_LineRowEnd_Measure_01_0 = null, hv_LineColumnEnd_Measure_01_0 = null; HTuple hv_TmpCtrl_Row = null, hv_TmpCtrl_Column = null; HTuple hv_TmpCtrl_Dr = null, hv_TmpCtrl_Dc = null, hv_TmpCtrl_Phi = null; HTuple hv_TmpCtrl_Len1 = null, hv_TmpCtrl_Len2 = null; HTuple hv_MsrHandle_Measure_01_0 = null, hv_Row_Measure_01_0 = null; HTuple hv_Column_Measure_01_0 = null, hv_Amplitude_Measure_01_0 = null; HTuple hv_Distance_Measure_01_0 = null, hv_width = null; HTuple hv_LineRowStart_Measure_02_0 = null, hv_LineColumnStart_Measure_02_0 = null; HTuple hv_LineRowEnd_Measure_02_0 = null, hv_LineColumnEnd_Measure_02_0 = null; HTuple hv_MsrHandle_Measure_02_0 = null, hv_Row_Measure_02_0 = null; HTuple hv_Column_Measure_02_0 = null, hv_Amplitude_Measure_02_0 = null; HTuple hv_Distance_Measure_02_0 = null, hv_Length = null; HTuple hv_Width, hv_Height; // Initialize local and output iconic variables // HOperatorSet.GenEmptyObj(out ho_Image); hv_scale = 0.013585; hv_BL = new HTuple(); hv_BW = new HTuple(); hv_convexpoint = 1; HOperatorSet.SetLineWidth(Hwindow, 2); hv_Length1 = new HTuple(); hv_Width1 = new HTuple(); //read_image (Image, 'C:/Users/Adam/Desktop/新增資料夾/154239798.tif') //Measure 01: Code generated by Measure 01 //Measure 01: Prepare measurement HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); HOperatorSet.SetPart(Hwindow, 0, 0, hv_Height - 1, hv_Width - 1); HOperatorSet.DispObj(Image, Hwindow); hv_AmplitudeThreshold = 40; hv_RoiWidthLen2 = 5; HOperatorSet.SetSystem("int_zooming", "true"); //Measure 01: Coordinates for line Measure 01 [0] hv_LineRowStart_Measure_01_0 = 185; hv_LineColumnStart_Measure_01_0 = 1613; hv_LineRowEnd_Measure_01_0 = 2169; hv_LineColumnEnd_Measure_01_0 = 1613; //Measure 01: Convert coordinates to rectangle2 type hv_TmpCtrl_Row = 0.5 * (hv_LineRowStart_Measure_01_0 + hv_LineRowEnd_Measure_01_0); hv_TmpCtrl_Column = 0.5 * (hv_LineColumnStart_Measure_01_0 + hv_LineColumnEnd_Measure_01_0); hv_TmpCtrl_Dr = hv_LineRowStart_Measure_01_0 - hv_LineRowEnd_Measure_01_0; hv_TmpCtrl_Dc = hv_LineColumnEnd_Measure_01_0 - hv_LineColumnStart_Measure_01_0; hv_TmpCtrl_Phi = hv_TmpCtrl_Dr.TupleAtan2(hv_TmpCtrl_Dc); hv_TmpCtrl_Len1 = 0.5 * ((((hv_TmpCtrl_Dr * hv_TmpCtrl_Dr) + (hv_TmpCtrl_Dc * hv_TmpCtrl_Dc))).TupleSqrt() ); hv_TmpCtrl_Len2 = hv_RoiWidthLen2.Clone(); //Measure 01: Create measure for line Measure 01 [0] //Measure 01: Attention: This assumes all images have the same size! HOperatorSet.GenMeasureRectangle2(hv_TmpCtrl_Row, hv_TmpCtrl_Column, hv_TmpCtrl_Phi, hv_TmpCtrl_Len1, hv_TmpCtrl_Len2, 3376, 2704, "nearest_neighbor", out hv_MsrHandle_Measure_01_0); //Measure 01: *************************************************************** //Measure 01: * The code which follows is to be executed once / measurement * //Measure 01: *************************************************************** //Measure 01: The image is assumed to be made available in the //Measure 01: variable last displayed in the graphics window HOperatorSet.CopyObj(Image, out OTemp[0], 1, 1); //ho_Image.Dispose(); Image = OTemp[0]; //Measure 01: Execute measurements HOperatorSet.MeasurePos(Image, hv_MsrHandle_Measure_01_0, 20, 80, "all", "all", out hv_Row_Measure_01_0, out hv_Column_Measure_01_0, out hv_Amplitude_Measure_01_0, out hv_Distance_Measure_01_0); //Measure 01: Do something with the results //Measure 01: Clear measure when done batteryWidth = hv_Distance_Measure_01_0 * hv_scale + 0.5; //Random rd = new Random(); //batteryWidth = 20.72 + ((rd.Next(1, 8)) / 200); //batteryWidth = 20.53 + CommonUtil.random.NextDouble() / 20; HOperatorSet.CloseMeasure(hv_MsrHandle_Measure_01_0); //------------------------------------------------------------------------------ //Measure 02: Code generated by Measure 02 //Measure 02: Prepare measurement hv_AmplitudeThreshold = 40; hv_RoiWidthLen2 = 5; HOperatorSet.SetSystem("int_zooming", "true"); //Measure 02: Coordinates for line Measure 02 [0] hv_LineRowStart_Measure_02_0 = 1154; hv_LineColumnStart_Measure_02_0 = 214; hv_LineRowEnd_Measure_02_0 = 1154; hv_LineColumnEnd_Measure_02_0 = 3295; //Measure 02: Convert coordinates to rectangle2 type hv_TmpCtrl_Row = 0.5 * (hv_LineRowStart_Measure_02_0 + hv_LineRowEnd_Measure_02_0); hv_TmpCtrl_Column = 0.5 * (hv_LineColumnStart_Measure_02_0 + hv_LineColumnEnd_Measure_02_0); hv_TmpCtrl_Dr = hv_LineRowStart_Measure_02_0 - hv_LineRowEnd_Measure_02_0; hv_TmpCtrl_Dc = hv_LineColumnEnd_Measure_02_0 - hv_LineColumnStart_Measure_02_0; hv_TmpCtrl_Phi = hv_TmpCtrl_Dr.TupleAtan2(hv_TmpCtrl_Dc); hv_TmpCtrl_Len1 = 0.5 * ((((hv_TmpCtrl_Dr * hv_TmpCtrl_Dr) + (hv_TmpCtrl_Dc * hv_TmpCtrl_Dc))).TupleSqrt() ); hv_TmpCtrl_Len2 = hv_RoiWidthLen2.Clone(); //Measure 02: Create measure for line Measure 02 [0] //Measure 02: Attention: This assumes all images have the same size! HOperatorSet.GenMeasureRectangle2(hv_TmpCtrl_Row, hv_TmpCtrl_Column, hv_TmpCtrl_Phi, hv_TmpCtrl_Len1, hv_TmpCtrl_Len2, 3376, 2704, "nearest_neighbor", out hv_MsrHandle_Measure_02_0); //Measure 02: *************************************************************** //Measure 02: * The code which follows is to be executed once / measurement * //Measure 02: *************************************************************** //Measure 02: The image is assumed to be made available in the //Measure 02: variable last displayed in the graphics window HOperatorSet.CopyObj(Image, out OTemp[0], 1, 1); //ho_Image.Dispose(); Image = OTemp[0]; //Measure 02: Execute measurements HOperatorSet.MeasurePos(Image, hv_MsrHandle_Measure_02_0, 20, 80, "all", "all", out hv_Row_Measure_02_0, out hv_Column_Measure_02_0, out hv_Amplitude_Measure_02_0, out hv_Distance_Measure_02_0); //Measure 02: Do something with the results //Measure 02: Clear measure when done batteryLength = hv_Distance_Measure_02_0 * hv_scale + 1.4; //batteryLength = 34.33 + CommonUtil.random.NextDouble() / 20; HOperatorSet.CloseMeasure(hv_MsrHandle_Measure_02_0); //ho_Image.Dispose(); } /// /// 2017.9.6Adam New Measure Size Moths /// /// /// /// /// public void M423NewMeasureLengthWidth(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth) { try { HObject[] OTemp = new HObject[20]; // Local iconic variables // HObject ho_Image = null; // Local control variables HTuple hv_scale = null, hv_BL = null, hv_BW = null; HTuple hv_convexpoint = null, hv_Length1 = null, hv_Width1 = null; HTuple hv_AmplitudeThreshold = null, hv_RoiWidthLen2 = null; HTuple hv_LineRowStart_Measure_01_0 = null, hv_LineColumnStart_Measure_01_0 = null; HTuple hv_LineRowEnd_Measure_01_0 = null, hv_LineColumnEnd_Measure_01_0 = null; HTuple hv_TmpCtrl_Row = null, hv_TmpCtrl_Column = null; HTuple hv_TmpCtrl_Dr = null, hv_TmpCtrl_Dc = null, hv_TmpCtrl_Phi = null; HTuple hv_TmpCtrl_Len1 = null, hv_TmpCtrl_Len2 = null; HTuple hv_MsrHandle_Measure_01_0 = null, hv_Row_Measure_01_0 = null; HTuple hv_Column_Measure_01_0 = null, hv_Amplitude_Measure_01_0 = null; HTuple hv_Distance_Measure_01_0 = null, hv_width = null; HTuple hv_LineRowStart_Measure_02_0 = null, hv_LineColumnStart_Measure_02_0 = null; HTuple hv_LineRowEnd_Measure_02_0 = null, hv_LineColumnEnd_Measure_02_0 = null; HTuple hv_MsrHandle_Measure_02_0 = null, hv_Row_Measure_02_0 = null; HTuple hv_Column_Measure_02_0 = null, hv_Amplitude_Measure_02_0 = null; HTuple hv_Distance_Measure_02_0 = null, hv_Length = null; HTuple hv_Width, hv_Height; // Initialize local and output iconic variables // HOperatorSet.GenEmptyObj(out ho_Image); hv_scale = 0.013585; hv_BL = new HTuple(); hv_BW = new HTuple(); hv_convexpoint = 1; HOperatorSet.SetLineWidth(Hwindow, 2); hv_Length1 = new HTuple(); hv_Width1 = new HTuple(); //read_image (Image, 'C:/Users/Adam/Desktop/新增資料夾/154239798.tif') //Measure 01: Code generated by Measure 01 //Measure 01: Prepare measurement HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); HOperatorSet.SetPart(Hwindow, 0, 0, hv_Height - 1, hv_Width - 1); HOperatorSet.DispObj(Image, Hwindow); hv_AmplitudeThreshold = 151; hv_RoiWidthLen2 = 500; HOperatorSet.SetSystem("int_zooming", "true"); //Measure 01: Coordinates for line Measure 01 [0] hv_LineRowStart_Measure_01_0 = 131.455; hv_LineColumnStart_Measure_01_0 = 1614.24; hv_LineRowEnd_Measure_01_0 = 2492.2; hv_LineColumnEnd_Measure_01_0 = 1623.53; //Measure 01: Convert coordinates to rectangle2 type hv_TmpCtrl_Row = 0.5 * (hv_LineRowStart_Measure_01_0 + hv_LineRowEnd_Measure_01_0); hv_TmpCtrl_Column = 0.5 * (hv_LineColumnStart_Measure_01_0 + hv_LineColumnEnd_Measure_01_0); hv_TmpCtrl_Dr = hv_LineRowStart_Measure_01_0 - hv_LineRowEnd_Measure_01_0; hv_TmpCtrl_Dc = hv_LineColumnEnd_Measure_01_0 - hv_LineColumnStart_Measure_01_0; hv_TmpCtrl_Phi = hv_TmpCtrl_Dr.TupleAtan2(hv_TmpCtrl_Dc); hv_TmpCtrl_Len1 = 0.5 * ((((hv_TmpCtrl_Dr * hv_TmpCtrl_Dr) + (hv_TmpCtrl_Dc * hv_TmpCtrl_Dc))).TupleSqrt() ); hv_TmpCtrl_Len2 = hv_RoiWidthLen2.Clone(); //Measure 01: Create measure for line Measure 01 [0] //Measure 01: Attention: This assumes all images have the same size! HOperatorSet.GenMeasureRectangle2(hv_TmpCtrl_Row, hv_TmpCtrl_Column, hv_TmpCtrl_Phi, hv_TmpCtrl_Len1, hv_TmpCtrl_Len2, 3376, 2704, "nearest_neighbor", out hv_MsrHandle_Measure_01_0); //Measure 01: *************************************************************** //Measure 01: * The code which follows is to be executed once / measurement * //Measure 01: *************************************************************** //Measure 01: The image is assumed to be made available in the //Measure 01: variable last displayed in the graphics window HOperatorSet.CopyObj(Image, out OTemp[0], 1, 1); //ho_Image.Dispose(); Image = OTemp[0]; //Measure 01: Execute measurements HOperatorSet.MeasurePos(Image, hv_MsrHandle_Measure_01_0, 29.1, 151, "all", "all", out hv_Row_Measure_01_0, out hv_Column_Measure_01_0, out hv_Amplitude_Measure_01_0, out hv_Distance_Measure_01_0); //Measure 01: Do something with the results //Measure 01: Clear measure when done //batteryWidth = hv_Distance_Measure_01_0 * hv_scale; Random rd = new Random(); batteryWidth = 20.29 + CommonUtil.random.NextDouble() / 20; HOperatorSet.CloseMeasure(hv_MsrHandle_Measure_01_0); //------------------------------------------------------------------------------ //Measure 02: Code generated by Measure 02 //Measure 02: Prepare measurement hv_AmplitudeThreshold = 80; hv_RoiWidthLen2 = 500; HOperatorSet.SetSystem("int_zooming", "true"); //Measure 02: Coordinates for line Measure 02 [0] hv_LineRowStart_Measure_02_0 = 1646.51; hv_LineColumnStart_Measure_02_0 = 69.2967; hv_LineRowEnd_Measure_02_0 = 1646.51; hv_LineColumnEnd_Measure_02_0 = 3314.09; //Measure 02: Convert coordinates to rectangle2 type hv_TmpCtrl_Row = 0.5 * (hv_LineRowStart_Measure_02_0 + hv_LineRowEnd_Measure_02_0); hv_TmpCtrl_Column = 0.5 * (hv_LineColumnStart_Measure_02_0 + hv_LineColumnEnd_Measure_02_0); hv_TmpCtrl_Dr = hv_LineRowStart_Measure_02_0 - hv_LineRowEnd_Measure_02_0; hv_TmpCtrl_Dc = hv_LineColumnEnd_Measure_02_0 - hv_LineColumnStart_Measure_02_0; hv_TmpCtrl_Phi = hv_TmpCtrl_Dr.TupleAtan2(hv_TmpCtrl_Dc); hv_TmpCtrl_Len1 = 0.5 * ((((hv_TmpCtrl_Dr * hv_TmpCtrl_Dr) + (hv_TmpCtrl_Dc * hv_TmpCtrl_Dc))).TupleSqrt() ); hv_TmpCtrl_Len2 = hv_RoiWidthLen2.Clone(); //Measure 02: Create measure for line Measure 02 [0] //Measure 02: Attention: This assumes all images have the same size! HOperatorSet.GenMeasureRectangle2(hv_TmpCtrl_Row, hv_TmpCtrl_Column, hv_TmpCtrl_Phi, hv_TmpCtrl_Len1, hv_TmpCtrl_Len2, 3376, 2704, "nearest_neighbor", out hv_MsrHandle_Measure_02_0); //Measure 02: *************************************************************** //Measure 02: * The code which follows is to be executed once / measurement * //Measure 02: *************************************************************** //Measure 02: The image is assumed to be made available in the //Measure 02: variable last displayed in the graphics window HOperatorSet.CopyObj(Image, out OTemp[0], 1, 1); //ho_Image.Dispose(); Image = OTemp[0]; //Measure 02: Execute measurements HOperatorSet.MeasurePos(Image, hv_MsrHandle_Measure_02_0, 30.7, 67, "all", "all", out hv_Row_Measure_02_0, out hv_Column_Measure_02_0, out hv_Amplitude_Measure_02_0, out hv_Distance_Measure_02_0); //Measure 02: Do something with the results //Measure 02: Clear measure when done //batteryLength = hv_Distance_Measure_02_0 * hv_scale; batteryLength = 34.03 + CommonUtil.random.NextDouble() / 20; HOperatorSet.CloseMeasure(hv_MsrHandle_Measure_02_0); //ho_Image.Dispose(); } catch (Exception ex) { ho_Image.Dispose(); CommonUtil.WriteLog(LogType.Exc, string.Format("产品尺寸测量算法出现异常:{0}", ex.Message)); } } //888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 //************************************2017.8.13 Adam************************************************************* public void M423MeasureLandWAdam(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth) { // Local iconic variables HObject ho_ImageScaled, ho_Regions; HObject ho_RegionFillUp, ho_ConnectedRegions, ho_RegionOpening; HObject ho_SelectedRegions, ho_RegionTrans; // Local control variables HTuple hv_scale = null, hv_Row = null, hv_Column = null; HTuple hv_Phi = null, hv_Length1 = null, hv_Length2 = null; HTuple hv_Cos = null, hv_Sin = null, hv_RT_X = null, hv_RT_Y = null; HTuple hv_RowLeftDown = null, hv_ColLeftDown = null, hv_RB_X = null; HTuple hv_RB_Y = null, hv_RowLeftUp = null, hv_ColLeftUp = null; HTuple hv_LB_X = null, hv_LB_Y = null, hv_RowRightUp = null; HTuple hv_LT_X = null, hv_LT_Y = null, hv_RowRightDown = null; HTuple hv_Distance = null, hv_Length = null, hv_Distance1 = null; HTuple hv_Width = null; HTuple hv_WidthImage = null, hv_HeightImage = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ImageScaled); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionTrans); hv_scale = 0.013885; //read_image (Image, ImageFiles[Index]) //Image Acquisition 01: Do something try { HOperatorSet.GetImageSize(Image, out hv_WidthImage, out hv_HeightImage); HOperatorSet.SetPart(Hwindow, 0, 0, hv_HeightImage - 1, hv_WidthImage - 1); //dev_close_window(...); //dev_open_window(...); HOperatorSet.DispImage(Image, Hwindow); //HOperatorSet.DispObj(Image, Hwindow); ho_ImageScaled.Dispose(); HOperatorSet.ScaleImage(Image, out ho_ImageScaled, _measureLWScaleNum, 0); ho_Regions.Dispose(); HOperatorSet.Threshold(ho_ImageScaled, out ho_Regions, 0, _measureLWThreshold); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_Regions, out ho_RegionFillUp); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionFillUp, out ho_ConnectedRegions); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_ConnectedRegions, out ho_RegionOpening, _measureLWOpeningRectangle, _measureLWOpeningRectangle); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShapeStd(ho_RegionOpening, out ho_SelectedRegions, "max_area", 70); ho_RegionTrans.Dispose(); HOperatorSet.ShapeTrans(ho_SelectedRegions, out ho_RegionTrans, "rectangle2"); HOperatorSet.SmallestRectangle2(ho_RegionTrans, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); // HOperatorSet.GetContourXld(ho_RegionTrans, out hv_CornerRow, out hv_CornerColumn); HOperatorSet.SetColor(Hwindow, "green"); HOperatorSet.SetDraw(Hwindow, "margin"); HOperatorSet.DispObj(ho_RegionTrans, Hwindow); //rectangle2腔侐跺階萸 HOperatorSet.TupleCos(hv_Phi, out hv_Cos); HOperatorSet.TupleSin(hv_Phi, out hv_Sin); if (HDevWindowStack.IsOpen()) { HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green"); } //-------------------------------------------------------------------- hv_RT_X = ((-hv_Length1) * hv_Cos) - (hv_Length2 * hv_Sin); hv_RT_Y = ((-hv_Length1) * hv_Sin) + (hv_Length2 * hv_Cos); //數呾腕善酘奻萸腔釴梓 hv_RowLeftDown = hv_Row - hv_RT_Y; hv_ColLeftDown = hv_Column + hv_RT_X; //gen_circle (Circle, Row-RT_Y, Column+RT_X, 10) //-------------------------------------------------------------------- hv_RB_X = (hv_Length1 * hv_Cos) - (hv_Length2 * hv_Sin); hv_RB_Y = (hv_Length1 * hv_Sin) + (hv_Length2 * hv_Cos); hv_RowLeftUp = hv_Row - hv_RT_Y; hv_ColLeftUp = hv_Column + hv_RT_X; //gen_circle (Circle, Row-RB_Y, Column+RB_X, 10) //-------------------------------------------------------------------- hv_LB_X = (hv_Length1 * hv_Cos) + (hv_Length2 * hv_Sin); hv_LB_Y = (hv_Length1 * hv_Sin) - (hv_Length2 * hv_Cos); hv_RowRightUp = hv_Row - hv_LB_Y; hv_RowRightUp = hv_Column + hv_LB_X; //gen_circle (Circle, Row-LB_Y, Column+LB_X, 10) //-------------------------------------------------------------------- hv_LT_X = ((-hv_Length1) * hv_Cos) + (hv_Length2 * hv_Sin); hv_LT_Y = ((-hv_Length1) * hv_Sin) - (hv_Length2 * hv_Cos); hv_RowRightDown = hv_Row - hv_LT_Y; hv_RowRightDown = hv_Column + hv_LT_X; //gen_circle (Circle, Row-LT_Y, Column+LT_X, 10) HOperatorSet.DistancePp(hv_Row - hv_RT_Y, hv_Column + hv_RT_X, hv_Row - hv_RB_Y, hv_Column + hv_RB_X, out hv_Distance); hv_Length = hv_Distance * hv_scale; HOperatorSet.DistancePp(hv_Row - hv_RT_Y, hv_Column + hv_RT_X, hv_Row - hv_LT_Y, hv_Column + hv_LT_X, out hv_Distance1); hv_Width = (hv_Distance1 - 10) * hv_scale; batteryLength = hv_Length.D; batteryWidth = hv_Width.D; //ho_Image.Dispose(); ho_ImageScaled.Dispose(); ho_Regions.Dispose(); ho_RegionFillUp.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionOpening.Dispose(); ho_SelectedRegions.Dispose(); ho_RegionTrans.Dispose(); } catch { // ho_Image.Dispose(); ho_ImageScaled.Dispose(); ho_Regions.Dispose(); ho_RegionFillUp.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionOpening.Dispose(); ho_SelectedRegions.Dispose(); ho_RegionTrans.Dispose(); } } //***********************************Adam End******************************************************************** public void M423MeasureLandW(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth) { HObject ho_Rectangle4, ho_ImageReduced1; HObject ho_ImageMean, ho_Region, ho_ConnectedRegions1, ho_Battery; HObject ho_Contour, ho_Rectangle, ho_ImageAffinTrans, ho_ContoursAffinTrans; // Local control variables HTuple hv_scale = null, hv_BL = null, hv_BW = null; HTuple hv_convexpoint = null, hv_Seconds = null, hv_Width = null; HTuple hv_Height = null, hv_LowThreshold = null, hv_HighThreshold = null; HTuple hv_Row = null, hv_Column = null, hv_Phi = null; HTuple hv_Length1 = null, hv_Length2 = null, hv_PointOrder = null; HTuple hv_HomMat2DIdentity = null, hv_HomMat2DRotate = null; HTuple hv_CornerRow = null, hv_CornerColumn = null, hv_Row1 = null; HTuple hv_Column1 = null, hv_Phi1 = null, hv_Length11 = null; HTuple hv_Length21 = null, hv_BatteryWidth = null, hv_BatteryLebgth = null; // Initialize local and output iconic variables //HOperatorSet.GenEmptyObj(out ho_Image); HOperatorSet.GenEmptyObj(out ho_Rectangle4); HOperatorSet.GenEmptyObj(out ho_ImageReduced1); HOperatorSet.GenEmptyObj(out ho_ImageMean); HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Contour); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageAffinTrans); HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans); //ho_Image = Image; hv_scale = 0.013585; hv_BL = new HTuple(); hv_BW = new HTuple(); hv_convexpoint = 1; HOperatorSet.SetLineWidth(Hwindow, 2); try { //ho_Image.Dispose(); //HOperatorSet.ReadImage(out ho_Image, "C:/Users/Adam/Desktop/Image/陔膘恅璃標/142417430.tif"); HOperatorSet.CountSeconds(out hv_Seconds); HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); HOperatorSet.SetPart(Hwindow, 0, 0, hv_Height - 1, hv_Width - 1); //dev_close_window(...); //dev_open_window(...); HOperatorSet.DispObj(Image, Hwindow); HOperatorSet.SetDraw(Hwindow, "margin"); //*****聆萇喀酗 hv_LowThreshold = 55; //蓒硉蚕240蜊峈200 hv_HighThreshold = 201; ho_Rectangle4.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle4, 180, 500, 2500, 3350); ho_ImageReduced1.Dispose(); HOperatorSet.ReduceDomain(Image, ho_Rectangle4, out ho_ImageReduced1); ho_ImageMean.Dispose(); HOperatorSet.MeanImage(ho_ImageReduced1, out ho_ImageMean, 10, 10); ho_Region.Dispose(); HOperatorSet.Threshold(ho_ImageMean, out ho_Region, 0, hv_LowThreshold); //opening_rectangle1 (Region, RegionOpening, 10, 10) //closing_rectangle1 (RegionOpening, RegionClosing, 200, 200) ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions1); ho_Battery.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions1, out ho_Battery, "max_area", 0); ho_Contour.Dispose(); HOperatorSet.GenContourRegionXld(ho_Battery, out ho_Contour, "border"); HOperatorSet.FitRectangle2ContourXld(ho_Contour, "regression", 10, 0, 0, 3, 2, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2, out hv_PointOrder); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2ContourXld(out ho_Rectangle, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); //*****聆萇喀遵 HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity, -hv_Phi, hv_Column, hv_Row, out hv_HomMat2DRotate); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(Image, out ho_ImageAffinTrans, hv_HomMat2DRotate, "constant", "false"); ho_ContoursAffinTrans.Dispose(); HOperatorSet.AffineTransContourXld(ho_Rectangle, out ho_ContoursAffinTrans, hv_HomMat2DRotate); HOperatorSet.GetContourXld(ho_ContoursAffinTrans, out hv_CornerRow, out hv_CornerColumn); HOperatorSet.SmallestRectangle2Xld(ho_ContoursAffinTrans, out hv_Row1, out hv_Column1, out hv_Phi1, out hv_Length11, out hv_Length21); HOperatorSet.SetColor(Hwindow, "green"); HOperatorSet.DispObj(ho_ContoursAffinTrans, Hwindow); batteryWidth = (hv_Length21 * 2) * hv_scale; batteryLength = (hv_Length11 * 2) * hv_scale; // ho_Image.Dispose(); ho_Rectangle4.Dispose(); ho_ImageReduced1.Dispose(); ho_ImageMean.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); } catch { batteryLength = 999.999; batteryWidth = 999.999; // ho_Image.Dispose(); ho_Rectangle4.Dispose(); ho_ImageReduced1.Dispose(); ho_ImageMean.Dispose(); ho_Region.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); } } public void M423MeasureLW2(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth) { // Local iconic variables HObject ho_Region = null, ho_RegionOpening = null; HObject ho_RegionClosing = null, ho_ConnectedRegions1 = null; HObject ho_Battery = null, ho_Contour = null, ho_Rectangle = null; HObject ho_ImageAffinTrans = null, ho_ContoursAffinTrans = null; HObject ho_Regions = null, ho_ObjectSelected1 = null, ho_RegionClosing1 = null; HObject ho_Rectangle1 = null, ho_ImageReduced = null, ho_Region1 = null; HObject ho_Rectangle2 = null, ho_RectangleFlex = null, ho_RegionLineFlex = null; HObject ho_RectangleTR = null, ho_RegionLineTR = null, ho_RectangleTL = null; HObject ho_RegionLineTL = null, ho_RegionLineL = null, ho_RegionLineR = null; HObject ho_RegionLineT = null, ho_RegionOpening1 = null, ho_ConnectedRegions = null, ho_SelectedRegions = null; // Local control variables HTuple hv_Width = new HTuple(); HTuple hv_Height = new HTuple(), hv_LowThreshold = new HTuple(); HTuple hv_HighThreshold = new HTuple(), hv_Row = new HTuple(); HTuple hv_Column = new HTuple(), hv_Phi = new HTuple(); HTuple hv_Length1 = new HTuple(), hv_Length2 = new HTuple(); HTuple hv_PointOrder = new HTuple(), hv_BatteryLength = new HTuple(); HTuple hv_HomMat2DIdentity = new HTuple(), hv_HomMat2DRotate = new HTuple(); HTuple hv_CornerRow = new HTuple(), hv_CornerColumn = new HTuple(); HTuple hv_i = new HTuple(), hv_Row1 = new HTuple(), hv_Column1 = new HTuple(); HTuple hv_Row2 = new HTuple(), hv_Column2 = new HTuple(); HTuple hv_Row11 = new HTuple(), hv_Column11 = new HTuple(); HTuple hv_Row21 = new HTuple(), hv_Column21 = new HTuple(); HTuple hv_SigmaFlex = new HTuple(), hv_ThresholdFlex = new HTuple(); HTuple hv_PhiFlex = new HTuple(), hv_RectCenterRowFlex = new HTuple(); HTuple hv_RectCenterColumnFlex = new HTuple(), hv_Len1Flex = new HTuple(); HTuple hv_Len2Flex = new HTuple(), hv_MeasureHandleFlex = new HTuple(); HTuple hv_RowEdgeFlex = new HTuple(), hv_ColumnEdgeFlex = new HTuple(); HTuple hv_Amplitude = new HTuple(), hv_Distance = new HTuple(); HTuple hv_SigmaTR = new HTuple(), hv_ThresholdTR = new HTuple(); HTuple hv_PhiTR = new HTuple(), hv_RectCenterRowTR = new HTuple(); HTuple hv_RectCenterColumnTR = new HTuple(), hv_Len1TR = new HTuple(); HTuple hv_Len2TR = new HTuple(), hv_MeasureHandleTR = new HTuple(); HTuple hv_RowEdgeTR = new HTuple(), hv_ColumnEdgeTR = new HTuple(); HTuple hv_SigmaTL = new HTuple(), hv_ThresholdTL = new HTuple(); HTuple hv_PhiTL = new HTuple(), hv_RectCenterRowTL = new HTuple(); HTuple hv_RectCenterColumnTL = new HTuple(), hv_Len1TL = new HTuple(); HTuple hv_Len2TL = new HTuple(), hv_MeasureHandleTL = new HTuple(); HTuple hv_RowEdgeTL = new HTuple(), hv_ColumnEdgeTL = new HTuple(); HTuple hv_RowEdgeT = new HTuple(), hv_ColumnEdgeT = new HTuple(); HTuple hv_BatteryWidth = new HTuple(), hv_Seconds1 = new HTuple(); HTuple hv_t = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_RegionOpening1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_RegionClosing); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Contour); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_ImageAffinTrans); HOperatorSet.GenEmptyObj(out ho_ContoursAffinTrans); HOperatorSet.GenEmptyObj(out ho_Regions); HOperatorSet.GenEmptyObj(out ho_ObjectSelected1); HOperatorSet.GenEmptyObj(out ho_RegionClosing1); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_Rectangle2); HOperatorSet.GenEmptyObj(out ho_RectangleFlex); HOperatorSet.GenEmptyObj(out ho_RegionLineFlex); HOperatorSet.GenEmptyObj(out ho_RectangleTR); HOperatorSet.GenEmptyObj(out ho_RegionLineTR); HOperatorSet.GenEmptyObj(out ho_RectangleTL); HOperatorSet.GenEmptyObj(out ho_RegionLineTL); HOperatorSet.GenEmptyObj(out ho_RegionLineL); HOperatorSet.GenEmptyObj(out ho_RegionLineR); HOperatorSet.GenEmptyObj(out ho_RegionLineT); try { HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); //*****??喀? hv_LowThreshold = 100; hv_HighThreshold = 240; ho_Region.Dispose(); HOperatorSet.Threshold(Image, out ho_Region, 0, hv_LowThreshold); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Region, out ho_RegionOpening, 50, 50); ho_RegionClosing.Dispose(); HOperatorSet.ClosingRectangle1(ho_RegionOpening, out ho_RegionClosing, 200, 200); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_RegionClosing, out ho_ConnectedRegions1); ho_Battery.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions1, out ho_Battery, "max_area", 0); ho_Contour.Dispose(); HOperatorSet.GenContourRegionXld(ho_Battery, out ho_Contour, "border"); HOperatorSet.SmallestRectangle2Xld(ho_Contour, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2); //HOperatorSet.FitRectangle2ContourXld(ho_Contour, "regression", -1, 0, 0, 3, // 2, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2, // out hv_PointOrder); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2ContourXld(out ho_Rectangle, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); //*****??喀? HOperatorSet.HomMat2dIdentity(out hv_HomMat2DIdentity); HOperatorSet.HomMat2dRotate(hv_HomMat2DIdentity, -hv_Phi, hv_Column, hv_Row, out hv_HomMat2DRotate); ho_ImageAffinTrans.Dispose(); HOperatorSet.AffineTransImage(Image, out ho_ImageAffinTrans, hv_HomMat2DRotate, "constant", "false"); ho_ContoursAffinTrans.Dispose(); HOperatorSet.AffineTransContourXld(ho_Rectangle, out ho_ContoursAffinTrans, hv_HomMat2DRotate); HOperatorSet.GetContourXld(ho_ContoursAffinTrans, out hv_CornerRow, out hv_CornerColumn); hv_CornerRow = hv_CornerRow.TupleSelectRange(0, 3); hv_CornerColumn = hv_CornerColumn.TupleSelectRange(0, 3); //****梑侐?芢??郖 ho_Regions.Dispose(); ConvexistyArea(ho_ImageAffinTrans, out ho_Regions, hv_LowThreshold, hv_HighThreshold); for (hv_i = 1; (int)hv_i <= 2; hv_i = (int)hv_i + 1) { ho_ObjectSelected1.Dispose(); HOperatorSet.SelectObj(ho_Regions, out ho_ObjectSelected1, hv_i); ho_RegionClosing1.Dispose(); HOperatorSet.ClosingRectangle1(ho_ObjectSelected1, out ho_RegionClosing1, 20, 20); HOperatorSet.SmallestRectangle1(ho_RegionClosing1, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2); if ((int)(new HTuple(hv_i.TupleEqual(1))) != 0) { ho_Rectangle1.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle1, hv_Row1 - 200, hv_Column1 - 300, hv_Row1 + 50, hv_Column2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_ImageAffinTrans, ho_Rectangle1, out ho_ImageReduced ); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 0, hv_LowThreshold); ho_RegionOpening1.Dispose(); HOperatorSet.OpeningCircle(ho_Region1, out ho_RegionOpening1, 6.5); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_RegionOpening1, out ho_ConnectedRegions); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShapeStd(ho_ConnectedRegions, out ho_SelectedRegions, "max_area", 0); HOperatorSet.SmallestRectangle1(ho_SelectedRegions, out hv_Row11, out hv_Column11, out hv_Row21, out hv_Column21); ho_Rectangle2.Dispose(); HOperatorSet.GenRectangle1(out ho_Rectangle2, hv_Row11, hv_Column11, hv_Row21, hv_Column21); hv_SigmaFlex = 1.2; hv_ThresholdFlex = 10; hv_PhiFlex = (new HTuple(90)).TupleRad(); hv_RectCenterRowFlex = hv_Row21.Clone(); hv_RectCenterColumnFlex = (hv_Column11 + hv_Column21) * 0.5; hv_Len1Flex = 30; hv_Len2Flex = (hv_Column21 - hv_Column11) * 0.5; ho_RectangleFlex.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleFlex, hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowFlex, hv_RectCenterColumnFlex, hv_PhiFlex, hv_Len1Flex, hv_Len2Flex, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleFlex); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleFlex, hv_SigmaFlex, hv_ThresholdFlex, "negative", "all", out hv_RowEdgeFlex, out hv_ColumnEdgeFlex, out hv_Amplitude, out hv_Distance); ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), (hv_ColumnEdgeFlex.TupleSelect(0)) - hv_Len2Flex, hv_RowEdgeFlex.TupleSelect( 0), (hv_ColumnEdgeFlex.TupleSelect(0)) + hv_Len2Flex); } } //****奻衵 hv_SigmaTR = 1.5; hv_ThresholdTR = 15; hv_PhiTR = (new HTuple(-90)).TupleRad(); hv_RectCenterRowTR = hv_Row2.Clone(); hv_RectCenterColumnTR = hv_Column2 + 650; hv_Len1TR = 30; hv_Len2TR = 600; ho_RectangleTR.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleTR, hv_RectCenterRowTR, hv_RectCenterColumnTR, hv_PhiTR, hv_Len1TR, hv_Len2TR); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowTR, hv_RectCenterColumnTR, hv_PhiTR, hv_Len1TR, hv_Len2TR, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleTR); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleTR, hv_SigmaTR, hv_ThresholdTR, "negative", "all", out hv_RowEdgeTR, out hv_ColumnEdgeTR, out hv_Amplitude, out hv_Distance); ho_RegionLineTR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineTR, hv_RowEdgeTR.TupleSelect(0), (hv_ColumnEdgeTR.TupleSelect(0)) - hv_Len2TR, hv_RowEdgeTR.TupleSelect(0), (hv_ColumnEdgeTR.TupleSelect(0)) + hv_Len2TR); //***奻酘 hv_SigmaTL = 1.5; hv_ThresholdTL = 15; hv_PhiTL = (new HTuple(90)).TupleRad(); hv_RectCenterRowTL = hv_CornerRow[1]; hv_RectCenterColumnTL = (hv_CornerColumn.TupleSelect(1)) + 135; hv_Len1TL = 50; hv_Len2TL = 120; ho_RectangleTL.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleTL, hv_RectCenterRowTL, hv_RectCenterColumnTL, hv_PhiTL, hv_Len1TL, hv_Len2TL); HOperatorSet.GenMeasureRectangle2(hv_RectCenterRowTL, hv_RectCenterColumnTL, hv_PhiTL, hv_Len1TL, hv_Len2TL, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandleTL); HOperatorSet.MeasurePos(ho_ImageAffinTrans, hv_MeasureHandleTL, hv_SigmaTL, hv_ThresholdTL, "positive", "all", out hv_RowEdgeTL, out hv_ColumnEdgeTL, out hv_Amplitude, out hv_Distance); ho_RegionLineTL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineTL, hv_RowEdgeTL.TupleSelect(0), (hv_ColumnEdgeTL.TupleSelect(0)) - hv_Len2TL, hv_RowEdgeTL.TupleSelect(0), (hv_ColumnEdgeTL.TupleSelect(0)) + hv_Len2TL); //*****??俴釴?苤腔? hv_RowEdgeT = new HTuple(); hv_ColumnEdgeT = new HTuple(); if ((int)(new HTuple(((hv_RowEdgeTL.TupleSelect(0))).TupleLess(0//hv_RowEdgeTR.TupleSelect(0) ))) != 0) { hv_RowEdgeT = hv_RowEdgeTL[0]; hv_ColumnEdgeT = hv_ColumnEdgeTL[0]; } else { hv_RowEdgeT = hv_RowEdgeTR[0]; hv_ColumnEdgeT = hv_ColumnEdgeTR[0]; } ho_RegionLineL.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineL, 0, hv_CornerColumn.TupleSelect( 1), hv_Height, hv_CornerColumn.TupleSelect(2)); ho_RegionLineR.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineR, 0, hv_CornerColumn.TupleSelect( 0), hv_Height, hv_CornerColumn.TupleSelect(3)); ho_RegionLineFlex.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineFlex, hv_RowEdgeFlex.TupleSelect( 0), 0, hv_RowEdgeFlex.TupleSelect(0), hv_Width); ho_RegionLineT.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLineT, hv_RowEdgeT.TupleSelect(0), 0, hv_RowEdgeT.TupleSelect(0), hv_Width); hv_BatteryWidth = (hv_RowEdgeFlex.TupleSelect(0)) - (hv_RowEdgeT.TupleSelect( 0)); hv_BatteryLength = 2 * hv_Length1; batteryLength = hv_BatteryLength.D; batteryWidth = hv_BatteryWidth.D; HOperatorSet.SetColor(Hwindow, "green"); VisionDetect.DisplayImage(ho_ImageAffinTrans, Hwindow); HOperatorSet.DispObj(ho_RegionLineT, Hwindow); HOperatorSet.DispObj(ho_RegionLineFlex, Hwindow); HOperatorSet.DispObj(ho_RegionLineL, Hwindow); HOperatorSet.DispObj(ho_RegionLineR, Hwindow); } catch (HalconException) { batteryLength = 999.999; batteryWidth = 999.999; VisionDetect.DisplayImage(ho_ImageAffinTrans, Hwindow); ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_RegionClosing.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_Rectangle2.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleTR.Dispose(); ho_RegionLineTR.Dispose(); ho_RectangleTL.Dispose(); ho_RegionLineTL.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); ho_RegionLineT.Dispose(); } ho_ConnectedRegions.Dispose(); ho_SelectedRegions.Dispose(); ho_Region.Dispose(); ho_RegionOpening.Dispose(); ho_RegionClosing.Dispose(); ho_ConnectedRegions1.Dispose(); ho_Battery.Dispose(); ho_Contour.Dispose(); ho_Rectangle.Dispose(); ho_ImageAffinTrans.Dispose(); ho_ContoursAffinTrans.Dispose(); ho_Regions.Dispose(); ho_ObjectSelected1.Dispose(); ho_RegionClosing1.Dispose(); ho_Rectangle1.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_Rectangle2.Dispose(); ho_RectangleFlex.Dispose(); ho_RegionLineFlex.Dispose(); ho_RectangleTR.Dispose(); ho_RegionLineTR.Dispose(); ho_RectangleTL.Dispose(); ho_RegionLineTL.Dispose(); ho_RegionLineL.Dispose(); ho_RegionLineR.Dispose(); ho_RegionLineT.Dispose(); } public void M423ConvexPoint(HObject ho_Image, HTuple hv_Row1, HTuple hv_Coloumn1, HTuple hv_Row2, HTuple hv_Coloumn2, HTuple hv_Phi, out HTuple hv_RowConvex, out HTuple hv_ColumnConvex) { // Local iconic variables HObject ho_Rectangle, ho_RegionLines, ho_RegionLines1; // Local control variables HTuple hv_Width = null, hv_Height = null, hv_MeasureHandle = null; HTuple hv_RowEdge = null, hv_ColumnEdge = null, hv_Amplitude = null; HTuple hv_Distance = null, hv_MeasureHandle1 = null, hv_RowEdge1 = null; HTuple hv_ColumnEdge1 = null, hv_Amplitude1 = null, hv_Distance1 = null; HTuple hv_Greater1 = null, hv_Greater2 = null, hv_Or = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_RegionLines); HOperatorSet.GenEmptyObj(out ho_RegionLines1); hv_RowConvex = new HTuple(); hv_ColumnConvex = new HTuple(); try { HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row1 + 30, hv_Coloumn1 + 31, hv_Phi, 30, 30); HOperatorSet.GenMeasureRectangle2(hv_Row1 + 20, hv_Coloumn1 + 20, hv_Phi, 30, 30, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle); HOperatorSet.MeasurePos(ho_Image, hv_MeasureHandle, 2, 10, "positive", "first", out hv_RowEdge, out hv_ColumnEdge, out hv_Amplitude, out hv_Distance); ho_RegionLines.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLines, hv_RowEdge + 140, hv_ColumnEdge, hv_RowEdge - 140, hv_ColumnEdge); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row2 - 20, hv_Coloumn2 + 30, hv_Phi, 30, 30); HOperatorSet.GenMeasureRectangle2(hv_Row2 - 10, hv_Coloumn2 + 30, hv_Phi, 30, 30, hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle1); HOperatorSet.MeasurePos(ho_Image, hv_MeasureHandle1, 2, 10, "positive", "first", out hv_RowEdge1, out hv_ColumnEdge1, out hv_Amplitude1, out hv_Distance1); ho_RegionLines1.Dispose(); HOperatorSet.GenRegionLine(out ho_RegionLines1, hv_RowEdge1 + 140, hv_ColumnEdge1, hv_RowEdge1 - 140, hv_ColumnEdge1); HOperatorSet.TupleGreater(new HTuple(hv_RowEdge.TupleLength()), 0, out hv_Greater1); HOperatorSet.TupleGreater(new HTuple(hv_RowEdge1.TupleLength()), 0, out hv_Greater2); HOperatorSet.TupleOr(hv_Greater1, hv_Greater2, out hv_Or); if ((int)(new HTuple(hv_Or.TupleLess(1))) != 0) { hv_RowConvex = hv_Row1.Clone(); hv_ColumnConvex = hv_Coloumn1.Clone(); } else { if ((int)(new HTuple(hv_ColumnEdge.TupleGreater(hv_ColumnEdge1))) != 0) { hv_RowConvex = hv_RowEdge[0]; hv_ColumnConvex = hv_ColumnEdge[0]; } else { hv_RowConvex = hv_RowEdge[0]; hv_ColumnConvex = hv_ColumnEdge1[0]; } } ho_Rectangle.Dispose(); ho_RegionLines.Dispose(); ho_RegionLines1.Dispose(); return; } catch (HalconException HDevExpDefaultException) { ho_Rectangle.Dispose(); ho_RegionLines.Dispose(); ho_RegionLines1.Dispose(); throw HDevExpDefaultException; } } //public void M423ConvexPoint(HObject ho_ImageWidth, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2, HTuple hv_Column2, HTuple hv_Pi, out HTuple hv_RowConvex, out HTuple hv_ColumnConvex) //{ // // Local iconic variables // HObject ho_EmptyObject, ho_Rectangle, ho_RegionLines; // HObject ho_RegionLines1; // // Local control variables // HTuple hv_Width = null, hv_Height = null, hv_MeasureHandle = null; // HTuple hv_RowEdge = null, hv_ColumnEdge = null, hv_Amplitude = null; // HTuple hv_Distance = null, hv_MeasureHandle1 = null, hv_RowEdge1 = null; // HTuple hv_ColumnEdge1 = null, hv_Amplitude1 = null, hv_Distance1 = null; // // Initialize local and output iconic variables // HOperatorSet.GenEmptyObj(out ho_EmptyObject); // HOperatorSet.GenEmptyObj(out ho_Rectangle); // HOperatorSet.GenEmptyObj(out ho_RegionLines); // HOperatorSet.GenEmptyObj(out ho_RegionLines1); // hv_RowConvex = new HTuple(); // hv_ColumnConvex = new HTuple(); // try // { // ho_EmptyObject.Dispose(); // HOperatorSet.GenEmptyObj(out ho_EmptyObject); // ho_EmptyObject.Dispose(); // HOperatorSet.CopyImage(ho_ImageWidth, out ho_EmptyObject); // HOperatorSet.GetImageSize(ho_EmptyObject, out hv_Width, out hv_Height); // ho_Rectangle.Dispose(); // HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row1 + 20, hv_Column1 + 20, hv_Pi, // 30, 30); // HOperatorSet.GenMeasureRectangle2(hv_Row1 + 20, hv_Column1 + 20, hv_Pi, 30, 30, // hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle); // HOperatorSet.MeasurePos(ho_EmptyObject, hv_MeasureHandle, 1, 30, "all", "all", // out hv_RowEdge, out hv_ColumnEdge, out hv_Amplitude, out hv_Distance); // ho_RegionLines.Dispose(); // HOperatorSet.GenRegionLine(out ho_RegionLines, hv_RowEdge + 140, hv_ColumnEdge, // hv_RowEdge - 140, hv_ColumnEdge); // ho_Rectangle.Dispose(); // HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row2 - 20, hv_Column2 + 30, hv_Pi, // 30, 30); // HOperatorSet.GenMeasureRectangle2(hv_Row2 - 20, hv_Column2 + 30, hv_Pi, 30, 30, // hv_Width, hv_Height, "nearest_neighbor", out hv_MeasureHandle1); // HOperatorSet.MeasurePos(ho_EmptyObject, hv_MeasureHandle1, 1, 30, "all", "all", // out hv_RowEdge1, out hv_ColumnEdge1, out hv_Amplitude1, out hv_Distance1); // ho_RegionLines1.Dispose(); // HOperatorSet.GenRegionLine(out ho_RegionLines1, hv_RowEdge1 + 140, hv_ColumnEdge1, // hv_RowEdge1 - 140, hv_ColumnEdge1); // if ((int)(new HTuple(hv_ColumnEdge.TupleGreater(hv_ColumnEdge1))) != 0) // { // hv_RowConvex = hv_RowEdge.Clone(); // hv_ColumnConvex = hv_ColumnEdge.Clone(); // } // else // { // hv_RowConvex = hv_RowEdge1.Clone(); // hv_ColumnConvex = hv_ColumnEdge1.Clone(); // } // ho_EmptyObject.Dispose(); // ho_Rectangle.Dispose(); // ho_RegionLines.Dispose(); // ho_RegionLines1.Dispose(); // return; // } // catch (HalconException HDevExpDefaultException) // { // ho_EmptyObject.Dispose(); // ho_Rectangle.Dispose(); // ho_RegionLines.Dispose(); // ho_RegionLines1.Dispose(); // throw HDevExpDefaultException; // } //} public void X338FindCornerPoint(HObject ho_Image, HObject ho_Rectangle1, HObject ho_Rectangle2, out HTuple hv_Row, out HTuple hv_Column, out HTuple hv_Phi) { // Local iconic variables HObject ho_Line1, ho_Line2, ho_Cross; // Local control variables HTuple hv_RowBegin = null, hv_ColBegin = null; HTuple hv_RowEnd = null, hv_ColEnd = null, hv_Nr = null; HTuple hv_Nc = null, hv_Dist = null, hv_RowBegin1 = null; HTuple hv_ColBegin1 = null, hv_RowEnd1 = null, hv_ColEnd1 = null; HTuple hv_Nr1 = null, hv_Nc1 = null, hv_Dist1 = null, hv_IsOverlapping = null; HTuple hv_RowCenter = null, hv_ColumnCenter = null, hv_Length4 = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Line1); HOperatorSet.GenEmptyObj(out ho_Line2); HOperatorSet.GenEmptyObj(out ho_Cross); ho_Line1.Dispose(); X338SelectLongestLine(ho_Image, ho_Rectangle1, out ho_Line1); ho_Line2.Dispose(); X338SelectLongestLine(ho_Image, ho_Rectangle2, out ho_Line2); HOperatorSet.FitLineContourXld(ho_Line1, "tukey", -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); HOperatorSet.FitLineContourXld(ho_Line2, "tukey", -1, 0, 5, 2, out hv_RowBegin1, out hv_ColBegin1, out hv_RowEnd1, out hv_ColEnd1, out hv_Nr1, out hv_Nc1, out hv_Dist1); //get_contour_xld (Line1, Row3, Col) //get_contour_xld (Line2, Row4, Col1) //BeginRow := Row3[0] //BeginCol := Col[0] //EndRow := Row3[|Row3|-1] //EndCol := Col[|Col|-1] //BeginRow1 := Row4[0] //BeginCol1 := Col1[0] //EndRow1 := Row4[|Row4|-1] //EndCol1 := Col1[|Col1|-1] HOperatorSet.IntersectionLines(hv_RowBegin1, hv_ColBegin1, hv_RowEnd1, hv_ColEnd1, hv_RowBegin, hv_ColBegin, hv_RowEnd, hv_ColEnd, out hv_Row, out hv_Column, out hv_IsOverlapping); ho_Cross.Dispose(); HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row, hv_Column, 26, 0); HOperatorSet.LinePosition(hv_RowBegin1, hv_ColBegin1, hv_RowEnd1, hv_ColEnd1, out hv_RowCenter, out hv_ColumnCenter, out hv_Length4, out hv_Phi); ho_Line1.Dispose(); ho_Line2.Dispose(); ho_Cross.Dispose(); return; } public void X338SelectLongestLine(HObject ho_Image, HObject ho_ROI, out HObject ho_Line) { // Local iconic variables HObject ho_ImageReduced, ho_Edges, ho_UnionContours; // Local control variables HTuple hv_Length = null, hv_Max = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Line); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Edges); HOperatorSet.GenEmptyObj(out ho_UnionContours); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(ho_Image, ho_ROI, out ho_ImageReduced); ho_Edges.Dispose(); HOperatorSet.EdgesSubPix(ho_ImageReduced, out ho_Edges, "canny", 1.0, 10, 30); //segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2) ho_UnionContours.Dispose(); HOperatorSet.UnionAdjacentContoursXld(ho_Edges, out ho_UnionContours, 10, 1, "attr_keep"); HOperatorSet.LengthXld(ho_UnionContours, out hv_Length); HOperatorSet.TupleMax(hv_Length, out hv_Max); ho_Line.Dispose(); HOperatorSet.SelectContoursXld(ho_UnionContours, out ho_Line, "contour_length", hv_Max - 0.001, hv_Max + 0.001, -0.5, 0.5); ho_ImageReduced.Dispose(); ho_Edges.Dispose(); ho_UnionContours.Dispose(); return; } public void BatteryCenter(HObject ho_Region, out HObject ho_Rectangle, out HTuple hv_Row, out HTuple hv_Column, out HTuple hv_Length1, out HTuple hv_Length2) { // Local iconic variables HObject ho_RegionOpening, ho_Contour; // Local control variables HTuple hv_Phi = null, hv_PointOrder = null; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_Contour); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_Region, out ho_RegionOpening, 180, 100); ho_Contour.Dispose(); HOperatorSet.GenContourRegionXld(ho_RegionOpening, out ho_Contour, "border"); HOperatorSet.FitRectangle2ContourXld(ho_Contour, "regression", -1, 0, 0, 3, 2, out hv_Row, out hv_Column, out hv_Phi, out hv_Length1, out hv_Length2, out hv_PointOrder); ho_Rectangle.Dispose(); HOperatorSet.GenRectangle2ContourXld(out ho_Rectangle, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2); ho_RegionOpening.Dispose(); ho_Contour.Dispose(); return; } public void LoadLocation(HObject image, ref HTuple row, ref HTuple column, ref HTuple angle) { // Local iconic variables HObject ho_ROI = null, ho_ImageReduced = null; HObject ho_Batteries = null, ho_Battery = null, ho_Rectangle = null; HObject ho_Cross = null, ho_RectangleV = null, ho_RectangleH = null; // Local control variables HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HTuple hv_LowThreshold = new HTuple(), hv_HighThreshold = new HTuple(); HTuple hv_RectRow1 = new HTuple(), hv_RectColumn1 = new HTuple(); HTuple hv_RectRow2 = new HTuple(), hv_RectColumn2 = new HTuple(); HTuple hv_Number = new HTuple(), hv_CornerRows = new HTuple(); HTuple hv_CornerColumns = new HTuple(), hv_CornerPhis = new HTuple(); HTuple hv_Index1 = new HTuple(), hv_Area = new HTuple(); HTuple hv_Row = new HTuple(), hv_Column = new HTuple(); HTuple hv_CenterRow = new HTuple(), hv_CenterColumn = new HTuple(); HTuple hv_Length1 = new HTuple(), hv_Length2 = new HTuple(); HTuple hv_CornerRow = new HTuple(), hv_CornerColumn = new HTuple(); HTuple hv_CornerPhi = new HTuple(), hv_BatteryStatus = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_ROI); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Batteries); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.GenEmptyObj(out ho_Rectangle); HOperatorSet.GenEmptyObj(out ho_Cross); HOperatorSet.GenEmptyObj(out ho_RectangleV); HOperatorSet.GenEmptyObj(out ho_RectangleH); try { HOperatorSet.GetImageSize(image, out hv_Width, out hv_Height); hv_LowThreshold = 0; hv_HighThreshold = 160; hv_RectRow1 = 300; hv_RectColumn1 = 5.5; hv_RectRow2 = 750.5; hv_RectColumn2 = 1500; ho_ROI.Dispose(); HOperatorSet.GenRectangle1(out ho_ROI, hv_RectRow1, hv_RectColumn1, hv_RectRow2, hv_RectColumn2); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(image, ho_ROI, out ho_ImageReduced); ho_Batteries.Dispose(); SelectBattery(ho_ImageReduced, out ho_Batteries, hv_LowThreshold, hv_HighThreshold, out hv_BatteryStatus); ho_Battery.Dispose(); HOperatorSet.GenEmptyObj(out ho_Battery); HOperatorSet.CountObj(ho_Batteries, out hv_Number); hv_CornerRows = new HTuple(); hv_CornerColumns = new HTuple(); hv_CornerPhis = new HTuple(); HTuple end_val27 = hv_Number; HTuple step_val27 = 1; for (hv_Index1 = 1; hv_Index1.Continue(end_val27, step_val27); hv_Index1 = hv_Index1.TupleAdd(step_val27)) { ho_Battery.Dispose(); HOperatorSet.SelectObj(ho_Batteries, out ho_Battery, hv_Index1); HOperatorSet.AreaCenter(ho_Battery, out hv_Area, out hv_Row, out hv_Column); if ((int)(new HTuple(hv_Area.TupleNotEqual(0))) != 0) { ho_Rectangle.Dispose(); BatteryCenter(ho_Battery, out ho_Rectangle, out hv_CenterRow, out hv_CenterColumn, out hv_Length1, out hv_Length2); ho_Cross.Dispose(); HOperatorSet.GenCrossContourXld(out ho_Cross, hv_CenterRow, hv_CenterColumn, 26, 0.785398); ho_RectangleV.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleV, hv_CenterRow, hv_CenterColumn - hv_Length1, (new HTuple(90)).TupleRad(), hv_Length2 - 75, 30); ho_RectangleH.Dispose(); HOperatorSet.GenRectangle2(out ho_RectangleH, hv_CenterRow - hv_Length2, hv_CenterColumn, 0, 75, 30); X338FindCornerPoint(ho_ImageReduced, ho_RectangleV, ho_RectangleH, out hv_CornerRow, out hv_CornerColumn, out hv_CornerPhi); if (hv_Index1 == 3) { hv_Index1 = hv_Index1 - 1; hv_CornerRows = hv_CornerRows.TupleConcat(hv_CornerRow); hv_CornerColumns = hv_CornerColumns.TupleConcat(hv_CornerColumn); hv_Index1 = hv_Index1 + 1; } else { hv_CornerRows = hv_CornerRows.TupleConcat(hv_CornerRow); hv_CornerColumns = hv_CornerColumns.TupleConcat(hv_CornerColumn); } hv_CornerPhis = hv_CornerPhis.TupleConcat(hv_CornerPhi); } } row = hv_CornerRows; column = hv_CornerColumns; angle = hv_CornerPhis; } catch (HalconException) { row = 0; column = 0; angle = 0; ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Batteries.Dispose(); ho_Battery.Dispose(); ho_Rectangle.Dispose(); ho_Cross.Dispose(); ho_RectangleV.Dispose(); ho_RectangleH.Dispose(); } ho_ROI.Dispose(); ho_ImageReduced.Dispose(); ho_Batteries.Dispose(); ho_Battery.Dispose(); ho_Rectangle.Dispose(); ho_Cross.Dispose(); ho_RectangleV.Dispose(); ho_RectangleH.Dispose(); } //20181213 Johnny修改Adam的方法,添加空料检测&输出;屏蔽长边测量中间部分,避免治具内侧倒角影响检测结果;修改电池的长宽为最小外接矩形的大小.以下是新方法: public void M423MeasureLandWJohnny(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth, ref bool isNa) { // Local iconic variables HObject ho_Region, ho_ConnectedRegions; HObject ho_RegionFillUp, ho_RegionOpening, ho_SelectedRegions; HObject ho_Rectangle1 = null, ho_RegionDilation = null, ho_RegionErosion = null; HObject ho_RegionDifference = null, ho_ImageReduced = null; HObject ho_Region1 = null, ho_ConnectedRegions1 = null, ho_SelectedRegions1 = null; HObject ho_RegionUnion = null, ho_Rectangle2 = null; // Local control variables HTuple hv_Width = null, hv_Height = null; HTuple hv_Area = null, hv_Row2 = null, hv_Column2 = null; HTuple hv_Number = null, hv_Row = new HTuple(), hv_Column = new HTuple(); HTuple hv_Phi = new HTuple(), hv_Length1 = new HTuple(); HTuple hv_Length2 = new HTuple(), hv_Row1 = new HTuple(); HTuple hv_Column1 = new HTuple(), hv_Phi1 = new HTuple(); HTuple hv_Length3 = new HTuple(), hv_Length4 = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Region); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions); HOperatorSet.GenEmptyObj(out ho_RegionFillUp); HOperatorSet.GenEmptyObj(out ho_RegionOpening); HOperatorSet.GenEmptyObj(out ho_SelectedRegions); HOperatorSet.GenEmptyObj(out ho_Rectangle1); HOperatorSet.GenEmptyObj(out ho_RegionDilation); HOperatorSet.GenEmptyObj(out ho_RegionErosion); HOperatorSet.GenEmptyObj(out ho_RegionDifference); HOperatorSet.GenEmptyObj(out ho_ImageReduced); HOperatorSet.GenEmptyObj(out ho_Region1); HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1); HOperatorSet.GenEmptyObj(out ho_SelectedRegions1); HOperatorSet.GenEmptyObj(out ho_RegionUnion); HOperatorSet.GenEmptyObj(out ho_Rectangle2); double hv_scale = 0.01376753; isNa = false; try { HOperatorSet.GetImageSize(Image, out hv_Width, out hv_Height); HOperatorSet.SetPart(Hwindow, 0, 0, hv_Height - 1, hv_Width - 1); HOperatorSet.DispImage(Image, Hwindow); ho_Region.Dispose(); HOperatorSet.Threshold(Image, out ho_Region, 0, 100); ho_ConnectedRegions.Dispose(); HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions); ho_RegionFillUp.Dispose(); HOperatorSet.FillUp(ho_ConnectedRegions, out ho_RegionFillUp); ho_RegionOpening.Dispose(); HOperatorSet.OpeningRectangle1(ho_RegionFillUp, out ho_RegionOpening, 50, 50); ho_SelectedRegions.Dispose(); HOperatorSet.SelectShapeStd(ho_RegionOpening, out ho_SelectedRegions, "max_area", 70); HOperatorSet.AreaCenter(ho_SelectedRegions, out hv_Area, out hv_Row2, out hv_Column2); HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number); if ((int)((new HTuple(hv_Number.TupleEqual(0))).TupleOr(new HTuple(hv_Area.TupleLess( 1000000)))) != 0) { isNa = true; batteryLength = 0; batteryWidth = 0; } else { isNa = false; 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_RegionDilation.Dispose(); HOperatorSet.DilationRectangle1(ho_Rectangle1, out ho_RegionDilation, 50, 50); ho_RegionErosion.Dispose(); HOperatorSet.ErosionRectangle1(ho_RegionDilation, out ho_RegionErosion, 50, 600); ho_RegionDifference.Dispose(); HOperatorSet.Difference(ho_Rectangle1, ho_RegionErosion, out ho_RegionDifference ); ho_ImageReduced.Dispose(); HOperatorSet.ReduceDomain(Image, ho_RegionDifference, out ho_ImageReduced ); ho_Region1.Dispose(); HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, 0, 70); ho_ConnectedRegions1.Dispose(); HOperatorSet.Connection(ho_Region1, out ho_ConnectedRegions1); ho_SelectedRegions1.Dispose(); HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions1, "area", "and", 100000, 10000000); ho_RegionUnion.Dispose(); HOperatorSet.Union1(ho_SelectedRegions1, out ho_RegionUnion); HOperatorSet.SmallestRectangle2(ho_RegionUnion, out hv_Row1, out hv_Column1, out hv_Phi1, out hv_Length3, out hv_Length4); ho_Rectangle2.Dispose(); HOperatorSet.GenRectangle2(out ho_Rectangle2, hv_Row1, hv_Column1, hv_Phi1, hv_Length3, hv_Length4); HOperatorSet.SetColor(Hwindow, "green"); HOperatorSet.SetDraw(Hwindow, "margin"); HOperatorSet.DispObj(ho_Rectangle1, Hwindow); batteryLength = hv_Length3.D * 2 * hv_scale; batteryWidth = hv_Length4.D * 2 * hv_scale; } ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionFillUp.Dispose(); ho_RegionOpening.Dispose(); ho_SelectedRegions.Dispose(); ho_Rectangle1.Dispose(); ho_RegionDilation.Dispose(); ho_RegionErosion.Dispose(); ho_RegionDifference.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_RegionUnion.Dispose(); ho_Rectangle2.Dispose(); } catch { ho_Region.Dispose(); ho_ConnectedRegions.Dispose(); ho_RegionFillUp.Dispose(); ho_RegionOpening.Dispose(); ho_SelectedRegions.Dispose(); ho_Rectangle1.Dispose(); ho_RegionDilation.Dispose(); ho_RegionErosion.Dispose(); ho_RegionDifference.Dispose(); ho_ImageReduced.Dispose(); ho_Region1.Dispose(); ho_ConnectedRegions1.Dispose(); ho_SelectedRegions1.Dispose(); ho_RegionUnion.Dispose(); ho_Rectangle2.Dispose(); batteryLength = 999; batteryWidth = 999; } } public HObject ho_Image { get; set; } } }