Beispiel #1
0
        private Rectangle FindDest(Bitmap bmpSrc, Point pntDest)
        {
            Color        clrPix     = bmpSrc.GetPixel(pntDest.X, pntDest.Y);     //种子点
            List <Point> listTgtPnt = new List <Point>();                        //目标点List

            DomainTag[,] matDomTag = new DomainTag[bmpSrc.Width, bmpSrc.Height]; //按像素标记连通域的矩阵

            /// 1. 按照种子RGB标记目标像素
            for (int i = 0; i < bmpSrc.Height; ++i)
            {
                for (int j = 0; j < bmpSrc.Width; ++j)
                {
                    if (bmpSrc.GetPixel(j, i) == clrPix)
                    {
                        matDomTag[j, i]._IsTarget = true;                    //标记为目标
                        matDomTag[j, i]._DomInd   = -1;                      //未标记连通域
                        listTgtPnt.Add(new Point(j, i));                     //加入到目标点List

                        if (mIfDebug)
                        {
                            mBmpDebug.SetPixel(j, i, Color.Purple);
                        }
                    }
                    else
                    {
                        matDomTag[j, i]._IsTarget = false;                        //缺省标记为非目标
                    }
                }
            }
            /// 2. 8邻域 连通域检测
            List <List <Point> > listDoms = ConnectedDomainDetect(listTgtPnt, matDomTag);         //连通域List

            if (listDoms.Count < 1)
            {
                return(new Rectangle());
            }

            /// 3. 求Jumper矩形
            Point pntLeftTop  = new Point(bmpSrc.Width, bmpSrc.Height);
            Point pntRightBot = new Point(0, 0);

            foreach (Point pntPix in listDoms[0])
            {
                if (pntLeftTop.X > pntPix.X)
                {
                    pntLeftTop.X = pntPix.X;
                }
                if (pntLeftTop.Y > pntPix.Y)
                {
                    pntLeftTop.Y = pntPix.Y;
                }

                if (pntRightBot.X < pntPix.X)
                {
                    pntRightBot.X = pntPix.X;
                }
                if (pntRightBot.Y < pntPix.Y)
                {
                    pntRightBot.Y = pntPix.Y;
                }
            }

            return(new Rectangle(pntLeftTop.X, pntLeftTop.Y, pntRightBot.X - pntLeftTop.X, pntRightBot.Y - pntLeftTop.Y));
        }
Beispiel #2
0
        private Rectangle FindJumper(float[,,] matHsv)
        {
            int nHeight = matHsv.GetLength(0);
            int nWidth  = matHsv.GetLength(1);

            List <Point> listTgtPnt = new List <Point>();            //目标点List

            DomainTag[,] matDomTag = new DomainTag[nWidth, nHeight]; //按像素标记连通域的矩阵

            /// 1. 按照HSV阈值标记目标像素
            float[] hsv1 = new float[3] {
                215, 0.07f, 0.20f
            };
            float[] hsv2 = new float[3] {
                265, 0.31f, 0.55f
            };
            for (int i = 0; i < nHeight; ++i)
            {
                for (int j = 0; j < nWidth; ++j)
                {
                    matDomTag[j, i]._IsTarget = false;                    //缺省标记为非目标
                    if ((hsv1[0] <= matHsv[i, j, 0] && matHsv[i, j, 0] <= hsv2[0]) &&
                        (hsv1[1] <= matHsv[i, j, 1] && matHsv[i, j, 1] <= hsv2[1]) &&
                        (hsv1[2] <= matHsv[i, j, 2] && matHsv[i, j, 2] <= hsv2[2]))
                    {
                        matDomTag[j, i]._IsTarget = true;                    //标记为目标
                        matDomTag[j, i]._DomInd   = -1;                      //未标记连通域
                        listTgtPnt.Add(new Point(j, i));                     //加入到目标点List

                        if (mIfDebug)
                        {
                            mBmpDebug.SetPixel(j, i, Color.Red);
                        }
                    }
                }
            }

            /// 2. 8邻域 连通域检测
            List <List <Point> > listDoms = ConnectedDomainDetect(listTgtPnt, matDomTag);        //连通域List

            if (listDoms.Count < 2)
            {
                return(new Rectangle());
            }

            /// 3. 求Jumper矩形
            Point pntLeftTop  = new Point(nWidth, nHeight);
            Point pntRightBot = new Point(0, 0);

            foreach (Point pntPix in listDoms[0])
            {
                if (pntLeftTop.X > pntPix.X)
                {
                    pntLeftTop.X = pntPix.X;
                }
                if (pntLeftTop.Y > pntPix.Y)
                {
                    pntLeftTop.Y = pntPix.Y;
                }

                if (pntRightBot.X < pntPix.X)
                {
                    pntRightBot.X = pntPix.X;
                }
                if (pntRightBot.Y < pntPix.Y)
                {
                    pntRightBot.Y = pntPix.Y;
                }
            }
            foreach (Point pntPix in listDoms[1])
            {
                if (pntLeftTop.X > pntPix.X)
                {
                    pntLeftTop.X = pntPix.X;
                }
                if (pntLeftTop.Y > pntPix.Y)
                {
                    pntLeftTop.Y = pntPix.Y;
                }

                if (pntRightBot.X < pntPix.X)
                {
                    pntRightBot.X = pntPix.X;
                }
                if (pntRightBot.Y < pntPix.Y)
                {
                    pntRightBot.Y = pntPix.Y;
                }
            }

            return(new Rectangle(pntLeftTop.X, pntLeftTop.Y, pntRightBot.X - pntLeftTop.X, pntRightBot.Y - pntLeftTop.Y));
        }