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)); }
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)); }