В настоящее время я работаю над проектом, в котором мне нужно вырезать объекты из технических чертежей. Я закодировал обнаружение краев и для визуализации рисую линию вокруг всех границ, которые могу найти (все еще немного глючит, решу это позже - это не проблема)
Моя проблема в том, что я хочу исключите объекты, которые находятся в другом объекте.
Как вы можете видеть, все кнопки в микроволновой печи исключены, так как вокруг нее есть граница.
Чтобы добиться этого, я беру максимум и Минимальное значение X & Y каждой границы и проверьте, находится ли другая граница между диапазонами, если это так, я исключаю ее.
Реальная проблема I Я смотрю сейчас, хотя, некоторые цифры, такие как "46 см" или "29,6 см", также исключены. Это происходит из-за того, что строки рядом с числами шире и выше, чем цифры, мой алгоритм считает, что числа находятся на их границе.
Следующая картинка прекрасно отражает мою проблему - все исключается, поскольку граница вокруг картинки шире и выше остальных. Но так как он открывается в правом нижнем углу, я не хочу, чтобы что-либо в середине было исключено!
Только если граница была бы закрыта, все внутри должно быть исключено.
Кто-нибудь может дать мне подсказку, как я могу решить такую проблему?
Это функция, которую я использую для фильтрации моих границ.
function filterBorders(borders) {
console.log("Filtering borders..")
var smallX = null;
var smallY = null;
var bigX = null;
var bigY = null;
var coordValues = [];
var indexToDelete = [];
for(var a = 0; a < borders.length; a++){
for(var b = 0; b < borders[a].length; b++){
if(b == 0){
smallX = borders[a][b][0];
bigX = borders[a][b][0];
smallY = borders[a][b][1];
bigY = borders[a][b][1];
}else{
if(borders[a][b][0] < smallX) smallX = borders[a][b][0];
if(borders[a][b][0] > bigX) bigX = borders[a][b][0];
if(borders[a][b][1] < smallY) smallY = borders[a][b][1];
if(borders[a][b][1] > bigY) bigY = borders[a][b][1];
}
}
coordValues.push([smallX, smallY, bigX, bigY]);
}
console.log(coordValues);
for(var a = 0; a < coordValues.length; a++){
for(var b = a+1; b < coordValues.length; b++){
if(coordValues[a][0] > coordValues[b][0] &&
coordValues[a][1] > coordValues[b][1] &&
coordValues[a][2] < coordValues[b][2] &&
coordValues[a][3] < coordValues[b][3]) {
// console.log(a + ' in ' + b);
if(!indexToDelete.includes(a)) indexToDelete.push(a);
}else if(coordValues[a][0] < coordValues[b][0] &&
coordValues[a][1] < coordValues[b][1] &&
coordValues[a][2] > coordValues[b][2] &&
coordValues[a][3] > coordValues[b][3]) {
// console.log(b + ' in ' + a);
if(!indexToDelete.includes(b)) indexToDelete.push(b);
}
}
}
indexToDelete.sort(sortNumber);
console.log(indexToDelete);
// Huge Error, not correctly finding borders IN borders, check micro.png numbers on corners.
var counter = 0;
for(var x = 0; x < indexToDelete.length; x++){
borders.splice(indexToDelete[x]-counter, 1);
counter++;
}
return borders;
}