0

У меня есть входное изображение, которое выглядит следующим образом:Обнаружить местонахождение (ы) объектов на изображении

input image

Обратите внимание, что есть 6 коробок с черными границами. Мне нужно определить местоположение (верхний левый порядок) каждого окна. Обычно я бы использовал что-то вроде template matching, но содержимое (цветная область внутри черной границы) каждого окна отличается.

Есть ли версия соответствия шаблонов, которая может быть сконфигурирована так, чтобы игнорировать внутреннюю область каждого окна? Является ли алгоритм более подходящим для этой ситуации?

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

Реальный пример/ввода изображения по запросу:

input image

+1

Не можете ли вы просто вычислить ограничительную рамку подключенных компонентов? – Miki

+0

@Miki Я новичок в распознавании объектов. Сможете ли вы указать мне в правильном направлении относительно предложенного вами алгоритма? – RobertJoseph

+0

Вы программируете на C++? – Miki

ответ

5

Вы можете сделать это найти ограничительную рамку компонент связности.

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

enter image description here

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

enter image description here

Код:

#include <opencv2/opencv.hpp> 
#include <vector> 
using namespace cv; 
using namespace std; 

int main() 
{ 
    // Load the image, as BGR 
    Mat3b img = imread("path_to_image"); 

    // Convert to gray scale 
    Mat1b gray; 
    cvtColor(img, gray, COLOR_BGR2GRAY); 

    // Get binary mask 
    Mat1b binary = (gray == 0); 

    // Find contours of connected components 
    vector<vector<Point>> contours; 
    findContours(binary.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); 

    // For each contour 
    for (int i = 0; i < contours.size(); ++i) 
    { 
     // Get the bounding box 
     Rect box = boundingRect(contours[i]); 

     // Draw the box on the original image in red 
     rectangle(img, box, Scalar(0, 0, 255), 5); 
    } 

    // Show result 
    imshow("Result", img); 
    waitKey(); 

    return 0; 
} 

Из образа публикуемую в чате, этот код производит:

enter image description here

В общем , этот код будет правильно определять карты, а также шум. Вам просто нужно удалить шум в соответствии с некоторыми критериями. Среди прочего: размер или соотношение сторон ящиков, цвета внутри ящиков, некоторые данные текстуры.

Смежные вопросы