Обнаружение маленьких квадратов, прикрепленных к чему-то еще на изображении

Я хочу обнаружить маленькие квадраты, обведенные красным на изображении. Но проблема в том, что они находятся на другой белой линии. Я хочу знать, как отделить эти квадраты от белой линии и обнаружить их.

Обнаруживаемые квадраты обведены красным

Я использовал OpenCV Python для написания кода. Что я сделал до сих пор, так это то, что я обрезал изображение, чтобы получить доступ только к круглой части изображения. Затем я обрезал изображение, чтобы получить необходимую часть — белую линию. Затем я использовал эрозию, чтобы белая линия исчезла, а квадраты остались на изображении. Затем использовали круги Хафа для обнаружения квадратов. Это работает для некоторых изображений, но не может быть обобщено. Пожалуйста, помогите мне найти общий код для этого. Дайте мне знать логику, а также код Python. Обрезанное изображение с ареной(кольцом)

Обрезанное изображение с белой линией

Эродированное изображение с остатками тех 8 квадратов после эрозии

Окончательное изображение с обнаруженными квадратами

Также может ли кто-нибудь помочь мне обнаружить этот маркер aruco на изображении. Его отвергают. Я не знаю почему. Изображение находится в этой ссылке. Обнаружение маленьких квадратов на изображении


person Roshan Nayak    schedule 26.01.2020    source источник
comment
вы можете попробовать DistanceTransform на ч/б изображении и найти там локальные максимумы.   -  person Micka    schedule 26.01.2020
comment
Я новичок в OpenCV. Не могли бы вы рассказать мне немного о преобразовании расстояния? Как то, что он на самом деле делает.   -  person Roshan Nayak    schedule 26.01.2020
comment
для всех нечерных пикселей: вычисление расстояния до ближайшего черного пикселя.   -  person Micka    schedule 26.01.2020
comment
Почему Хаф? После эрозии вы уже обнаружили квадраты. Почему этого обнаружения недостаточно?   -  person Cris Luengo    schedule 27.01.2020
comment
Это невыполнимое решение, потому что на белой линии будет размещен бот, что затруднит обнаружение белого круга. Так есть ли способ отделить квадраты от белой линии?   -  person Roshan Nayak    schedule 27.01.2020


Ответы (1)


вот код С++ с DistanceTransform. Поскольку я почти использовал только функции openCV, вы, вероятно, можете легко преобразовать его в код Python.

Я удалил белую полосу в верхней части изображения вручную, надеюсь, это не проблема.

int main()
{
    cv::Mat input =  cv::imread("C:/StackOverflow/Input/SQUARES.png", cv::IMREAD_GRAYSCALE);
    cv::Mat thres = input > 0; // make binary mas
    cv::Mat dst;
    cv::distanceTransform(thres, dst, CV_DIST_L2, 3);

    double min, max;
    cv::Point minPt, maxPt;
    cv::minMaxLoc(dst, &min, &max, 0, 0);

    double distThres = max*0.65; // a real clustering would be better. This assumes that the white circle thickness is a bout 50% of the square size, so 65% should be ok...

    cv::Mat squaresMask = dst >= distThres;

    cv::imwrite("C:/StackOverflow/Input/SQUARES_mask.png", squaresMask);

    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(squaresMask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);


    cv::Mat output;
    cv::cvtColor(input, output, cv::COLOR_GRAY2BGR);
    for (int i = 0; i < contours.size(); ++i)
    {
        cv::Point2f center;
        float radius;
        cv::minEnclosingCircle(contours[i], center, radius);

        cv::circle(output, center, 5, cv::Scalar(255, 0, 255), -1);
        //cv::circle(output, center, radius, cv::Scalar(255, 0, 255), 1);
    }

    cv::imwrite("C:/StackOverflow/Input/SQUARES_output.png", output);

    cv::imshow("output", output);
    cv::waitKey(0);
}

это ввод:

введите здесь описание изображения

это маска квадратов после преобразования расстояния

введите здесь описание изображения

и это результат

введите здесь описание изображения

person Micka    schedule 26.01.2020
comment
Спасибо за решение. Есть ли другой способ решить эту проблему, отделив квадраты от белой линии? Потому что я узнал, что на белом круге будет бот!! - person Roshan Nayak; 27.01.2020
comment
извините, я не понимаю. Можешь показать картинку с таким ботом? Возможно, вы могли бы просто определить, где белый круг прерывается. - person Micka; 27.01.2020
comment
Обратитесь к вопросу, заданному на этом сайте. Я предоставил изображение там. stackoverflow.com/questions/59954111/ - person Roshan Nayak; 28.01.2020
comment
может быть, вы могли бы попытаться обнаружить бота другим методом независимо от поиска квадратов - person Micka; 28.01.2020
comment
Как это помогает в обнаружении квадратов? - person Roshan Nayak; 28.01.2020
comment
робот не должен быть проблемой для обнаружения белых квадратов с моим алгоритмом - person Micka; 28.01.2020
comment
извините, у меня нет опыта обнаружения маркеров aruco. - person Micka; 29.01.2020