Advertisement
Guest User

Edge Recalculation VFinal

a guest
Dec 12th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.96 KB | None | 0 0
  1.  static public Dictionary<Tuple<int, int>, int[]> EdgeRecalculation(Image<Bgr, byte> img, Image<Bgr, byte> imgCpy, Dictionary<int, double[]> obj_list, Dictionary<Tuple<int, int>, int[]> piece_resemblance, int macro, Tuple<int, int> micro)
  2.         {
  3.             unsafe
  4.             {
  5.                 MIplImage final = img.MIplImage;
  6.                 MIplImage copy = imgCpy.MIplImage;
  7.                 byte* dataPtr = (byte*)final.imageData.ToPointer();   // Pointer to the final image
  8.                 byte* dataPtrCpy = (byte*)copy.imageData.ToPointer();   // Pointer to the original image
  9.                 byte* sqr1Ptr, sqr2Ptr, AuxPtr;
  10.                 byte* dataPtrStatic = dataPtr;
  11.                 int nChan = final.nChannels;
  12.                 int widthStep = final.widthStep;
  13.  
  14.                 Tuple<int, int> piecesCombination;      // key piece_resemblance
  15.                 List<int> keyList = new List<int>(obj_list.Keys);
  16.                 int[] labelArray = new int[keyList.Count];
  17.  
  18.                 double edgeSize1, edgeSize2;
  19.                 double n, m, u, v;
  20.                 int i, t;
  21.                 int gray1, gray2;
  22.  
  23.                 if (obj_list.Count < 2)
  24.                     return null;
  25.  
  26.                 foreach (Tuple<int, int> pieceIteration in piece_resemblance.Keys.ToList())
  27.                 {
  28.                     if (pieceIteration.Item1 == micro.Item1
  29.                             || pieceIteration.Item1 == micro.Item2
  30.                             || pieceIteration.Item2 == micro.Item1
  31.                             || pieceIteration.Item2 == micro.Item2)
  32.                         piece_resemblance.Remove(pieceIteration);
  33.                 }
  34.  
  35.                 i = 0;
  36.                 // Pass label values from list to array
  37.                 foreach (int keyIterator in keyList)
  38.                 {
  39.                     labelArray[i] = keyIterator;
  40.                     i++;
  41.                 }
  42.  
  43.                 for (i = 0; i < labelArray.Length; i++)
  44.                 {
  45.                     if (labelArray[i] != macro)
  46.                     {
  47.                         if (labelArray[i] < macro)
  48.                             piecesCombination = new Tuple<int, int>(labelArray[i], macro);
  49.                         else
  50.                             piecesCombination = new Tuple<int, int>(macro, labelArray[i]);
  51.  
  52.                         // Get the corners for each object
  53.                         obj_list.TryGetValue(piecesCombination.Item1, out double[] corners1);
  54.                         obj_list.TryGetValue(piecesCombination.Item2, out double[] corners2);
  55.  
  56.                         if (corners1[5] == 0)
  57.                             sqr1Ptr = dataPtrCpy;
  58.                         else
  59.                             sqr1Ptr = dataPtr;
  60.  
  61.                         if (corners2[5] == 0)
  62.                             sqr2Ptr = dataPtrCpy;
  63.                         else
  64.                             sqr2Ptr = dataPtr;
  65.  
  66.                         // Edge difference created here to generate a 'new' variable. Otherwise, it would overwrite the other edges.
  67.                         // Init with max contrast
  68.                         // [0] Left edge; [1] Right edge; [2] Top edge; [3] Bottom edge;
  69.                         int[] edgeDiff = new int[4] { 255, 255, 255, 255 };            // value piece_resemblance
  70.  
  71.                         // ----------------------------------------------------------   Left & Right edges
  72.                         //   Left edges
  73.                         edgeSize1 = corners1[3] - corners1[1] + 1;
  74.                         edgeSize2 = corners2[3] - corners2[1] + 1;
  75.  
  76.                         if (edgeSize1 == edgeSize2) // Level2. Length of edge must be the same
  77.                         {
  78.                             for (t = 0; t < edgeSize1; t++)  // Iterate along the edge
  79.                             {
  80.                                 n = corners1[1];
  81.                                 v = corners2[1];
  82.  
  83.                                 // Left side x -> Right side x
  84.                                 m = corners1[0];
  85.                                 u = corners2[2];
  86.  
  87.                                 AuxPtr = sqr1Ptr + (int)(n + t) * widthStep + (int)m * nChan;
  88.                                 gray1 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  89.                                 AuxPtr = sqr2Ptr + (int)(v + t) * widthStep + (int)u * nChan;
  90.                                 gray2 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  91.  
  92.                                 edgeDiff[0] += Math.Abs(gray1 - gray2);
  93.  
  94.                                 // Right side x -> Left side x
  95.                                 m = corners1[2];
  96.                                 u = corners2[0];
  97.  
  98.                                 AuxPtr = sqr1Ptr + (int)(n + t) * widthStep + (int)m * nChan;
  99.                                 gray1 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  100.                                 AuxPtr = sqr2Ptr + (int)(v + t) * widthStep + (int)u * nChan;
  101.                                 gray2 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  102.  
  103.                                 edgeDiff[1] += Math.Abs(gray1 - gray2);
  104.                             }
  105.                             // Get the average difference of values between edges
  106.                             edgeDiff[0] = (int)Math.Round((edgeDiff[0] - 255) / edgeSize1); // [0 ... 255]
  107.                             edgeDiff[1] = (int)Math.Round((edgeDiff[1] - 255) / edgeSize1); // [0 ... 255]
  108.                         }
  109.  
  110.                         // ----------------------------------------------------------   Top & Bottom edges
  111.                         //   Top edges
  112.                         edgeSize1 = corners1[2] - corners1[0] + 1;
  113.                         edgeSize2 = corners2[2] - corners2[0] + 1;
  114.  
  115.                         if (edgeSize1 == edgeSize2) // Level2. Length of edge must be the same
  116.                         {
  117.                             for (t = 0; t < edgeSize1; t++)  // Iterate along the edge
  118.                             {
  119.                                 m = corners1[0];
  120.                                 u = corners2[0];
  121.  
  122.                                 // Top side y -> Bottom side y
  123.                                 n = corners1[1];
  124.                                 v = corners2[3];
  125.  
  126.                                 AuxPtr = sqr1Ptr + (int)n * widthStep + (int)(m + t) * nChan;
  127.                                 gray1 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  128.                                 AuxPtr = sqr2Ptr + (int)v * widthStep + (int)(u + t) * nChan;
  129.                                 gray2 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  130.  
  131.                                 edgeDiff[2] += Math.Abs(gray1 - gray2);
  132.  
  133.                                 // Bottom side y -> Top side y
  134.                                 n = corners1[3];
  135.                                 v = corners2[1];
  136.  
  137.                                 AuxPtr = sqr1Ptr + (int)n * widthStep + (int)(m + t) * nChan;
  138.                                 gray1 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  139.                                 AuxPtr = sqr2Ptr + (int)v * widthStep + (int)(u + t) * nChan;
  140.                                 gray2 = (int)Math.Round((AuxPtr[0] + AuxPtr[1] + AuxPtr[2]) / 3.0);
  141.  
  142.                                 edgeDiff[3] += Math.Abs(gray1 - gray2);
  143.                             }
  144.                             // Get the average difference of values between edges
  145.                             edgeDiff[2] = (int)Math.Round((edgeDiff[2] - 255) / edgeSize1); // [0 ... 255]
  146.                             edgeDiff[3] = (int)Math.Round((edgeDiff[3] - 255) / edgeSize1); // [0 ... 255]
  147.                         }
  148.  
  149.                         // Store comparison with edge difference
  150.                         piece_resemblance.Add(piecesCombination, edgeDiff);
  151.                     }
  152.                 }
  153.                 return piece_resemblance;
  154.             }
  155.         } // End of Edge Recalculation
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement