|
@@ -20,6 +20,8 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
public List<DisplayField> m_list_allDfield = null;
|
|
|
public ResultFile resultFile = null;
|
|
|
public SaveFileDialog sfd = null;
|
|
|
+ public DataTable ParticleData = new DataTable();
|
|
|
+ public DataTable ParticleClassData = new DataTable();
|
|
|
public int type = 0;
|
|
|
/// <summary>
|
|
|
/// 获取每行图片的位置配合opencv方法使用
|
|
@@ -34,12 +36,15 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
foreach (var f in m_list_allDfield)
|
|
|
{
|
|
|
DataRow dr = picDatat.NewRow();
|
|
|
- dr["X"] = f.GetShowRect().X;
|
|
|
- dr["Y"] = f.GetShowRect().Y;
|
|
|
+
|
|
|
+ dr["X"] = f.OTSCoordinatePos.X;
|
|
|
+ dr["Y"] = f.OTSCoordinatePos.Y;
|
|
|
+ //dr["X"] = f.GetShowRect().X;
|
|
|
+ //dr["Y"] = f.GetShowRect().Y;
|
|
|
picDatat.Rows.Add(dr);
|
|
|
}
|
|
|
- int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
|
|
|
- int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
|
|
|
+ //int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
|
|
|
+ //int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
|
|
|
DataTable total_dt_X = picDatat.Copy();
|
|
|
DataView dv_x = total_dt_X.DefaultView;
|
|
|
DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
|
|
@@ -60,27 +65,32 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
DataTable data = new DataTable();
|
|
|
data.Columns.Add("mat", typeof(Bitmap));
|
|
|
data.Columns.Add("X", typeof(double));
|
|
|
+ data.Columns.Add("Y", typeof(double));
|
|
|
for (int a = 0; a < total_dt_X.Rows.Count; a++)
|
|
|
{
|
|
|
DataRow dr2 = data.NewRow();
|
|
|
- Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
|
|
|
+ Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
|
|
|
+
|
|
|
+ //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
|
|
|
Graphics g = Graphics.FromImage(bitmap);
|
|
|
g.Clear(Color.White);
|
|
|
g.Dispose();
|
|
|
dr2["mat"] = bitmap;
|
|
|
dr2["X"] = total_dt_X.Rows[a]["X"];
|
|
|
+ //dr2["Y"] = total_dt_X.Rows[a]["Y"];
|
|
|
data.Rows.Add(dr2);
|
|
|
}
|
|
|
foreach (var f in m_list_allDfield)
|
|
|
{
|
|
|
- if (total_dt_Y.Rows[i]["Y"].ToString() == f.GetShowRect().Y.ToString())
|
|
|
+ if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
|
|
|
{
|
|
|
for (int c = 0; c < data.Rows.Count; c++)
|
|
|
{
|
|
|
- if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString())
|
|
|
+ if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
|
|
|
{
|
|
|
data.Rows[c]["mat"] = f.OriginalImage;
|
|
|
- data.Rows[c]["X"] = f.GetShowRect().X;
|
|
|
+ data.Rows[c]["X"] = f.OTSCoordinatePos.X;
|
|
|
+ data.Rows[c]["Y"] = f.OTSCoordinatePos.Y;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -98,33 +108,119 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
|
|
|
return list_dt_picdata;
|
|
|
}
|
|
|
- public void opencv_outpic(/*int type*/)
|
|
|
+ public void opencv_outpic()
|
|
|
{
|
|
|
+
|
|
|
+
|
|
|
List<DataTable> list_dt_picdata = new List<DataTable>();
|
|
|
+ OpenCvSharp.Mat[] list_mats;
|
|
|
if (type == (int)Outpic_enum.pic)
|
|
|
{
|
|
|
list_dt_picdata = opencv_piclist();
|
|
|
+ list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
|
|
|
}
|
|
|
else
|
|
|
- if (type == (int)Outpic_enum.Render_pic)
|
|
|
+ //if (type == (int)Outpic_enum.Render_pic)
|
|
|
{
|
|
|
list_dt_picdata = opencv_piclist_Render();
|
|
|
+ list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count + 1];
|
|
|
}
|
|
|
|
|
|
- OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
|
|
|
+ //OpenCvSharp.Mat[] list_mats = new OpenCvSharp.Mat[list_dt_picdata.Count];
|
|
|
NLog.LogManager.GetCurrentClassLogger().Info("Organize and splice all pictures......");
|
|
|
- for (int i = 0; i < list_dt_picdata.Count; i++)
|
|
|
+
|
|
|
+ List<OpenCvSharp.Mat> list_pano = new List<OpenCvSharp.Mat>();
|
|
|
+
|
|
|
+ //循环保存每行拼接的图片
|
|
|
+ for (int i = list_dt_picdata.Count-1; i >= 0; i--)
|
|
|
{
|
|
|
+ //拼接同一行中的图片
|
|
|
OpenCvSharp.Mat[] mats = new OpenCvSharp.Mat[list_dt_picdata[i].Rows.Count];
|
|
|
for (int a = 0; a < list_dt_picdata[i].Rows.Count; a++)
|
|
|
{
|
|
|
mats[a] = OpenCvSharp.Extensions.BitmapConverter.ToMat((Bitmap)list_dt_picdata[i].Rows[a]["mat"]);
|
|
|
}
|
|
|
OpenCvSharp.Mat pano = new OpenCvSharp.Mat();
|
|
|
+
|
|
|
+
|
|
|
OpenCvSharp.Cv2.HConcat(mats, pano);
|
|
|
- list_mats[i] = pano;
|
|
|
+ list_pano.Add(pano);
|
|
|
+ //list_mats[i] = pano;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //导出原图(渲染图)在下方增加每种颜色的标注和面积占比
|
|
|
+ if (type == (int)Outpic_enum.Render_pic)
|
|
|
+ {
|
|
|
+ DataTable particleData = ParticleDataIntegration(ParticleData, ParticleClassData);
|
|
|
+ int NumberOfRows = getPICstringLong(particleData, list_pano);
|
|
|
+
|
|
|
+
|
|
|
+ Bitmap bitmap = new Bitmap(list_pano[0].Width, NumberOfRows*140);
|
|
|
+
|
|
|
+ Graphics g = Graphics.FromImage(bitmap);
|
|
|
+ g.Clear(Color.White);
|
|
|
+ int rowData = 10;
|
|
|
+
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //矩形格子宽500
|
|
|
+
|
|
|
+ SolidBrush mysbrush1 = new SolidBrush(ColorTranslator.FromHtml("#000000"));
|
|
|
+ Pen mypen = new Pen(mysbrush1, 2);
|
|
|
+ Font myFont = new Font("宋体", 13, FontStyle.Bold);
|
|
|
+ SolidBrush sbrush = new SolidBrush(Color.Black);
|
|
|
+ int Color_Y = 10; int TypeName_Y = 40; int Prozentsatz_Y = 100;int Area_Y = 70;
|
|
|
+ int Gitter_X = 10;
|
|
|
+ picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
|
|
|
+
|
|
|
+
|
|
|
+ Gitter_X = Gitter_X + 350;
|
|
|
+ for (int i = 0; i < particleData.Rows.Count; i++)
|
|
|
+ {
|
|
|
+ if (Gitter_X+350> list_pano[0].Width)
|
|
|
+ {
|
|
|
+ rowData = rowData + 130;
|
|
|
+ picKopfzeile(mypen, myFont, sbrush, g, 10, rowData);
|
|
|
+ Color_Y = Color_Y + 130;
|
|
|
+ TypeName_Y = TypeName_Y + 130;
|
|
|
+ Prozentsatz_Y = Prozentsatz_Y + 130;
|
|
|
+ Area_Y = Area_Y + 130;
|
|
|
+ Gitter_X = 360;
|
|
|
+ }
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
|
|
|
+
|
|
|
+ SolidBrush mysbrush = new SolidBrush(ColorTranslator.FromHtml("#" + particleData.Rows[i]["Color"].ToString()));
|
|
|
+ g.FillRectangle(mysbrush, Gitter_X + 1, Color_Y + 1, 348, 28);
|
|
|
+ g.DrawString(particleData.Rows[i]["TypeName"].ToString(), myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
|
|
|
+ g.DrawString(particleData.Rows[i]["Area"].ToString(), myFont, sbrush, Gitter_X + 1, Area_Y + 2);
|
|
|
+ g.DrawString(particleData.Rows[i]["Percentage"].ToString()+"%", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
|
|
|
+
|
|
|
+ Gitter_X = Gitter_X + 350;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ g.Dispose();
|
|
|
+ //bitmap.Save("D:\\1.bmp");
|
|
|
+
|
|
|
+
|
|
|
+ OpenCvSharp.Mat pano = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);
|
|
|
+ list_pano.Add(pano);
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for (int i = 0; i < list_pano.Count; i++)
|
|
|
+ {
|
|
|
+ list_mats[i] = list_pano[i];
|
|
|
+ }
|
|
|
+
|
|
|
NLog.LogManager.GetCurrentClassLogger().Info("Picture splicing completed.");
|
|
|
NLog.LogManager.GetCurrentClassLogger().Info("Save to disk......");
|
|
|
OpenCvSharp.Mat save_pano = new OpenCvSharp.Mat();
|
|
@@ -132,7 +228,90 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
OpenCvSharp.Cv2.ImWrite(sfd.FileName, save_pano);
|
|
|
NLog.LogManager.GetCurrentClassLogger().Info("Save complete.");
|
|
|
}
|
|
|
-
|
|
|
+ private int getPICstringLong(DataTable particleData, List<OpenCvSharp.Mat> list_pano)
|
|
|
+ {
|
|
|
+ int Long = 1;
|
|
|
+ int Gitter_X = 10;
|
|
|
+ for (int i = 0; i < particleData.Rows.Count; i++)
|
|
|
+ {
|
|
|
+ if (Gitter_X + 350 > list_pano[0].Width)
|
|
|
+ {
|
|
|
+ Long = Long + 1;
|
|
|
+ Gitter_X = 10;
|
|
|
+ }
|
|
|
+ Gitter_X = Gitter_X + 350;
|
|
|
+ }
|
|
|
+ return Long;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void picKopfzeile(Pen mypen, Font myFont, SolidBrush sbrush, Graphics g ,int X,int Y)
|
|
|
+ {
|
|
|
+
|
|
|
+ int Color_Y = Y; int TypeName_Y = Y+30; int Prozentsatz_Y = Y + 90; int Area_Y = Y+ 60;
|
|
|
+ int Gitter_X = X;
|
|
|
+
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, Color_Y, 350, 30);
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, TypeName_Y, 350, 30);
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, Area_Y, 350, 30);
|
|
|
+ g.DrawRectangle(mypen, Gitter_X, Prozentsatz_Y, 350, 30);
|
|
|
+ g.DrawString("Color", myFont, sbrush, Gitter_X + 1, Color_Y + 2);
|
|
|
+ g.DrawString("TypeName", myFont, sbrush, Gitter_X + 1, TypeName_Y + 2);
|
|
|
+ g.DrawString("Area", myFont, sbrush, Gitter_X + 1, Area_Y + 2);
|
|
|
+ g.DrawString("Prozentsatz", myFont, sbrush, Gitter_X + 1, Prozentsatz_Y + 2);
|
|
|
+ }
|
|
|
+ private DataTable ParticleDataIntegration(DataTable ParticleAll,DataTable ParticleClass)
|
|
|
+ {
|
|
|
+ DataTable dt = ParticleClass.Copy();
|
|
|
+ dt.Columns.Add("Area", typeof(float));
|
|
|
+ dt.Columns.Add("Percentage");
|
|
|
+ dt.Columns.Add("Color");
|
|
|
+ double ParticleAreaTotal = 0;
|
|
|
+ for (int i=0;i< ParticleAll.Rows.Count;i++)
|
|
|
+ {
|
|
|
+ ParticleAreaTotal = ParticleAreaTotal + Convert.ToDouble(ParticleAll.Rows[i]["Area"]);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i=0;i< dt.Rows.Count;i++)
|
|
|
+ {
|
|
|
+ double ParticleArea = 0;
|
|
|
+ double ParticleColer = 0;
|
|
|
+ for (int a=0;a< ParticleAll.Rows.Count;a++)
|
|
|
+ {
|
|
|
+ if (dt.Rows[i]["TypeName"].ToString()== ParticleAll.Rows[a]["TypeName"].ToString())
|
|
|
+ {
|
|
|
+ ParticleArea = ParticleArea + Convert.ToDouble(ParticleAll.Rows[a]["Area"]);
|
|
|
+ ParticleColer = Convert.ToDouble(ParticleAll.Rows[a]["TypeColor"]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dt.Rows[i]["Area"] = ParticleArea;
|
|
|
+ dt.Rows[i]["Percentage"] = ParameterNormalization(ParticleAreaTotal, ParticleArea);
|
|
|
+ dt.Rows[i]["Color"] = ParticleColer;
|
|
|
+ }
|
|
|
+ return dt;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 参数归一化
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="a_mi">总数</param>
|
|
|
+ /// <param name="m">传参</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private string ParameterNormalization(double a_mi, double m)
|
|
|
+ {
|
|
|
+ double ColVal = Convert.ToDouble(m / a_mi * 100);
|
|
|
+ if (ColVal == 0)
|
|
|
+ {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ return Math.Round(ColVal, 2).ToString();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private List<DataTable> opencv_piclist_Render()
|
|
|
{
|
|
|
List<DataTable> list_dt_picdata = new List<DataTable>();
|
|
@@ -143,12 +322,11 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
foreach (var f in m_list_allDfield)
|
|
|
{
|
|
|
DataRow dr = picDatat.NewRow();
|
|
|
- dr["X"] = f.GetShowRect().X;
|
|
|
- dr["Y"] = f.GetShowRect().Y;
|
|
|
+ dr["X"] = f.OTSCoordinatePos.X;
|
|
|
+ dr["Y"] = f.OTSCoordinatePos.Y;
|
|
|
picDatat.Rows.Add(dr);
|
|
|
}
|
|
|
- int y_max = Convert.ToInt32(picDatat.Compute("Max(Y)", "true"));
|
|
|
- int y_min = Convert.ToInt32(picDatat.Compute("Min(Y)", "true"));
|
|
|
+
|
|
|
DataTable total_dt_X = picDatat.Copy();
|
|
|
DataView dv_x = total_dt_X.DefaultView;
|
|
|
DataView dv_x_2 = dv_x.ToTable(true, "X").DefaultView;
|
|
@@ -162,7 +340,7 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
dv_Y_2.Sort = "Y ASC";
|
|
|
total_dt_Y = dv_Y_2.ToTable();
|
|
|
|
|
|
-
|
|
|
+ //循环每一行图片
|
|
|
for (int i = 0; i < total_dt_Y.Rows.Count; i++)
|
|
|
{
|
|
|
NLog.LogManager.GetCurrentClassLogger().Info("Splice line" + i + 1.ToString() + "of" + total_dt_Y.Rows.Count.ToString() + ".....");
|
|
@@ -170,10 +348,14 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
DataTable data = new DataTable();
|
|
|
data.Columns.Add("mat", typeof(Bitmap));
|
|
|
data.Columns.Add("X", typeof(double));
|
|
|
+ //循环每行图片进行拼接
|
|
|
for (int a = 0; a < total_dt_X.Rows.Count; a++)
|
|
|
{
|
|
|
DataRow dr2 = data.NewRow();
|
|
|
- Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
|
|
|
+
|
|
|
+ Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].OriginalImage.Width, (int)m_list_allDfield[0].OriginalImage.Height);
|
|
|
+
|
|
|
+ //Bitmap bitmap = new Bitmap((int)m_list_allDfield[0].GetShowRect().Width, (int)m_list_allDfield[0].GetShowRect().Height);
|
|
|
Graphics g = Graphics.FromImage(bitmap);
|
|
|
g.Clear(Color.White);
|
|
|
g.Dispose();
|
|
@@ -181,13 +363,15 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
dr2["X"] = total_dt_X.Rows[a]["X"];
|
|
|
data.Rows.Add(dr2);
|
|
|
}
|
|
|
+ //循环所有图片
|
|
|
foreach (var f in m_list_allDfield)
|
|
|
{
|
|
|
- if (total_dt_Y.Rows[i]["Y"].ToString() == f.GetShowRect().Y.ToString())
|
|
|
+ if (total_dt_Y.Rows[i]["Y"].ToString() == f.OTSCoordinatePos.Y.ToString())
|
|
|
{
|
|
|
+ //循环图片的行数
|
|
|
for (int c = 0; c < data.Rows.Count; c++)
|
|
|
{
|
|
|
- if (data.Rows[c]["X"].ToString() == f.GetShowRect().X.ToString())
|
|
|
+ if (data.Rows[c]["X"].ToString() == f.OTSCoordinatePos.X.ToString())
|
|
|
{
|
|
|
Bitmap image = new Bitmap(f.OriginalImage.Width, f.OriginalImage.Height);
|
|
|
Graphics g2 = Graphics.FromImage(image);
|
|
@@ -227,13 +411,15 @@ namespace OTSIncAReportApp._3_ServiceCenter
|
|
|
}
|
|
|
}
|
|
|
data.Rows[c]["mat"] = image;
|
|
|
- data.Rows[c]["X"] = f.GetShowRect().X;
|
|
|
+ data.Rows[c]["X"] = f.OTSCoordinatePos.X;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
DataView dataView1 = data.DefaultView;
|
|
|
dataView1.Sort = "X ASC";
|
|
|
data = dataView1.ToTable();
|