Exemple #1
0
        public WhiteParaList WhiteDotInspect1(string barcode, string modle, HObject ho_Image, double pixel_MM, string ImagePath)
        {
            WhiteParaList WhiteParaReturn = new WhiteParaList();

            // Stack for temporary objects
            HObject[] OTemp = new HObject[20];
            long      SP_O  = 0;

            // Local iconic variables


            // Initialize local and output iconic variables


            HObject ho_EmptyRegion, ho_Region, ho_SelectObjregion;
            HObject ho_RegionFillUp, ho_RegionErosion, ho_RegionDifference;
            HObject ho_ImageReduced, ho_Region1, ho_ConnectedRegions;
            HObject ho_SelectedRegions, ho_ImageReduced1, ho_ImageEmphasize;
            HObject ho_Region2, ho_ConnectedRegions1, ho_SelectedRegions1;
            HObject ho_RegionDilation = null, ho_Circle = null, ho_ImageResult = null;

            HObject ho_Domain11, ho_ImageScaled;


            // Local control variables

            HTuple hv_Width, hv_Height, hv_Mean, hv_Deviation, hv_RowY = null, hv_ColumnX = null, hv_Area1 = null;;
            HTuple hv_meanResult, hv_Number, hv_Number1, hv_Number2, hv_NumDot = null;
            HTuple hv_Row = new HTuple(), hv_Column = new HTuple(), hv_Radius = new HTuple();
            HTuple hv_Index = new HTuple();

            HTuple hv_AbsoluteHisto, hv_RelativeHisto;
            HTuple hv_Max, hv_maxGrayValue;

            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_SelectObjregion);
            HOperatorSet.GenEmptyObj(out ho_EmptyRegion);
            HOperatorSet.GenEmptyObj(out ho_Region);
            HOperatorSet.GenEmptyObj(out ho_RegionFillUp);
            HOperatorSet.GenEmptyObj(out ho_RegionErosion);
            HOperatorSet.GenEmptyObj(out ho_RegionDifference);
            HOperatorSet.GenEmptyObj(out ho_ImageReduced);
            HOperatorSet.GenEmptyObj(out ho_Region1);
            HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
            HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
            HOperatorSet.GenEmptyObj(out ho_ImageReduced1);
            HOperatorSet.GenEmptyObj(out ho_ImageEmphasize);
            HOperatorSet.GenEmptyObj(out ho_Region2);
            HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1);
            HOperatorSet.GenEmptyObj(out ho_SelectedRegions1);
            HOperatorSet.GenEmptyObj(out ho_RegionDilation);
            HOperatorSet.GenEmptyObj(out ho_Circle);
            HOperatorSet.GenEmptyObj(out ho_ImageResult);


            HOperatorSet.GenEmptyObj(out ho_Domain11);
            HOperatorSet.GenEmptyObj(out ho_ImageScaled);

            HTuple hv_radius_MM = null, hv_area_Pixel = null;

            hv_radius_MM  = pixel_MM;
            hv_area_Pixel = 0.005 / (pixel_MM * pixel_MM);

            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
            ho_EmptyRegion.Dispose();
            HOperatorSet.GenEmptyRegion(out ho_EmptyRegion);


            ho_Domain11.Dispose();
            HOperatorSet.GetDomain(ho_Image, out ho_Domain11);
            HOperatorSet.GrayHisto(ho_Domain11, ho_Image, out hv_AbsoluteHisto, out hv_RelativeHisto);
            HOperatorSet.TupleMax(hv_AbsoluteHisto, out hv_Max);
            hv_maxGrayValue = hv_AbsoluteHisto.TupleFind(hv_Max);
            ho_ImageScaled.Dispose();
            HOperatorSet.ScaleImage(ho_Image, out ho_ImageScaled, 1, 140 - hv_maxGrayValue[0]);

            ho_Region.Dispose();
            HOperatorSet.Threshold(ho_ImageScaled, out ho_Region, 80, 255);
            ho_RegionFillUp.Dispose();
            HOperatorSet.FillUp(ho_Region, out ho_RegionFillUp);
            ho_RegionErosion.Dispose();
            HOperatorSet.ErosionCircle(ho_RegionFillUp, out ho_RegionErosion, 30);
            ho_RegionDifference.Dispose();
            HOperatorSet.Difference(ho_RegionFillUp, ho_RegionErosion, out ho_RegionDifference
                                    );
            ho_ImageReduced.Dispose();
            HOperatorSet.ReduceDomain(ho_Image, ho_RegionDifference, out ho_ImageReduced);
            HOperatorSet.Intensity(ho_RegionDifference, ho_ImageReduced, out hv_Mean, out hv_Deviation);
            hv_meanResult = hv_Mean * 1.6;
            if ((int)(new HTuple(hv_meanResult.TupleGreater(240))) != 0)
            {
                hv_meanResult = 240;
            }
            ho_Region1.Dispose();
            HOperatorSet.Threshold(ho_ImageReduced, out ho_Region1, hv_meanResult, 255);
            ho_ConnectedRegions.Dispose();
            HOperatorSet.Connection(ho_Region1, out ho_ConnectedRegions);
            ho_SelectedRegions.Dispose();
            HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
                                     "and", hv_area_Pixel, 99999);
            HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number);
            if ((int)(new HTuple(hv_Number.TupleGreater(0))) != 0)
            {
                OTemp[SP_O] = ho_EmptyRegion.CopyObj(1, -1);
                SP_O++;
                ho_EmptyRegion.Dispose();
                HOperatorSet.ConcatObj(OTemp[SP_O - 1], ho_SelectedRegions, out ho_EmptyRegion
                                       );
                OTemp[SP_O - 1].Dispose();
                SP_O = 0;
            }
            ho_ImageReduced1.Dispose();
            HOperatorSet.ReduceDomain(ho_Image, ho_RegionErosion, out ho_ImageReduced1);
            ho_ImageEmphasize.Dispose();
            HOperatorSet.Emphasize(ho_ImageReduced1, out ho_ImageEmphasize, 11, 11, 1);
            ho_Region2.Dispose();
            HOperatorSet.VarThreshold(ho_ImageEmphasize, out ho_Region2, hv_Width, hv_Height,
                                      0.2, 120, "light");
            ho_ConnectedRegions1.Dispose();
            HOperatorSet.Connection(ho_Region2, out ho_ConnectedRegions1);
            ho_SelectedRegions1.Dispose();
            HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions1, "area",
                                     "and", hv_area_Pixel, 99999);
            HOperatorSet.CountObj(ho_SelectedRegions1, out hv_Number1);
            if ((int)(new HTuple(hv_Number1.TupleGreater(0))) != 0)
            {
                OTemp[SP_O] = ho_EmptyRegion.CopyObj(1, -1);
                SP_O++;
                ho_EmptyRegion.Dispose();
                HOperatorSet.ConcatObj(OTemp[SP_O - 1], ho_SelectedRegions1, out ho_EmptyRegion
                                       );
                OTemp[SP_O - 1].Dispose();
                SP_O = 0;
            }
            HOperatorSet.CountObj(ho_EmptyRegion, out hv_Number2);
            hv_NumDot = hv_Number2 - 1;
            if (hv_NumDot.I > 5)
            {
                WhiteParaReturn.whiteCounts = 5;
            }
            else
            {
                WhiteParaReturn.whiteCounts = hv_NumDot.I;
            }
            if ((int)(new HTuple(hv_Number2.TupleGreater(1))) != 0)
            {
                ho_RegionDilation.Dispose();
                HOperatorSet.DilationCircle(ho_EmptyRegion, out ho_RegionDilation, 5);
                HOperatorSet.SmallestCircle(ho_RegionDilation, out hv_Row, out hv_Column, out hv_Radius);
                ho_Circle.Dispose();
                HOperatorSet.GenCircle(out ho_Circle, hv_Row, hv_Column, hv_Radius);
                ho_ImageResult.Dispose();
                HOperatorSet.PaintRegion(ho_Circle, ho_Image, out ho_ImageResult, 0, "margin");


                string fileName = ImagePath + "\\" + barcode + ".bmp";

                HOperatorSet.WriteImage(ho_ImageResult, "bmp", 0, fileName);

                string fileName1 = ImagePath + "\\" + "Original" + barcode + ".bmp";

                HOperatorSet.WriteImage(ho_Image, "bmp", 0, fileName1);

                if (hv_NumDot.I > 5)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        ho_SelectObjregion.Dispose();
                        HOperatorSet.SelectObj(ho_EmptyRegion, out ho_SelectObjregion, j + 2);
                        HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1);
                        WhiteParaReturn.whiteX[j]    = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3);
                        WhiteParaReturn.whiteY[j]    = (float)Math.Round(hv_RowY.D * pixel_MM, 3);
                        WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3);
                    }
                }
                else
                {
                    for (int j = 0; j < hv_NumDot.I; j++)
                    {
                        ho_SelectObjregion.Dispose();
                        HOperatorSet.SelectObj(ho_EmptyRegion, out ho_SelectObjregion, j + 2);
                        HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1);
                        WhiteParaReturn.whiteX[j]    = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3);
                        WhiteParaReturn.whiteY[j]    = (float)Math.Round(hv_RowY.D * pixel_MM, 3);
                        WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3);
                    }
                }
            }

            ho_SelectObjregion.Dispose();
            ho_EmptyRegion.Dispose();
            ho_Region.Dispose();
            ho_RegionFillUp.Dispose();
            ho_RegionErosion.Dispose();
            ho_RegionDifference.Dispose();
            ho_ImageReduced.Dispose();
            ho_Region1.Dispose();
            ho_ConnectedRegions.Dispose();
            ho_SelectedRegions.Dispose();
            ho_ImageReduced1.Dispose();
            ho_ImageEmphasize.Dispose();
            ho_Region2.Dispose();
            ho_ConnectedRegions1.Dispose();
            ho_SelectedRegions1.Dispose();
            ho_RegionDilation.Dispose();
            ho_Circle.Dispose();
            ho_ImageResult.Dispose();

            ho_Domain11.Dispose();
            ho_ImageScaled.Dispose();
            return(WhiteParaReturn);
        }
Exemple #2
0
        /// <summary>
        /// 白点检测20171010
        /// </summary>
        /// <param name="barcode"></param>
        /// <param name="ho_Image"></param>
        /// <param name="pixel_MM"></param>
        /// <returns></returns>
        public WhiteParaList WhiteDotInspect(string barcode, string modle, HObject ho_Image, double pixel_MM, string ImagePath)
        {
            WhiteParaList WhiteParaReturn = new WhiteParaList();
            // Local iconic variables

            HObject ho_Domain, ho_ImageScaled = null, ho_SelectObjregion;
            HObject ho_ImageInvert, ho_Region2, ho_ConnectedRegions;
            HObject ho_SelectedRegions, ho_RegionDilation = null, ho_Circle = null;
            HObject ho_ImageResult = null;

            // Local control variables

            HTuple hv_Name = null, hv_Width = null, hv_Height = null, hv_RowY = null, hv_ColumnX = null, hv_Area1 = null;
            HTuple hv_Index1 = null, hv_Mean1 = new HTuple(), hv_Deviation1 = new HTuple();
            HTuple hv_radius_MM = null, hv_radius_Pixel = null, hv_area_Pixel = null;
            HTuple hv_Number = null, hv_NumDot = null, hv_Row = new HTuple();
            HTuple hv_Column = new HTuple(), hv_Radius = new HTuple();

            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_SelectObjregion);
            HOperatorSet.GenEmptyObj(out ho_Domain);
            HOperatorSet.GenEmptyObj(out ho_ImageScaled);
            HOperatorSet.GenEmptyObj(out ho_ImageInvert);
            HOperatorSet.GenEmptyObj(out ho_Region2);
            HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
            HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
            HOperatorSet.GenEmptyObj(out ho_RegionDilation);
            HOperatorSet.GenEmptyObj(out ho_Circle);
            HOperatorSet.GenEmptyObj(out ho_ImageResult);
            hv_Name   = barcode;
            hv_NumDot = 0;
            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
            ho_Domain.Dispose();
            HOperatorSet.GetDomain(ho_Image, out ho_Domain);
            for (hv_Index1 = 0; (int)hv_Index1 <= 255; hv_Index1 = (int)hv_Index1 + 1)
            {
                ho_ImageScaled.Dispose();
                HOperatorSet.ScaleImage(ho_Image, out ho_ImageScaled, 1.6, -hv_Index1);
                HOperatorSet.Intensity(ho_Domain, ho_ImageScaled, out hv_Mean1, out hv_Deviation1);
                if ((int)((new HTuple(hv_Mean1.TupleGreater(20))).TupleAnd(new HTuple(hv_Mean1.TupleLess(
                                                                                          30)))) != 0)
                {
                    break;
                }
            }
            ho_ImageInvert.Dispose();
            HOperatorSet.InvertImage(ho_ImageScaled, out ho_ImageInvert);
            ho_Region2.Dispose();
            HOperatorSet.VarThreshold(ho_ImageInvert, out ho_Region2, hv_Width, hv_Height,
                                      2, 100, "dark");
            ho_ConnectedRegions.Dispose();
            HOperatorSet.Connection(ho_Region2, out ho_ConnectedRegions);
            hv_radius_MM    = pixel_MM * 1000;
            hv_radius_Pixel = 20 / hv_radius_MM;
            hv_area_Pixel   = (3.14 * hv_radius_Pixel) * hv_radius_Pixel;
            ho_SelectedRegions.Dispose();
            HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
                                     "and", hv_area_Pixel, 99999);
            HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number);
            hv_NumDot = hv_Number.Clone();
            if (hv_NumDot.I > 5)
            {
                WhiteParaReturn.whiteCounts = 5;
            }
            else
            {
                WhiteParaReturn.whiteCounts = hv_NumDot.I;
            }
            if ((int)(new HTuple(hv_NumDot.TupleGreater(0))) != 0)
            {
                ho_RegionDilation.Dispose();
                HOperatorSet.DilationCircle(ho_SelectedRegions, out ho_RegionDilation, 5);
                HOperatorSet.SmallestCircle(ho_RegionDilation, out hv_Row, out hv_Column, out hv_Radius);
                ho_Circle.Dispose();
                HOperatorSet.GenCircle(out ho_Circle, hv_Row, hv_Column, hv_Radius);
                ho_ImageResult.Dispose();
                HOperatorSet.PaintRegion(ho_Circle, ho_Image, out ho_ImageResult, 0, "margin");


                string fileName = ImagePath + "\\" + barcode + ".bmp";

                HOperatorSet.WriteImage(ho_ImageResult, "bmp", 0, fileName);

                string fileName1 = ImagePath + "\\" + "Original" + barcode + ".bmp";

                HOperatorSet.WriteImage(ho_Image, "bmp", 0, fileName1);
                if (hv_NumDot.I > 5)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        ho_SelectObjregion.Dispose();
                        HOperatorSet.SelectObj(ho_SelectedRegions, out ho_SelectObjregion, j + 1);
                        HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1);
                        WhiteParaReturn.whiteX[j]    = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3);
                        WhiteParaReturn.whiteY[j]    = (float)Math.Round(hv_RowY.D * pixel_MM, 3);
                        WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3);
                    }
                }
                else
                {
                    for (int j = 0; j < hv_NumDot.I; j++)
                    {
                        ho_SelectObjregion.Dispose();
                        HOperatorSet.SelectObj(ho_SelectedRegions, out ho_SelectObjregion, j + 1);
                        HOperatorSet.AreaCenter(ho_SelectObjregion, out hv_RowY, out hv_ColumnX, out hv_Area1);
                        WhiteParaReturn.whiteX[j]    = (float)Math.Round(hv_ColumnX.D * pixel_MM, 3);
                        WhiteParaReturn.whiteY[j]    = (float)Math.Round(hv_RowY.D * pixel_MM, 3);
                        WhiteParaReturn.whiteArea[j] = (float)Math.Round(hv_Area1.D * pixel_MM * pixel_MM, 3);
                    }
                }
            }
            //else
            //{

            //    string path = "G:\\BlackAndWhiteDotImage";
            //    if (!Directory.Exists(path))
            //    {
            //        Directory.CreateDirectory(path);
            //    }
            //    string s_FileName = path + "\\" + DateTime.Now.ToString("yyyyMMdd");
            //    if (!Directory.Exists(s_FileName))
            //    {
            //        Directory.CreateDirectory(s_FileName);
            //    }
            //    string FileName = s_FileName + "\\" + "WhiteDotImage";
            //    if (!Directory.Exists(FileName))
            //    {
            //        Directory.CreateDirectory(FileName);
            //    }
            //    string fileName = FileName + "\\" + barcode + ".bmp";

            //    HOperatorSet.WriteImage(ho_Image, "bmp", 0, fileName);



            //}
            ho_SelectObjregion.Dispose();
            ho_Domain.Dispose();
            ho_ImageScaled.Dispose();
            ho_ImageInvert.Dispose();
            ho_Region2.Dispose();
            ho_ConnectedRegions.Dispose();
            ho_SelectedRegions.Dispose();
            ho_RegionDilation.Dispose();
            ho_Circle.Dispose();
            ho_ImageResult.Dispose();
            return(WhiteParaReturn);
        }