Browse Source

优化边界颗粒合并代码

zty 2 years ago
parent
commit
577c5e8cd0

+ 59 - 0
OTSIncAMeasureApp/ServiceCenter/CImageHandler.cs

@@ -764,6 +764,65 @@ namespace OTSModelSharp.ServiceInterface
             public Mat im;//图像信息
         }
 
+        /// <summary>
+        /// 横向拼图
+        /// </summary>
+        public Mat StitchImageXGrid(int min_w, int type, Mat newImg1, Mat newImg2)
+        {
+            MStitch mStitch = new MStitch();
+            mStitch.Pwidth = newImg1.Width;
+            mStitch.Pheight = newImg1.Height;
+            mStitch.W_min = min_w - 50;
+            mStitch.W_max = min_w + 50;
+            mStitch.H_min = newImg1.Height;
+            mStitch.minval = 255;
+            mStitch.im = newImg1;
+
+            ImageParam imageParam = Fun_Match(newImg2, mStitch);
+            imageParam.im = newImg2;
+
+            if (type == 2)
+            {
+                return Fun_Stitch(imageParam);
+            }
+            else
+            {
+                return Fun_StitchRGB(imageParam);
+            }
+        }
+
+
+        /// <summary>
+        /// 纵向拼图
+        /// </summary>
+        public Mat StitchImageYGrid(int min_w, int type, Mat newImg1, Mat newImg2)
+        {
+            Cv2.Transpose(newImg1, newImg1);
+            Cv2.Flip(newImg1, newImg1, FlipMode.X);
+
+            Cv2.Transpose(newImg2, newImg2);
+            Cv2.Flip(newImg2, newImg2, FlipMode.X);
+
+            MStitch mStitch = new MStitch();
+            mStitch.Pwidth = newImg1.Width;
+            mStitch.Pheight = newImg1.Height;
+            mStitch.W_min = min_w - 50;
+            mStitch.W_max = min_w + 50;
+            mStitch.H_min = newImg1.Height;
+            mStitch.minval = 255;
+            mStitch.im = newImg1;
+
+            ImageParam imageParam = Fun_Match(newImg2, mStitch);
+            imageParam.im = newImg2;
+
+            Mat result = type == 2 ? Fun_Stitch(imageParam) : Fun_StitchRGB(imageParam);
+
+            Cv2.Transpose(result, result);
+            Cv2.Flip(result, result, FlipMode.Y);
+
+            return result;
+        }
+
         /// <summary>
         /// 横向拼图
         /// </summary>

+ 18 - 2
OTSIncAReportApp/1-UI/Control_Grids/ParticlesGridDevidePage.cs

@@ -817,14 +817,30 @@ namespace OTSIncAReportGrids
                                 Bitmap tempbit = Particledata.ReadImageFile(imagePatht);
                                 int pixw = tempbit.Width;
                                 double xs = pixw / ScanFieldSize;
+                                //取得方向
+                                Dictionary<string, object> sampleMembers = ((Dictionary<string, object>)((Dictionary<string, object>)resultFile.ResultInfo["Sample"])["Members"]);
+                                Dictionary<string, object> ImageProcessParam = (Dictionary<string, object>)((Dictionary<string, object>)((Dictionary<string, object>)sampleMembers["MsrParams"])["Members"])["ImageProcessParam"];
+                                Dictionary<string, object> SEMStageData = (Dictionary<string, object>)result.ResultInfo["SEMStageData"];
+                                string leftOrRight = SEMStageData["xAxisDir"].ToString().Split(':')[1];
+                                string downOrUp = SEMStageData["yAxisDir"].ToString().Split(':')[1];
+                                string isCombin = ImageProcessParam["PartCombin"].ToString();
+                                string overlap = ImageProcessParam["OverlapParam"].ToString();
 
                                 particleM = particleM + "," + subt;
-                                Bitmap bmap = Particledata.GetBitmapForBig(subt, xs, result.FilePath, tempbit.Height, tempbit.Width);
+                                Bitmap bmap = null;
+                                if (isCombin == "true")
+                                {
+                                    bmap = Particledata.GetBitmapForBigCombin(subt, xs, result.FilePath, tempbit.Height, tempbit.Width, leftOrRight, downOrUp, overlap);
+                                }
+                                else
+                                {
+                                    bmap = Particledata.GetBitmapForBig(subt, xs, result.FilePath, tempbit.Height, tempbit.Width);
+                                }
+
                                 if (bmap != null)
                                 {
                                     string[] str = subt.Split(',');
                                     bmap.Tag = new List<string>() { str[0].Split(':')[0], str[0].Split(':')[1], particles.Rows[i]["TypeId"].ToString() };
-                                    //dgV_ParticlesDevidePage.Rows[add_rowindex].Height = 150;
                                     dgV_ParticlesDevidePage.Rows[add_rowindex].Height = bmap.Height + 20; ;
                                     dgV_ParticlesDevidePage.Rows[add_rowindex].Cells[k].Value = bmap;
                                     dgV_ParticlesDevidePage.Rows[add_rowindex].Cells[k].Style.BackColor = Color.Azure;

+ 163 - 1
OTSIncAReportApp/3-ServiceCenter/DataOperation/DataAccess/ParticleData.cs

@@ -1,4 +1,6 @@
-using OTSCommon.Model;
+using OpenCvSharp;
+using OTSCommon.Model;
+using OTSModelSharp.ServiceInterface;
 using System;
 using System.Collections.Generic;
 using System.Data;
@@ -572,6 +574,166 @@ namespace OTSIncAReportApp.DataOperation.DataAccess
             return DT;
         }
 
+        public DataTable GetSegment(string fieldId, string xrayId)
+        {
+            string sqlp = @"select * from Segment where FieldId = " + fieldId + " and XRayId = " + xrayId + "";
+
+            DataTable DT = dbHelper.ExecuteDataTable(sqlp, null);
+            return DT;
+        }
+
+        public Mat GetBseImg(Mat mat1, Mat mat2, string overlap, int style)
+        {
+            CImageHandler cImageHandler = new CImageHandler();
+            if (style == 1)
+            {
+                return cImageHandler.StitchImageXGrid(int.Parse(overlap), 2, mat1, mat2);
+            }
+            else
+            {
+                return cImageHandler.StitchImageYGrid(int.Parse(overlap), 2, mat1, mat2);
+            }
+        }
+
+        public Bitmap GetBitmapForBigCombin(string sub, double xs, string path, int picHeight, int picWidth, string leftOrRight, string downOrUp, string overlap)
+        {
+            string vs = "," + sub.Replace(':', '-') + ",";
+
+            DataTable dataTable = GetParticleAll(vs);
+            if (dataTable.Rows.Count == 0)
+            {
+                return null;
+            }
+
+            if (dataTable.Rows.Count == 2)
+            {
+                string imagePath1 = path + "\\FIELD_FILES\\" + "Field" + dataTable.Rows[0]["fieldid"].ToString() + ".bmp";
+                DataRow item1 = dataTable.Rows[0];
+                Mat mat1 = new Mat(picHeight, picWidth, MatType.CV_8UC1, new Scalar(0));
+                Mat mat1_bse = new Mat(imagePath1, ImreadModes.Grayscale);
+                DataTable segmentList1 = GetSegment(item1["FieldId"].ToString(), item1["XrayId"].ToString());
+                foreach (DataRow item in segmentList1.Rows)
+                {
+                    Cv2.Line(mat1, new OpenCvSharp.Point(Convert.ToInt64(item["Start"]), Convert.ToInt64(item["Height"])), new OpenCvSharp.Point(Convert.ToInt64(item["Start"]) + Convert.ToInt64(item["Length"]), Convert.ToInt64(item["Height"])), Scalar.White, 2, LineTypes.AntiAlias);
+                }
+
+                string imagePath2 = path + "\\FIELD_FILES\\" + "Field" + dataTable.Rows[1]["fieldid"].ToString() + ".bmp";
+                DataRow item2 = dataTable.Rows[1];
+                Mat mat2 = new Mat(picHeight, picWidth, MatType.CV_8UC1, new Scalar(0));
+                Mat mat2_bse = new Mat(imagePath2, ImreadModes.Grayscale);
+                DataTable segmentList2 = GetSegment(item2["FieldId"].ToString(), item2["XrayId"].ToString());
+                foreach (DataRow item in segmentList2.Rows)
+                {
+                    Cv2.Line(mat2, new OpenCvSharp.Point(Convert.ToInt64(item["Start"]), Convert.ToInt64(item["Height"])), new OpenCvSharp.Point(Convert.ToInt64(item["Start"]) + Convert.ToInt64(item["Length"]), Convert.ToInt64(item["Height"])), Scalar.White, 2, LineTypes.AntiAlias);
+                }
+
+                Mat result = new Mat();
+                Mat result_bse = new Mat();
+                int style = -1;
+                overlap = "150";
+
+                if (item1["FieldPosX"] == item2["FieldPosX"])
+                {
+                    style = 2;
+                    if (Convert.ToInt64(item1["FieldPosY"]) > Convert.ToInt64(item2["FieldPosY"]))
+                    {
+                        if (downOrUp == "UP_TOWARD")//向上为正
+                        {
+                            Cv2.VConcat(mat2, mat1, result);
+                            result_bse = GetBseImg(mat2_bse, mat1_bse, overlap, style);
+                        }
+                        else
+                        {
+                            Cv2.VConcat(mat1, mat2, result);
+                            result_bse = GetBseImg(mat1_bse, mat2_bse, overlap, style);
+                        }
+                    }
+                    else
+                    {
+                        if (downOrUp == "UP_TOWARD")//向上为正
+                        {
+                            Cv2.VConcat(mat1, mat2, result);
+                            result_bse = GetBseImg(mat1_bse, mat2_bse, overlap, style);
+                        }
+                        else
+                        {
+                            Cv2.VConcat(mat2, mat1, result);
+                            result_bse = GetBseImg(mat2_bse, mat1_bse, overlap, style);
+                        }
+                    }
+
+                }
+                else if(item1["FieldPosY"] == item2["FieldPosY"])
+                {
+                    style = 1;
+                    if (Convert.ToInt64(item1["FieldPosX"]) > Convert.ToInt64(item2["FieldPosX"]))
+                    {
+                        if (downOrUp == "RIGHT_TOWARD")//向右为正
+                        {
+                            Cv2.HConcat(mat1, mat2, result);
+                            result_bse = GetBseImg(mat1_bse, mat2_bse, overlap, style);
+                        }
+                        else
+                        {
+                            Cv2.HConcat(mat2, mat1, result);
+                            result_bse = GetBseImg(mat2_bse, mat1_bse, overlap, style);
+                        }
+                    }
+                    else
+                    {
+                        if (downOrUp == "RIGHT_TOWARD")//向右为正
+                        {
+                            Cv2.HConcat(mat2, mat1, result);
+                            result_bse = GetBseImg(mat2_bse, mat1_bse, overlap, style);
+                        }
+                        else
+                        {
+                            Cv2.HConcat(mat1, mat2, result);
+                            result_bse = GetBseImg(mat1_bse, mat2_bse, overlap, style);
+                        }
+                    }
+                }
+                mat1_bse.Dispose();
+                mat2_bse.Dispose();
+
+                OpenCvSharp.Point[][] contours;
+                HierarchyIndex[] hierarchy;
+                Cv2.FindContours(result, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxNone, null);
+                using (new Window("InputImage", WindowMode.Normal, result_bse))
+                {
+                    Cv2.WaitKey(0);
+                }
+                if (contours.Count() == 1)
+                {
+                    Rect minRect = Cv2.BoundingRect(contours[0]);//外接矩形
+                    if (style == 1)
+                    {
+                        minRect.Y -= 20;
+                        minRect.X -= int.Parse(overlap);
+                        minRect.Width += int.Parse(overlap);
+                        minRect.Height += 20;
+                    }
+                    else
+                    {
+                        minRect.Y -= int.Parse(overlap);
+                        minRect.X -= int.Parse(overlap);
+                        minRect.Width += int.Parse(overlap);
+                        minRect.Height += int.Parse(overlap);
+                    }
+
+                    result_bse = new Mat(result_bse, minRect);
+
+                    return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(result_bse);
+                }
+                else
+                {
+                    return null;
+                }
+            }
+
+            return null;
+        }
+
         public Bitmap GetBitmapForBig(string sub, double xs, string path,int picHeight,int picWidth)
         {
             string vs = "," + sub.Replace(':', '-') + ",";