Как получить значения 3d метрики из карты диспаратности? - PullRequest
0 голосов
/ 05 ноября 2019

Мне нужно получить значения 3d-метрики из диспаратности, cv2.reprojectImageTo3D делает точки за 0,01 с, но значения не в метрах, мой цикл делает это за 4 с (изображение 640x480).

for v in range(dysp.shape[0]):
        for u in range(dysp.shape[1]):
            d = dysp[v, u]
            if d > threshold:
                z = (f * b / d)  
                x = ((u - cx) * b / d - (b / 2))  
                y = (v - cy) * b / d  
                points.append([x,y,z]);

Как я могу улучшить свой цикл или преобразовать результат reprojectImageTo3D в метрику?

1 Ответ

0 голосов
/ 05 ноября 2019

Цикл над массивами в Python медленный. Вы должны векторизовать свой код, чтобы сделать его быстрым.

Единица длины 3D-точек зависит от единицы длины вектора перевода T, которую вы получили от cv2.stereoCalibrate() и которая, в свою очередь, зависит от длиныединица objectPoints, переданная cv2.stereoCalibrate().

cv2.reprojectImageTo3D(), должна делать то, что вы пишете в цикле (за исключением того, что она не вычитает b / 2). Он вернет изображение с размерами = (480, 640, 3) и dtype = float32. Таким образом, есть 3D-точка для каждого местоположения изображения. Неверные значения диспаратности (отрицательные числа) будут обрабатываться в соответствии с параметром handleMissingValues для cv2.reprojectImageTo3D(). (Проверьте, положительны ли ваши значения диспаратности)

Если массив диспаратности имеет dtype = int16, значения диспаратности закодированы как числа с фиксированной точкой, и вы должны разделить значения диспаратности на 2 ^ N (N - количество битовдля дробной части). Если вы использовали OpenCV BlockMatching N будет 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...