public void SetXYpoint(XYpoint NewXYpoint) { this.point_X = NewXYpoint.GetXValue(); this.point_Y = NewXYpoint.GetYValue(); }
public Mat ImageContourMethod(Mat InputMat) { Mat ReturnMat = new Mat(InputMat.Rows, InputMat.Cols, DepthType.Cv8U, 1); // Initialize ReturnMat for (int row_loop = 0; row_loop < InputMat.Rows; row_loop++) { for (int col_loop = 0; col_loop < InputMat.Cols; col_loop++) { var value = InputMat.GetValue(row_loop, col_loop); ReturnMat.SetValue(row_loop, col_loop, (byte)0); } } XYpoint OperationPoint = new XYpoint(0, 0); int loop_num_x = 0, loop_num_y = 0; // Find X1, Y1 for (loop_num_y = 0; loop_num_y < InputMat.Rows; loop_num_y++) // 以for迴圈依序掃描圖像像素 { // 進入for迴圈 for (loop_num_x = 0; loop_num_x < InputMat.Cols; loop_num_x++) // 以for迴圈依序掃描圖像像素 { byte pixel_value = InputMat.GetValue(loop_num_y, loop_num_x); if (pixel_value == BLACK) { OperationPoint.SetXYpoint(loop_num_x, loop_num_y); } } } // 結束for迴圈 Console.WriteLine("X1 = " + OperationPoint.GetXValue().ToString()); Console.WriteLine("Y1 = " + OperationPoint.GetYValue().ToString()); List <XYpoint> MarkedPixels = new List <XYpoint>() { }; MarkedPixels.Add(new XYpoint(OperationPoint)); int CaseNumber = 0; // 上一格編號 while (true) { ReturnMat.SetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue(), (byte)MarkValue); switch (CaseNumber) { case (0): { if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, (int)OperationPoint.GetYValue()); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, (int)OperationPoint.GetYValue()); CaseNumber = 4; } else { CaseNumber = 9; } break; } case (1): { if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint(((int)(OperationPoint.GetXValue())), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, (int)OperationPoint.GetYValue()); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint(OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, (int)OperationPoint.GetYValue()); CaseNumber = 4; } else { CaseNumber = 9; } break; } case (2): { if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, (int)OperationPoint.GetYValue()); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, (int)OperationPoint.GetYValue()); CaseNumber = 4; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else { CaseNumber = 9; } break; } case (3): { if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, (int)OperationPoint.GetYValue()); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, (int)OperationPoint.GetYValue()); CaseNumber = 4; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else { CaseNumber = 9; } break; } case (4): { if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue())); CaseNumber = 4; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else { CaseNumber = 9; } break; } case (5): { if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue())); CaseNumber = 4; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue())); CaseNumber = 8; } else { CaseNumber = 9; } break; } case (6): { if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue())); CaseNumber = 4; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue())); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else { CaseNumber = 9; } break; } case (7): { if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue())); CaseNumber = 4; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue())); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else { CaseNumber = 9; } break; } case (8): { if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 5; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 6; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() + 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() + 1)); CaseNumber = 7; } else if (InputMat.GetValue((int)OperationPoint.GetYValue(), (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue())); CaseNumber = 8; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() + 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() + 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 1; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue()) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue(), ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 2; } else if (InputMat.GetValue((int)OperationPoint.GetYValue() - 1, (int)OperationPoint.GetXValue() - 1) == BLACK) { OperationPoint.SetXYpoint((int)OperationPoint.GetXValue() - 1, ((int)OperationPoint.GetYValue() - 1)); CaseNumber = 3; } else { CaseNumber = 9; } break; } case (9): // Not complete { MarkedPixels.Clear(); // Clear points //***Clear image data*** for (int row_loop = 0; row_loop < InputMat.Rows; row_loop++) { for (int col_loop = 0; col_loop < InputMat.Cols; col_loop++) { ReturnMat.SetValue(row_loop, col_loop, (byte)0); } } return(ReturnMat); } } Console.WriteLine("(" + OperationPoint.GetXValue().ToString() + "," + OperationPoint.GetYValue().ToString() + ")"); Console.WriteLine("CaseNumber = " + CaseNumber.ToString()); try { bool PointAlreadExist = false; foreach (XYpoint item in MarkedPixels) { if ((item.GetXValue() == (int)OperationPoint.GetXValue()) && (item.GetYValue() == (int)OperationPoint.GetYValue())) { PointAlreadExist = true; } } if (PointAlreadExist == false) { MarkedPixels.Add(new XYpoint(OperationPoint)); } else { return(ReturnMat); } } catch (Exception) { throw; } } }