diff --git a/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/Form_TIASAutomaticShootingSystem.cs b/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/Form_TIASAutomaticShootingSystem.cs index 16436f0..39ce937 100644 --- a/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/Form_TIASAutomaticShootingSystem.cs +++ b/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/Form_TIASAutomaticShootingSystem.cs @@ -48,13 +48,13 @@ private void button_ConnectTIAS_Click(object sender, EventArgs e) { // GetImage() - var path_oriImg = @"data_lab\d\Shot0001.bmp"; - var path_calibCsv = @"data_lab\d\Calib.csv"; + var path_oriImg = @"data_lab\f\Shot0001.bmp"; + var path_calibCsv = @"data_lab\f\Calib.csv"; var path_colorMatrixXYZ = "xyz.txt"; using (Mat mat_oriImg = Cv2.ImRead(path_oriImg, ImreadModes.Color)) { // Process_DeepTIAS() - var path_mask = @"data_lab\d\Shot0001_mask.bmp"; + var path_mask = @"data_lab\f\Shot0001_mask.bmp"; Mat mat_finalMask = Cv2.ImRead(path_mask, ImreadModes.Grayscale); Cv2.Threshold(mat_finalMask, mat_finalMask, 128, 255, ThresholdTypes.Binary); @@ -129,7 +129,7 @@ // 表示してみる //Cv2.Circle(mat_dst, p_top, 20, new Scalar(255, 255, 0), -1); - Cv2.Circle(mat_dst, p_bottom, 20, new Scalar(255, 255, 0), -1); + //Cv2.Circle(mat_dst, p_bottom, 20, new Scalar(255, 255, 0), -1); //Cv2.Circle(mat_dst, p_left, 20, new Scalar(255, 255, 0), -1); //Cv2.Circle(mat_dst, p_right, 20, new Scalar(255, 255, 0), -1); //Cv2.Circle(mat_dst, p_apex_left, 20, new Scalar(255, 255, 0), -1); @@ -145,7 +145,9 @@ OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(mat_finalMask, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); - + var maxArea = contours.Select(n => Cv2.ContourArea(n)).Max(); + var maxContour = contours.Where(n => Cv2.ContourArea(n) == maxArea).ToList()[0]; + // 重心-輪郭の距離 double maxDistance_lefttop = 0.0; double maxDistance_righttop = 0.0; @@ -154,40 +156,40 @@ var p_right_2 = new OpenCvSharp.Point(); var p_bottom_2 = new OpenCvSharp.Point(); // 距離が最も遠いものを採択 - for (int i = 0; i < contours[0].Length; i++) + for (int i = 0; i < maxContour.Count(); i++) { // 重心より上側 - if (contours[0][i].Y < moment_y) + if (maxContour[i].Y < moment_y) { // 重心より上側左側 - if (contours[0][i].X < moment_x) + if (maxContour[i].X < moment_x) { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_lefttop) { maxDistance_lefttop = distance; - p_left_2 = contours[0][i]; + p_left_2 = maxContour[i]; } } // 重心より上側右側 - if (contours[0][i].X >= moment_x) + if (maxContour[i].X >= moment_x) { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_righttop) { maxDistance_righttop = distance; - p_right_2 = contours[0][i]; + p_right_2 = maxContour[i]; } } } else { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_bottom) { maxDistance_bottom = distance; - p_bottom_2 = contours[0][i]; + p_bottom_2 = maxContour[i]; } } } @@ -195,17 +197,17 @@ // 舌尖領域を示すy座標を取得(割合を今回は決め打ち) var y_top_avg_ = (p_left_2.Y + p_right_2.Y) / 2.0; var y_apex_2 = (int)(y_top_avg_ + ((p_bottom_2.Y - y_top_avg_) * 0.53)); - var p_apex_left_2 = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex_2).Min()); - var p_apex_right_2 = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex_2).Max()); + //var p_apex_left_2 = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex_2).Min()); + //var p_apex_right_2 = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex_2).Max()); // 表示 - //Cv2.Circle(mat_dst, p_left_2, 20, new Scalar(255, 0, 0), -1); - //Cv2.Circle(mat_dst, p_right_2, 20, new Scalar(255, 0, 0), -1); - Cv2.Circle(mat_dst, p_bottom_2, 20, new Scalar(255, 0, 0), -1); + Cv2.Circle(mat_dst, p_left_2, 20, new Scalar(255, 0, 0), -1); + Cv2.Circle(mat_dst, p_right_2, 20, new Scalar(255, 0, 0), -1); + //Cv2.Circle(mat_dst, p_bottom_2, 20, new Scalar(255, 0, 0), -1); //Cv2.Circle(mat_dst, p_apex_left_2, 20, new Scalar(255, 0, 0), -1); //Cv2.Circle(mat_dst, p_apex_right_2, 20, new Scalar(255, 0, 0), -1); - Cv2.Circle(mat_dst, new OpenCvSharp.Point(moment_x, moment_y), 10, new Scalar(200, 60, 200), -1); //重心 - //Cv2.DrawContours(mat_dst, contours, 0, new Scalar(0, 255, 255), 4); // 輪郭 + //Cv2.Circle(mat_dst, new OpenCvSharp.Point(moment_x, moment_y), 10, new Scalar(200, 60, 200), -1); //重心 + //Cv2.DrawContours(mat_dst, maxContours, 0, new Scalar(0, 255, 255), 4); // 輪郭 /// method3 // 重心とtopの中点を算出する @@ -251,15 +253,15 @@ //Cv2.Circle(mat_dst, p_bottomToCoG_right, 20, new Scalar(0, 100, 255), -1); //Cv2.Circle(mat_dst, p_bottomToCoG_center, 20, new Scalar(0, 0, 255), -1); //Cv2.Line(mat_dst, new OpenCvSharp.Point(0, lefty), new OpenCvSharp.Point(mat_finalMask.Cols - 1, righty), new Scalar(0, 100, 255)); //近似直線 - Cv2.Circle(mat_dst, p_bottom_3, 20, new Scalar(0, 0, 255), -1); + //Cv2.Circle(mat_dst, p_bottom_3, 20, new Scalar(0, 0, 255), -1); // DEBUG Cv2.NamedWindow("dst", WindowMode.KeepRatio ^ WindowMode.AutoSize); Cv2.ImShow("dst", mat_dst.Resize(new OpenCvSharp.Size((int)mat_dst.Width * 0.5, (int)mat_dst.Height * 0.5))); // 出力 - // li_dst = new List { p_left, p_apex_left, p_bottom, p_apex_right, p_right }; - li_dst = new List { p_left_2, p_apex_left_2, p_bottom_2, p_apex_right_2, p_right_2 }; + li_dst = new List { p_left, p_apex_left, p_bottom, p_apex_right, p_right }; + //li_dst = new List { p_left_2, p_apex_left_2, p_bottom_2, p_apex_right_2, p_right_2 }; // 破棄 mat_dst.Dispose(); diff --git a/Tongue extraction_cropresizemethod/Tongue extraction/ColorExtractor.cs b/Tongue extraction_cropresizemethod/Tongue extraction/ColorExtractor.cs index 071abc5..1545988 100644 --- a/Tongue extraction_cropresizemethod/Tongue extraction/ColorExtractor.cs +++ b/Tongue extraction_cropresizemethod/Tongue extraction/ColorExtractor.cs @@ -93,37 +93,38 @@ OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(mat_finalMask, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); + var sortedContour = contours.OrderByDescending(n => Cv2.ContourArea(n)).ToList(); + var maxContour = sortedContour[0]; // 重心-輪郭の距離 double maxDistance_lefttop = 0.0; double maxDistance_righttop = 0.0; var p_left_2 = new OpenCvSharp.Point(); var p_right_2 = new OpenCvSharp.Point(); - // 距離が最も遠いものを採択 - for (int i = 0; i < contours[0].Length; i++) + for (int i = 0; i < maxContour.Length; i++) { // 重心より上側 - if (contours[0][i].Y < moment_y) + if (maxContour[i].Y < moment_y) { // 重心より上側左側 - if (contours[0][i].X < moment_x) + if (maxContour[i].X < moment_x) { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_lefttop) { maxDistance_lefttop = distance; - p_left_2 = contours[0][i]; + p_left_2 = maxContour[i]; } } // 重心より上側右側 - if (contours[0][i].X >= moment_x) + if (maxContour[i].X >= moment_x) { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_righttop) { maxDistance_righttop = distance; - p_right_2 = contours[0][i]; + p_right_2 = maxContour[i]; } } } @@ -162,6 +163,8 @@ OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(mat_finalMask, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); + var sortedContour = contours.OrderByDescending(n => Cv2.ContourArea(n)).ToList(); + var maxContour = sortedContour[0]; // 重心-輪郭の距離 double maxDistance_lefttop = 0.0; @@ -169,30 +172,30 @@ var p_left_3 = new OpenCvSharp.Point(); var p_right_3 = new OpenCvSharp.Point(); // 距離が最も遠いものを採択 - for (int i = 0; i < contours[0].Length; i++) + for (int i = 0; i < maxContour.Length; i++) { // 重心より上側 - if (contours[0][i].Y < moment_y) + if (maxContour[i].Y < moment_y) { // 重心より上側左側 - if (contours[0][i].X < moment_x) + if (maxContour[i].X < moment_x) { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_lefttop) { maxDistance_lefttop = distance; - p_left_3 = contours[0][i]; + p_left_3 = maxContour[i]; } } // 重心より上側右側 - if (contours[0][i].X >= moment_x) + if (maxContour[i].X >= moment_x) { - var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + var distance = maxContour[i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); if (distance > maxDistance_righttop) { maxDistance_righttop = distance; - p_right_3 = contours[0][i]; + p_right_3 = maxContour[i]; } } } @@ -220,7 +223,7 @@ var mat_contour = new Mat(mat_finalMask.Size(), MatType.CV_8UC1, 0); var mat_and = new Mat(mat_finalMask.Size(), MatType.CV_8UC1, 0); Cv2.Line(mat_centerline, new OpenCvSharp.Point(0, lefty), new OpenCvSharp.Point(mat_finalMask.Cols - 1, righty), 3); - Cv2.DrawContours(mat_contour, contours, 0, 3); + Cv2.DrawContours(mat_contour, sortedContour, 0, 3); Cv2.BitwiseAnd(mat_centerline, mat_contour, mat_and); Cv2.FindNonZero(mat_and, mat_and); var bottom_y_3 = 0; diff --git a/Tongue extraction_cropresizemethod/Tongue extraction/Form1.Designer.cs b/Tongue extraction_cropresizemethod/Tongue extraction/Form1.Designer.cs index 0cd08c7..04f5071 100644 --- a/Tongue extraction_cropresizemethod/Tongue extraction/Form1.Designer.cs +++ b/Tongue extraction_cropresizemethod/Tongue extraction/Form1.Designer.cs @@ -429,7 +429,7 @@ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(1, 2, 1, 2); this.Name = "Form1"; - this.Text = "DeepTIAS1.8"; + this.Text = "DeepTIAS1.9"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); this.Load += new System.EventHandler(this.Form1_Load); ((System.ComponentModel.ISupportInitialize)(this.pictureBox_extraction)).EndInit(); diff --git a/Tongue extraction_cropresizemethod/Tongue extraction/Form1.cs b/Tongue extraction_cropresizemethod/Tongue extraction/Form1.cs index 9efc8dd..a6fa5d0 100644 --- a/Tongue extraction_cropresizemethod/Tongue extraction/Form1.cs +++ b/Tongue extraction_cropresizemethod/Tongue extraction/Form1.cs @@ -722,8 +722,8 @@ pictureBox_outputSRG.Refresh(); }); label4.BackColor = Color.White; - label5.BackColor = Color.Red; + // バウンディングボックスのサイズに舌分割結果をリサイズ // この時に2値じゃなくなってるみたい Cv2.Resize(mat_outputSRG, mat_outputChanged, mat_roisize.Size()); @@ -852,7 +852,7 @@ using (MemoryStream ms = new MemoryStream()) { // ディレクトリglobの取得 - var glob_dir = Directory.GetDirectories(@"D:\kei2\Study\Tongue\TongueColorAnalysis\automaze5click\Dataset"); + var glob_dir = Directory.GetDirectories(@"D:\kei2\Study\Tongue\TongueColorAnalysis\automaze5click\Process"); for (int a = 0; a < glob_dir.Length; a++) { @@ -1055,18 +1055,23 @@ Cv2.Resize(mat_outputSRG, mat_outputChanged, mat_roisize.Size()); mat_outputChanged.SaveImage(path_base + "\\output_resized" + "\\" + name_image); - // 入力と同じサイズでマスクを作成 - mat_mask = new Mat(mat_input.Size(), MatType.CV_8UC1, 1); - for (int i = P1.Y; i < P2.Y; i++) + // 入力と同じサイズでマスクを作成(なんかたまに不安定.resizeで微妙にサイズ変わってrange overしれるかも) + // 気休め + Thread.Sleep(100); + GC.Collect(); + + mat_mask = new Mat(mat_input.Size(), MatType.CV_8UC1, 0); + var y_mask = 0; + for (int y = P1.Y; y < P2.Y; y++) { - for (int j = P1.X; j < P2.X; j++) + var x_mask = 0; + for (int x = P1.X; x < P2.X; x++) { - int pix = mat_outputChanged.At(mmp, pmm); - mat_mask.Set(i, j, pix); - pmm++; + int pix = mat_outputChanged.At(y_mask, x_mask); + mat_mask.Set(y, x, pix); + x_mask++; } - mmp++; - pmm = 0; + y_mask++; } mmp = 0; Cv2.Resize(mat_mask, mat_mask, mat_input.Size()); @@ -1233,7 +1238,10 @@ private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Console.WriteLine("file closing"); - sw.Close(); + if (sw != null) + { + sw.Close(); + } Console.WriteLine("file closed"); }