NodeJS Canvas - Как определить, закрыта ли граница? - PullRequest
0 голосов
/ 17 апреля 2020

В настоящее время я работаю над проектом, в котором мне нужно вырезать объекты из технических чертежей. Я закодировал обнаружение краев и для визуализации рисую линию вокруг всех границ, которые могу найти (все еще немного глючит, решу это позже - это не проблема)

Моя проблема в том, что я хочу исключите объекты, которые находятся в другом объекте.

Как вы можете видеть, все кнопки в микроволновой печи исключены, так как вокруг нее есть граница.

Чтобы добиться этого, я беру максимум и Минимальное значение X & Y каждой границы и проверьте, находится ли другая граница между диапазонами, если это так, я исключаю ее.

Borders

Реальная проблема I Я смотрю сейчас, хотя, некоторые цифры, такие как "46 см" или "29,6 см", также исключены. Это происходит из-за того, что строки рядом с числами шире и выше, чем цифры, мой алгоритм считает, что числа находятся на их границе.

Следующая картинка прекрасно отражает мою проблему - все исключается, поскольку граница вокруг картинки шире и выше остальных. Но так как он открывается в правом нижнем углу, я не хочу, чтобы что-либо в середине было исключено!

Только если граница была бы закрыта, все внутри должно быть исключено.

Кто-нибудь может дать мне подсказку, как я могу решить такую ​​проблему?

Example

Это функция, которую я использую для фильтрации моих границ.

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;
}
...