2015-12-08 2 views
2

Я пытаюсь обнаружить белый прямоугольник в черном изображении. Я использовал HoughLinesP после Canny, и обнаружение было точным. Проблема в том, что некоторые линии очень похожи и почти одинаковы. Таким образом, в матрице, возвращаемой HgouhLinesP, вместо 4 строк у меня больше. Можно ли изменить параметр в HoughLinesP, чтобы он генерировал только 4 строки?Удалите повторяющиеся строки после HoughLinesP на Android + OpenCV

Я попытался реализовать метод, в котором я сравниваю уравнения всех сгенерированных линий, но похожие строки, похоже, имеют очень разные уравнения, и результат неверен. Поэтому в основном я создаю матрицу 4x4 и помещаю первую строчку в нее. Затем я сравниваю следующие строки, когда один из них отличается от другого, я помещаю его в матрицу 4x4 и т. Д. Я сравниваю остальные строки с теми, которые уже находятся в матрице 4x4. Может ли кто-нибудь помочь?

Imgproc.Canny(diff, diff2, 100, 100, 3); 

     Mat lines = new Mat(); 
     int threshold = 80; 
     int minLineSize = 150; 
     int lineGap = 80; 
     Imgproc.HoughLinesP(diff2, lines, 1, Math.PI/180, threshold, minLineSize, lineGap); 
     double[][] linesFinal = new double[4][4]; 
     linesFinal[0] = lines.get(0, 0); 

     double x01 = linesFinal[0][0], 
       y01 = linesFinal[0][1], 
       x02 = linesFinal[0][2], 
       y02 = linesFinal[0][3]; 
     double a = y02 - y01/x02 - x01; 
     double b = y01 - a * x01; 
     Log.i(TAG, "aaaaaaaaaaaaaaaaaaaaa: " + String.valueOf(a) + "bbbbbbbbbb  " + String.valueOf(b)); 
     Point start0 = new Point(x01, y01); 
     Point end0 = new Point(x02, y02); 

     Core.circle(finaleuh, end0, 10, new Scalar(255, 0, 0, 255), 10); 
     Core.circle(finaleuh, start0, 10, new Scalar(255, 0, 0, 255), 10); 

     int index = 1; 
     int x = 1; 


     while (index < 4 && x < lines.cols()) { 

      // Log.i(TAG,"xxxxxxxxxxxxxxxx: "+ String.valueOf(x)+" indeeeeeex  "+ String.valueOf(index)); 
      double[] vec = lines.get(0, x); 
      double Xi1 = vec[0], 
        Yi1 = vec[1], 
        Xi2 = vec[2], 
        Yi2 = vec[3]; 
      double Ai = (Yi2 - Yi1)/(Xi2 - Xi1); 
      double Bi = Yi1 - Ai * Xi1; 
      // Log.i(TAG,"aaaaaaaaaaaaaaaaaaaaa: "+ String.valueOf(Ai)+ "bbbbbbbbbb  " + String.valueOf(Bi)); 

      int counter = 0; 
      for (int i = 0; i < index; i++) 

      { 

       double xF = linesFinal[i][0], 
         yF = linesFinal[i][1], 
         xFF = linesFinal[i][2], 
         yFF = linesFinal[i][3]; 


       double aF = yFF - yF/xFF - xF; 
       double bF = yF - aF * xF; 
       Log.i(TAG, "aaaaaaaaaaaaaaaaaaaaa: " + String.valueOf(aF) + "bbbbbbbbbb  " + String.valueOf(bF)); 

       double diffFA = Math.abs(aF - Ai); 
       double diffFB = Math.abs(bF - Bi); 

       if (diffFA > 250 && diffFB > 300) { 
        counter = counter + 1; 


       } 

      } 


      if (counter == index) 


      { 
       linesFinal[index] = vec; 
       double xF = linesFinal[index][0], 
         yF = linesFinal[index][1], 
         xFF = linesFinal[index][2], 
         yFF = linesFinal[index][3]; 

       Point startF = new Point(xF, yF); 
       Point endF = new Point(xFF, yFF); 
       Core.circle(finaleuh, endF, 10, new Scalar(255, 0, 0, 255), 10); 
       Core.circle(finaleuh, startF, 10, new Scalar(255, 0, 0, 255), 10); 
       index++; 
       x++; 
      } else { 
       x++; 
      } 


     } 

ответ

0

Для тех, кому это может понадобиться, я все-таки разобрался. Я в основном создал две категории с моими линиями, в каждой категории все линии параллельны. Я сделал это, сравнив наклон первой строки со всеми оставшимися строками. Затем в каждой категории я сравнивал значение B (по уравнению y = Ax + B). Я закончил с 4 линиями.