diff --git a/.gitignore b/.gitignore index 7057677..617cdc1 100644 --- a/.gitignore +++ b/.gitignore @@ -112,3 +112,4 @@ Tongue extraction_cropresizemethod/Tongue extraction/obj/x64/Release/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs Tongue extraction_cropresizemethod/Tongue extraction/obj/x64/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs Tongue extraction_cropresizemethod/Tongue extraction/obj/x64/Release/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +DeepTongue_feature_LabColor/feature_labColor/packages/ 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 dc34846..3b53503 100644 --- a/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/Form_TIASAutomaticShootingSystem.cs +++ b/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/Form_TIASAutomaticShootingSystem.cs @@ -9,7 +9,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.Runtime.InteropServices; -using TensorFlow; using System.Linq; namespace OperateCamera @@ -54,14 +53,15 @@ private void button_ConnectTIAS_Click(object sender, EventArgs e) { // GetImage() - var path_oriImg = @"data_lab\2\Shot0002.bmp"; - var path_calibCsv = @"data_lab\2\Calib.csv"; + var path_oriImg = @"data_lab\d\Shot0001.bmp"; + var path_calibCsv = @"data_lab\d\Calib.csv"; var path_colorMatrixXYZ = "xyz.txt"; using (Mat mat_oriImg = Cv2.ImRead(path_oriImg, ImreadModes.Color)) { // Process_DeepTIAS() - var path_mask = @"data_lab\2\Shot0002_mask.bmp"; + var path_mask = @"data_lab\d\Shot0001_mask.bmp"; Mat mat_finalMask = Cv2.ImRead(path_mask, ImreadModes.GrayScale); + Cv2.Threshold(mat_finalMask, mat_finalMask, 128, 255, ThresholdTypes.Binary); // マスクされた舌領域画像の作成 Mat mat_maskedImg = new Mat(); @@ -70,6 +70,7 @@ // 5点クリック法(2010石川) List list_5points = Get5points(mat_finalMask); + /* // 8領域の取得 List list_8area = Get8area(list_5points); Show8area(mat_oriImg.Clone(), list_8area); @@ -85,7 +86,11 @@ // 保存 Write8colors(list_8Bgr, list_8Lab); + */ + + + // 廃棄 mat_finalMask.Dispose(); mat_maskedImg.Dispose(); @@ -106,7 +111,7 @@ var mat_nonZeroCoordinates = new Mat(); Cv2.FindNonZero(mat_finalMask, mat_nonZeroCoordinates); - // nonZeroの点をすべてlistに詰める + // 舌領域上の点をすべてlistに詰める var list_X = new List(); var list_Y = new List(); for (int i = 0; i < mat_nonZeroCoordinates.Total(); i++) @@ -123,23 +128,112 @@ var p_left = mat_nonZeroCoordinates.At(list_X.IndexOf(list_X.Min())); var p_right = mat_nonZeroCoordinates.At(list_X.IndexOf(list_X.Max())); + // 重心計算 + var moments = Cv2.Moments(mat_finalMask, true); + var moment_x = moments.M10 / moments.M00; + var moment_y = moments.M01 / moments.M00; + Console.WriteLine("moments: {0}, {1}", moment_x, moment_y); + + // 輪郭座標 + OpenCvSharp.Point[][] contours; + HierarchyIndex[] hierarchy; + Cv2.FindContours(mat_finalMask, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); + + // 重心からの輪郭の距離 + double maxDistance_lefttop = 0.0; + double maxDistance_righttop = 0.0; + double maxDistance_bottom = 0.0; + var p_lefttop_ = new OpenCvSharp.Point(); + var p_righttop_ = new OpenCvSharp.Point(); + var p_bottom_ = new OpenCvSharp.Point(); + for (int i = 0; i < contours[0].Length; i++) + { + // 重心より上側 + if (contours[0][i].Y < moment_y) + { + // 重心より上側左側 + if (contours[0][i].X < moment_x) + { + var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + if (distance > maxDistance_lefttop) + { + maxDistance_lefttop = distance; + p_lefttop_ = contours[0][i]; + } + + } + // 重心より上側右側 + if (contours[0][i].X >= moment_x) + { + var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + if (distance > maxDistance_righttop) + { + maxDistance_righttop = distance; + p_righttop_ = contours[0][i]; + } + } + } + else + { + var distance = contours[0][i].DistanceTo(new OpenCvSharp.Point(moment_x, moment_y)); + if (distance > maxDistance_bottom) + { + maxDistance_bottom = distance; + p_bottom_ = contours[0][i]; + } + } + } + + // 舌尖領域を示すy座標を取得(割合を今回は決め打ち) + var y_apex_ = (int)(p_top.Y + ((p_bottom.Y - p_top.Y) * 0.53)); + var p_apex_left_ = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex).Min()); + var p_apex_right_ = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex).Max()); + // 舌尖領域を示すy座標を取得(割合を今回は決め打ち) var y_apex = (int)(p_top.Y + ((p_bottom.Y - p_top.Y) * 0.8)); var p_apex_left = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex).Min()); var p_apex_right = mat_nonZeroCoordinates.At(IndexOfAll(list_Y, y_apex).Max()); // 表示してみる - Cv2.Circle(mat_dst, p_top, 20, new Scalar(255, 0, 0), -1); + 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_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); + Cv2.Circle(mat_dst, p_apex_right, 20, new Scalar(255, 255, 0), -1); + + // 重心と輪郭 + //Cv2.Circle(mat_dst, new OpenCvSharp.Point(moment_x, moment_y), 20, new Scalar(0, 255, 255), -1); + //Cv2.DrawContours(mat_dst, contours, 0, new Scalar(0, 255, 255), 4); + + // new strategy + Cv2.Circle(mat_dst, p_lefttop_, 20, new Scalar(255, 0, 0), -1); + Cv2.Circle(mat_dst, p_righttop_, 20, new Scalar(255, 0, 0), -1); Cv2.Circle(mat_dst, p_bottom, 20, new Scalar(255, 0, 0), -1); - Cv2.Circle(mat_dst, p_left, 20, new Scalar(255, 0, 0), -1); - Cv2.Circle(mat_dst, p_right, 20, new Scalar(255, 0, 0), -1); - Cv2.Circle(mat_dst, p_apex_left, 20, new Scalar(255, 0, 0), -1); - Cv2.Circle(mat_dst, p_apex_right, 20, new Scalar(255, 0, 0), -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, p_apex_left, p_bottom, p_apex_right, p_right }; + + // DEBUG 保存 + bool debug = false; + if (debug) + { + string CSVfilename = "contour.csv"; + FileStream CSV_file = File.Open(CSVfilename, FileMode.OpenOrCreate, FileAccess.Write); + CSV_file.Seek(0, SeekOrigin.Begin); + CSV_file.SetLength(0); + CSV_file.Close(); + StreamWriter CSV_data = new StreamWriter(CSVfilename); + string s = ""; + for (int i = 0; i < contours[0].Length; i++) + { + s = contours[0][i].X.ToString() + "," + contours[0][i].Y.ToString() + ","; + CSV_data.WriteLine(s); + } + CSV_data.Close(); + } // 破棄 mat_dst.Dispose(); @@ -466,10 +560,20 @@ if (Z < 0) Z = 0; // Labに変換(固定の計算式) - // TIAS 光源 - double Xn = 99.5829; + // TIAS 光源 (測定値20201023)  + // double Xn = 99.5829; + // double Yn = 100.0; + // double Zn = 57.1402; + + // Tangさん,竹田さんが使用してた値 (おそらく昔のTIAS光源の測定値) + //double Xn = 102.07; + //double Yn = 100.0; + //double Zn = 79.41; + + // 石川さん,中口先生が使用している値 人口太陽照明? + double Xn = 92.219; double Yn = 100.0; - double Zn = 57.1402; + double Zn = 95.965; double cL = 116.0 * Math.Pow((Y / Yn), 1.0 / 3.0) - 16.0; double ca = 500.0 * (Math.Pow((X / Xn), 1.0 / 3.0) - Math.Pow((Y / Yn), 1.0 / 3.0)); double cb = 200.0 * (Math.Pow((Y / Yn), 1.0 / 3.0) - Math.Pow((Z / Zn), 1.0 / 3.0)); diff --git a/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/deepTIAS_feature_labColor.csproj b/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/deepTIAS_feature_labColor.csproj index bb8638e..436a790 100644 --- a/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/deepTIAS_feature_labColor.csproj +++ b/DeepTongue_feature_LabColor/feature_labColor/newcamera_deeplearning/deepTIAS_feature_labColor.csproj @@ -72,57 +72,6 @@ true - - ..\packages\ICSharpCode.SharpZipLib.dll.0.85.4.369\lib\net20\ICSharpCode.SharpZipLib.dll - True - - - - False - ..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.dll - - - False - ..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.Blob.dll - - - False - ..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.Extensions.dll - - - False - ..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.UserInterface.dll - - - - - - - ..\packages\System.Management.dll.1.0.0\lib\System.Management.dll - True - - - ..\packages\System.ValueTuple.4.4.0\lib\net47\System.ValueTuple.dll - True - - - - - - - - - - - - ..\packages\TensorFlowSharp.1.11.0\lib\net471\TensorFlowSharp.dll - True - - - False - - - Form @@ -185,6 +134,46 @@ Always + + + + + + + + + + + + + + + + + + + + ..\..\..\..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.dll + + + ..\..\..\..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.Blob.dll + + + ..\..\..\..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.Extensions.dll + + + ..\..\..\..\packages\OpenCvSharp3-AnyCPU.3.2.0.20170107\lib\net40\OpenCvSharp.UserInterface.dll + + + + + + + + + + +