Как распознать объект по пиксельным координатам - PullRequest
0 голосов
/ 17 апреля 2020

Я и мои коллеги самостоятельно сделали обнаружение блобов на основе 3D-камеры Intel RealSense 3D [D435], теперь мы должны превратить это обнаружение в распознавание. Нам нужно сделать подсчет людей, поэтому я бы сказал, что нам нужно будет преобразовать пиксели в изображение, а затем сравнить его с другим изображением, если это примерно на 70% правильно, а затем вернуть true. Теперь я слышал, что это будет трудной задачей для процесса, особенно если он должен работать на Raspberry Pi. Как мне это сделать?

В настоящее время мы проверяем с самой высокой точки глубины камеры, если эта точка находится между 1 и 1,5 метрами, она будет использовать метод, который будет рекурсивно l oop через пиксели, следующие до тех пор, пока он не остановится, этот метод является методом blobCheck .

class Blob {
public:
    map<Coords, int> blobList;
    int blobIndex;
    int MidPoint[2];
    Mat* imRef;
    Blob(vector<Blob>* list, Mat* imRef_) {
        blobIndex = list->size() + 1;
        imRef = imRef_;
    }

    bool loopCheck(int x, int y) {
        if (blobList.size() == 0)
        {
            return true;
        }
        if (blobList.find(Coords(x, y)) != blobList.end()) {
            return false;
        }
        return true;
    }

    void blobCheck(int x, int y, depth_frame* frame) {
        float distance = frame->get_distance(x, y) + 0.05;
        int step = 5;
        float minHeight = 0.5;
        try {
            if (y - step <= 0 || x - step <= 0 || x >= frame->get_width() - step || y >= frame->get_height() - step || distance <= minHeight) {
                return;
            }

            if (frame->get_distance(x, y - step) < distance) {
                if (loopCheck(x, y - step)) {
                    blobList[Coords(x, y - step)] = 0;
                    blobCheck(x, y - step, frame);
                }
            }
            if (frame->get_distance(x - step, y) < distance) {
                if (loopCheck(x - step, y)) {
                    blobList[Coords(x - step, y)] = 0;
                    blobCheck(x - step, y, frame);
                }
            }
            if (frame->get_distance(x, step + y) < distance) {
                if (loopCheck(x, step + y)) {
                    blobList[Coords(x, step + y)] = 0;
                    blobCheck(x, step + y, frame);
                }
            }
            if (frame->get_distance(x + step, y) < distance) {
                if (loopCheck(x + step, y)) {
                    blobList[Coords(x + step, y)] = 0;
                    blobCheck(x + step, y, frame);
                }
            }
        } catch (Exception) {}
    }
};

Теперь у нас есть карта со всеми пикселями, которая будет отображать BLOB-объект со следующим кодом:

if (list.size() > 0) {
    for (auto& mapItems : list[0].blobList) {
        circle(*imRef, Point(mapItems.first.x, mapItems.first.y), 1, Scalar(255, 255, 255), 2);
    }
}

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

...