private void BorderGrid_CellValueChanged(object sender, DataGridViewCellEventArgs e) { int flag = 0; int feathernum = borderRegion.Count; borderRegion.Clear(); showborder.Clear(); while (flag < feathernum) { Numberborder tmp = new Numberborder(); int pointX = int.Parse(BorderdataGrid.Rows[flag].Cells[0].Value.ToString()); int pointY = int.Parse(BorderdataGrid.Rows[flag].Cells[1].Value.ToString()); tmp.start = new Point(pointX, pointY); tmp.size = templetFlag.templetSize; //tmp.FeatherName = BorderdataGrid.Rows[flag].Cells[3].Value.ToString(); borderRegion.Add(tmp); Point tmpPoint = new Point((int)(pointX * Math.Pow(2, SizeChangecount)), (int)(pointY * Math.Pow(2, SizeChangecount))); tmp.start = tmpPoint; tmp.size = new Size((int)(templetFlag.templetSize.Width * Math.Pow(2, SizeChangecount)), (int)(templetFlag.templetSize.Height * Math.Pow(2, SizeChangecount))); // tmp.end = tmpPoint; showborder.Add(tmp); flag++; } picturebox.Invalidate(); }
private void pictureBox_MouseDown(object sender, MouseEventArgs e) { Point pt = new Point(e.X, e.Y); if (e.Button == MouseButtons.Left && isSreenShot) { startpoint = pt; startdraw = true; } else if (e.Button == MouseButtons.Left && isaddFeather) //点击添加特征点状态 { Rectangle rec = new Rectangle(pt.X, pt.Y, featherSize.Width, featherSize.Height); featherRgnstruct tmpfeather = new featherRgnstruct(); tmpfeather.featherNum = defaultValue; tmpfeather.rec = rec; Graphics g = (sender as PictureBox).CreateGraphics(); if (FeatherdataGrid.Rows.Count < NumberPoints*10)//特征点上限不超过300个 { g.DrawRectangle(Pens.Blue, new Rectangle(rec.X - (featherSize.Width - 1) / 2, rec.Y - (featherSize.Height - 1) / 2, featherSize.Width, featherSize.Height)); FeatherdataGrid.Rows.Add(tmpfeather.rec.X, tmpfeather.rec.Y, tmpfeather.featherNum); showfeature.Add(tmpfeather); tmpfeather.rec.X = (int)(tmpfeather.rec.X * Math.Pow(2, -SizeChangecount)); tmpfeather.rec.Y = (int)(tmpfeather.rec.Y * Math.Pow(2, -SizeChangecount)); featherRegion.Add(tmpfeather); //UpdataTemplet(); } g.Dispose(); } else if (e.Button == MouseButtons.Left && isaddNumborder) //点击添加识别区域 { if (BorderdataGrid.Rows.Count < 10) { Rectangle rec = new Rectangle(pt, new Size((int)(templetFlag.templetSize.Width * Math.Pow(2, SizeChangecount)), (int)(templetFlag.templetSize.Height * Math.Pow(2, SizeChangecount)))); Graphics g = (sender as PictureBox).CreateGraphics(); g.DrawRectangle(Pens.Blue, rec); Numberborder tmpnumberborder = new Numberborder(); tmpnumberborder.start = new Point((int)(pt.X * Math.Pow(2, -SizeChangecount)), (int)(pt.Y * Math.Pow(2, -SizeChangecount))); tmpnumberborder.size = templetFlag.templetSize; //tmpnumberborder.FeatherName = CurrentTempletName; borderRegion.Add(tmpnumberborder); BorderdataGrid.Rows.Add(tmpnumberborder.start.X, tmpnumberborder.start.Y, CurrentTempletName); tmpnumberborder.start = pt; tmpnumberborder.size = rec.Size; showborder.Add(tmpnumberborder); //识别区域模板 g.Dispose(); } } else if (e.Button == MouseButtons.Left && isMeasureLen) { startMeasure = true; measureStartPoint = new Point((int)(e.X * Math.Pow(2, -SizeChangecount)), (int)(e.Y * Math.Pow(2, -SizeChangecount))); } else if (e.Button == MouseButtons.Right) { #region 右击改变特征点的值 #endregion } if (isDrawTemplate) //进入绘制模板边框状态 { templetLoc = new Point(e.X, e.Y); //记录模板开始的点 SetTemplettextBox2.Text = e.X.ToString() + "," + e.Y.ToString(); CurrentTemplet = new Point(e.X, e.Y); startDrawTemplet = true; //正在进行模板绘制 } picturebox.Invalidate(); }
//将特征点数据保存到feather.h文件中 private void SaveFeather() { StreamWriter streamwriter; string alltext = null; string data = null; int count = 0; string VersonNum = "0,"; string IsGray = "0,"; if (File.Exists(savePath + "\\feather.h")) File.Delete(savePath + "\\feather.h"); streamwriter = File.CreateText(savePath + "\\" + "feather.h"); alltext += VersonNum; alltext += IsGray; alltext += CameraData; try { leftX = borderRegion.First().start.X; leftY = borderRegion.First().start.Y; rightX = borderRegion.First().start.X + borderRegion.First().size.Width; rightY = borderRegion.First().start.Y + borderRegion.First().size.Height; foreach (Numberborder tmp in borderRegion) { if (tmp.start.Y + borderRegion.First().size.Height > rightY) { rightY = tmp.start.Y + borderRegion.First().size.Height; } if (tmp.start.X + borderRegion.First().size.Width > rightX) { rightX = tmp.start.X + borderRegion.First().size.Width; } if (tmp.start.X < leftX) { leftX = tmp.start.X; } if (tmp.start.Y < leftY) { leftY = tmp.start.Y; } } } catch { if (bmp != null) { leftX = 0; leftY = 0; rightX = bmp.Size.Width; rightY = bmp.Size.Height; } } alltext += leftX.ToString() + ',' + leftY.ToString() + ',' + rightX.ToString() + ',' + rightY.ToString() ; while (count < 10) //每次识别最多识别十个数字 { Numberborder tmp = new Numberborder(); //tmp.FeatherName = null; if (borderRegion.Count > 0) //一次设计选择的识别区域均用一套模板来识别 { tmp = borderRegion.First(); borderRegion.Remove(tmp); alltext +=","+ tmp.start.X.ToString()+"," + tmp.start.Y.ToString()+"," + tmp.size.Width.ToString()+"," + tmp.size.Height.ToString(); } else { alltext += ",0,0,0,0"; } for (int i = 0; i < NumberPoints*10; i++) alltext +=","+ templetFlag.feathers.featherPoints[i].rec.X.ToString()+"," + templetFlag.feathers.featherPoints[i].rec.Y.ToString() + ","+ templetFlag.feathers.featherPoints[i].Pixel.ToString()+"," + templetFlag.feathers.featherPoints[i].featherNum.ToString(); count++; } data += " image_data_packet_desc_type image_data_packet_desc={" + alltext + "};"; streamwriter.WriteLine(data); streamwriter.Close(); }
//右击删除表格内数据 private void deleteToolStripMenuItem_Click(object sender, EventArgs e) { try { Numberborder flagfeather = new Numberborder(); flagfeather.start = new Point(int.Parse(BorderdataGrid.CurrentRow.Cells[0].Value.ToString()), int.Parse(BorderdataGrid.CurrentRow.Cells[1].Value.ToString())); List<Numberborder> tmpfeatherList1 = new List<Numberborder>(); foreach (Numberborder tmp in showborder) { if (flagfeather.start.Equals(tmp.start)) { } else { tmpfeatherList1.Add(tmp); } } //borderRegion = tmpfeatherList; showborder = tmpfeatherList1; //tmpfeatherList.Clear(); List<Numberborder> tmpfeatherList2 = new List<Numberborder>(); foreach (Numberborder tmp in borderRegion) { Numberborder numberborder = new Numberborder(); numberborder.start = new Point((int)(tmp.start.X * Math.Pow(2, -SizeChangecount)), (int)(tmp.start.Y * Math.Pow(2, SizeChangecount))); //numberborder.end = new Point((int)(tmp.end.X * Math.Pow(2, -SizeChangecount)), (int)(tmp.end.Y * Math.Pow(2, SizeChangecount))); if (flagfeather.Equals(numberborder)) { } else { tmpfeatherList2.Add(tmp); } } borderRegion = tmpfeatherList2; BorderdataGrid.Rows.Remove(BorderdataGrid.CurrentRow); picturebox.Invalidate(); } catch (Exception ex) { } }