public void Copy(HandRegion region) { this.rect = region.rect; this.innerRect = region.innerRect; this.colorEnergy = region.colorEnergy; this.motionEnergy = region.motionEnergy; }
private int addNewHandRegion(HandRegion newRegion, List<HandRegion> regionList) { if( newRegion.GetEnergy() < 0 ) return -1; if (regionList.Count < 1) { regionList.Add(newRegion); return -1; } if (regionList.Count >= 3 && newRegion.GetEnergy() < regionList[0].GetEnergy()) return -1; for(int i = 0; i < regionList.Count; ++i) { if(newRegion.rect.IntersectsWith(regionList[i].rect)) { Rectangle intersectRec = Rectangle.Intersect(newRegion.rect, regionList[i].rect); int AreaInter = intersectRec.Width * intersectRec.Height; int AreaNew = newRegion.rect.Width * newRegion.rect.Height; int AreaList = regionList[i].rect.Width * regionList[i].rect.Height; if(AreaInter > 0.5 * AreaNew || AreaInter > 0.5 * AreaList) { if (newRegion.GetEnergy() > regionList[i].GetEnergy()) return i; else return -1; } } } if(regionList.Count < 3) { regionList.Add(newRegion); return -1; } return 0; }
private List<HandRegion> getHandRect(Image<Gray,double> colProb, Image<Gray,double> motionProb) { List<HandRegion> handRegions = new List<HandRegion>(); for (int i = 0; i < 3; ++i) { HandRegion region = new HandRegion(new Rectangle(0, 0, 0, 0), new Rectangle(0, 0, 0, 0), 0, 0); handRegions.Add(region); } double colorRatio = 1 / 2.0; double motionRatio = 1 / 2.0; int largestSize = regionSize[0] / 4; HandRegion biggest = null; double sum = 0; for (int row = largestSize; row < colProb.Height - largestSize; ++row) for (int col = largestSize; col < colProb.Width - largestSize; ++col) { for (int i = 0; i < regionSize.Length; ++i) { int size = regionSize[i]; int innerColorSize = (int)(size * colorRatio); int innerMotionSize = (int)(size * motionRatio); Rectangle innerColorRect = new Rectangle(col - innerColorSize / 2, row - innerColorSize / 2, innerColorSize, innerColorSize); Rectangle innerMotionRect = new Rectangle(col - innerMotionSize / 2, row - innerMotionSize / 2, innerMotionSize, innerMotionSize); double innerColorSum = getSum(colProb, innerColorRect); double innerMotionSum = getSum(motionProb, innerMotionRect); Rectangle rect = new Rectangle(col - size / 2, row - size / 2, size, size); double outColorSum = getSum(colProb, rect); double outMotionSum = getSum(motionProb, rect); double colorEnergy = 2 * innerColorSum - outColorSum; double motionEnergy = 2 * innerMotionSum - outMotionSum; if(colorEnergy + motionEnergy > handRegions[0].GetEnergy()) { handRegions[0].Copy(new HandRegion(rect, innerColorRect, colorEnergy, motionEnergy)); handRegions.Sort(); } //test // if(colorEnergy > 0 && motionEnergy > 0) //{ // double energy = colorEnergy + motionEnergy; // HandRegion newRegion = new HandRegion(rect, innerColorRect, 2 * innerColorSum - outColorSum, 2 * innerMotionSum - outMotionSum); // int index = this.addNewHandRegion2(newRegion, handRegions); // if (index != -1) // handRegions[index].Copy(newRegion); // handRegions.Sort(); //} //end of test } } return handRegions; }