Удалить дубликаты строк после HoughLinesP на Android + OpenCV
Я пытаюсь обнаружить белый прямоугольник на черном изображении. Я использовал HoughLinesP после Canny, и обнаружение точное. Проблема в том, что некоторые линии очень похожи и почти определяют один и тот же край. Таким образом, в матрице, которую возвращает HgouhLinesP, вместо четырех строк у меня больше. Можно ли изменить параметр в HoughLinesP, чтобы он генерировал только 4 строки?
Я попытался реализовать метод, в котором я сравниваю уравнения всех сгенерированных линий, но похоже, что похожие линии имеют очень разные уравнения, и результат неверен. Поэтому я в основном создаю матрицу 4х4 и помещаю в нее первую строку. Затем я сравниваю следующие строки, когда одна из них отличается, я помещаю ее в матрицу 4х4 и т. Д. Я сравниваю остальные строки с теми, которые уже есть в матрице 4х4. Может ли кто-нибудь помочь, пожалуйста?
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++;
}
}
1 ответ
Для тех, кому это может понадобиться, я все разобрался. Я в основном создал две категории со своими линиями, в каждой категории все линии параллельны. Я сделал это, сравнив наклон первой линии со всеми оставшимися линиями. Затем в каждой категории я сравнивал значение B (из уравнения y = Ax+B). Я закончил только с 4 линиями.