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();
}
//20181217 Johnny修改测量长宽的方法:
//添加空料检测&输出
//屏蔽长边测量中间部分,避免治具倒角影响检测结果
//使用抓取轮廓的方式确定电池的边界,计算轮廓的最小外接矩形
//修改电池的长宽为最小外接矩形的大小
public void M423MeasureLandWJohnny(HObject Image, HTuple Hwindow, ref double batteryLength, ref double batteryWidth, ref bool isNa)
{
// Local iconic variables
HObject copyImage,ho_Region, ho_ConnectedRegions;
HObject ho_SelectedRegions, ho_RegionFillUp = null, ho_RegionOpening = null;
HObject ho_Rectangle = null, ho_RegionDilation = null, ho_RegionErosion = null;
HObject ho_RegionDifference = null, ho_RegionDifference1 = null;
HObject ho_ImageReduced = null, ho_Edges = null, ho_SelectedContours = null;
HObject ho_ObjectSelected = null, ho_Contour = null, ho_Rectangle1 = null;
// Local control variables
HTuple hv_Width = null, hv_Height = null, hv_isNa = null;
HTuple hv_Area = null, hv_Row = null, hv_Column = null;
HTuple hv_Number1 = null, hv_Row1 = new HTuple(), hv_Column1 = new HTuple();
HTuple hv_Phi1 = new HTuple(), hv_Length11 = new HTuple();
HTuple hv_Length12 = new HTuple(), hv_RowAll = new HTuple();
HTuple hv_ColAll = new HTuple(), hv_Number2 = new HTuple();
HTuple hv_I = new HTuple(), hv_Col1 = new HTuple(), hv_Row2 = new HTuple();
HTuple hv_Column2 = new HTuple(), hv_Phi2 = new HTuple();
HTuple hv_Length21 = new HTuple(), hv_Length22 = new HTuple();
// Initialize local and output iconic variables
//HOperatorSet.GenEmptyObj(out ho_Image);
HOperatorSet.GenEmptyObj(out copyImage);
HOperatorSet.GenEmptyObj(out ho_Region);
HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
HOperatorSet.GenEmptyObj(out ho_RegionFillUp);
HOperatorSet.GenEmptyObj(out ho_RegionOpening);
HOperatorSet.GenEmptyObj(out ho_Rectangle);
HOperatorSet.GenEmptyObj(out ho_RegionDilation);
HOperatorSet.GenEmptyObj(out ho_RegionErosion);
HOperatorSet.GenEmptyObj(out ho_RegionDifference);
HOperatorSet.GenEmptyObj(out ho_RegionDifference1);
HOperatorSet.GenEmptyObj(out ho_ImageReduced);
HOperatorSet.GenEmptyObj(out ho_Edges);
HOperatorSet.GenEmptyObj(out ho_SelectedContours);
HOperatorSet.GenEmptyObj(out ho_ObjectSelected);
HOperatorSet.GenEmptyObj(out ho_Contour);
HOperatorSet.GenEmptyObj(out ho_Rectangle1);
double hv_scale = 0.01376753;
isNa = false;
copyImage = Image;
try
{
HOperatorSet.GetImageSize(copyImage, out hv_Width, out hv_Height);
HOperatorSet.SetPart(Hwindow, 0, 0, hv_Height - 1, hv_Width - 1);
HOperatorSet.DispImage(copyImage, Hwindow);
hv_isNa = 0;
ho_Region.Dispose();
HOperatorSet.Threshold(copyImage, out ho_Region, 0, 100);
ho_ConnectedRegions.Dispose();
HOperatorSet.Connection(ho_Region, out ho_ConnectedRegions);
ho_SelectedRegions.Dispose();
HOperatorSet.SelectShapeStd(ho_ConnectedRegions, out ho_SelectedRegions, "max_area",
70);
HOperatorSet.AreaCenter(ho_SelectedRegions, out hv_Area, out hv_Row, out hv_Column);
HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number1);
if ((int)((new HTuple(hv_Number1.TupleEqual(0))).TupleOr(new HTuple(hv_Area.TupleLess(
1800000)))) != 0)
{
isNa = true;
batteryLength = 0;
batteryWidth = 0;
}
else
{
ho_RegionFillUp.Dispose();
HOperatorSet.FillUp(ho_SelectedRegions, out ho_RegionFillUp);
ho_RegionOpening.Dispose();
HOperatorSet.OpeningRectangle1(ho_RegionFillUp, out ho_RegionOpening, 50, 50);
batteryLength = 101;
HOperatorSet.SmallestRectangle2(ho_RegionOpening, out hv_Row1, out hv_Column1,
out hv_Phi1, out hv_Length11, out hv_Length12);
batteryLength = 102;
ho_Rectangle.Dispose();
HOperatorSet.GenRectangle2(out ho_Rectangle, hv_Row1, hv_Column1, hv_Phi1,
hv_Length11 * 1.1, hv_Length12 * 0.5);
ho_RegionDilation.Dispose();
batteryLength = 103;
HOperatorSet.DilationRectangle1(ho_RegionOpening, out ho_RegionDilation, 20,
20);
ho_RegionErosion.Dispose();
HOperatorSet.ErosionRectangle1(ho_RegionOpening, out ho_RegionErosion, 10,
10);
batteryLength = 104;
ho_RegionDifference.Dispose();
HOperatorSet.Difference(ho_RegionDilation, ho_RegionErosion, out ho_RegionDifference
);
ho_RegionDifference1.Dispose();
HOperatorSet.Difference(ho_RegionDifference, ho_Rectangle, out ho_RegionDifference1
);
ho_ImageReduced.Dispose();
batteryLength = 105;
HOperatorSet.ReduceDomain(copyImage, ho_RegionDifference1, out ho_ImageReduced
);
ho_Edges.Dispose();
batteryLength = 106;
HOperatorSet.EdgesSubPix(ho_ImageReduced, out ho_Edges, "canny", 1, 60, 60);
batteryLength = 107;
ho_SelectedContours.Dispose();
HOperatorSet.SelectContoursXld(ho_Edges, out ho_SelectedContours, "contour_length",
15, 1000000, -0.5, 0.5);
hv_RowAll = new HTuple();
hv_ColAll = new HTuple();
HOperatorSet.CountObj(ho_SelectedContours, out hv_Number2);
HTuple end_val27 = hv_Number2;
HTuple step_val27 = 1;
batteryLength = 108;
for (hv_I = 1; hv_I.Continue(end_val27, step_val27); hv_I = hv_I.TupleAdd(step_val27))
{
ho_ObjectSelected.Dispose();
HOperatorSet.SelectObj(ho_SelectedContours, out ho_ObjectSelected, hv_I);
HOperatorSet.GetContourXld(ho_ObjectSelected, out hv_Row1, out hv_Col1);
hv_RowAll = hv_RowAll.TupleConcat(hv_Row1);
hv_ColAll = hv_ColAll.TupleConcat(hv_Col1);
}
ho_Contour.Dispose();
batteryLength = 109;
HOperatorSet.GenContourPolygonXld(out ho_Contour, hv_RowAll, hv_ColAll);
batteryLength = 110;
HOperatorSet.SmallestRectangle2Xld(ho_Contour, out hv_Row2, out hv_Column2,
out hv_Phi2, out hv_Length21, out hv_Length22);
ho_Rectangle1.Dispose();
batteryLength = 111;
HOperatorSet.GenRectangle2(out ho_Rectangle1, hv_Row2, hv_Column2, hv_Phi2,
hv_Length21, hv_Length22);
HOperatorSet.SetColor(Hwindow, "blue");
HOperatorSet.SetDraw(Hwindow, "margin");
HOperatorSet.DispObj(copyImage, Hwindow);
batteryLength = 112;
HOperatorSet.DispObj(ho_SelectedContours, Hwindow);
batteryLength = hv_Length21.D * 2 * hv_scale; ;
batteryWidth = hv_Length22.D * 2 * hv_scale; ;
}
//copyImage.Dispose();
ho_Region.Dispose();
ho_ConnectedRegions.Dispose();
ho_SelectedRegions.Dispose();
ho_RegionFillUp.Dispose();
ho_RegionOpening.Dispose();
ho_Rectangle.Dispose();
ho_RegionDilation.Dispose();
ho_RegionErosion.Dispose();
ho_RegionDifference.Dispose();
ho_RegionDifference1.Dispose();
ho_ImageReduced.Dispose();
ho_Edges.Dispose();
ho_SelectedContours.Dispose();
ho_ObjectSelected.Dispose();
ho_Contour.Dispose();
ho_Rectangle1.Dispose();
}
catch
{
//copyImage.Dispose();
ho_Region.Dispose();
ho_ConnectedRegions.Dispose();
ho_SelectedRegions.Dispose();
ho_RegionFillUp.Dispose();
ho_RegionOpening.Dispose();
ho_Rectangle.Dispose();
ho_RegionDilation.Dispose();
ho_RegionErosion.Dispose();
ho_RegionDifference.Dispose();
ho_RegionDifference1.Dispose();
ho_ImageReduced.Dispose();
ho_Edges.Dispose();
ho_SelectedContours.Dispose();
ho_ObjectSelected.Dispose();
ho_Contour.Dispose();
ho_Rectangle1.Dispose();
//batteryLength = 999.9;
//batteryWidth = 999.9;
}
}
public HObject ho_Image { get; set; }
}
}