Рассчитать расстояние (несоответствие) OpenCV

- Обновление 2 -

Следующая статья действительно полезна (хотя в ней используется Python вместо C ++), если вы используете одну камеру для расчета расстояния: Найти расстояние от камеры до объекта / маркера с помощью Python и OpenCV

Лучшая ссылка: Глубина стерео веб-камеры Обнаружение. Реализация этого проекта с открытым исходным кодом действительно очевидна.

Ниже исходный вопрос.


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

Я уже реализовал метод отслеживания объектов на основе цвета (это создает пороговое изображение).

Мой вопрос: как я могу рассчитать расстояние до отслеживаемых цветных объектов с помощью карты / матрицы диспаратности?

Ниже вы можете найти фрагмент кода, который получает координаты x, y и z каждого пикселя. Вопрос: Point.z в сантиметрах, пикселях, миллиметрах?

Могу ли я узнать расстояние до отслеживаемого объекта с помощью этого кода?

Заранее спасибо!

cvReprojectImageTo3D(disparity, Image3D, _Q);

vector<CvPoint3D32f> PointArray;
CvPoint3D32f Point;

for (int y = 0; y < Image3D->rows; y++) {    

    float *data = (float *)(Image3D->data.ptr + y * Image3D->step);  

    for (int x = 0; x < Image3D->cols * 3; x = x + 3) 
    {   
        Point.x = data[x];        
        Point.y =  data[x+1];     
        Point.z = data[x+2];
        PointArray.push_back(Point);
        //Depth > 10
        if(Point.z > 10)
        {
            printf("%f %f %f", Point.x, Point.y, Point.z);              
        }
    }
}
cvReleaseMat(&Image3D);

- Обновление 1 -

Например, я создал это пороговое изображение (левой камеры). У меня почти такая же правая камера.

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

Помимо приведенного выше порогового изображения, приложение создает карту несоответствия. Как я могу получить Z-координаты пикселей руки на карте диспаратности?

Я действительно хочу получить все Z-координаты пикселей руки, чтобы вычислить среднее Z-значение (расстояние) (с использованием карты диспаратности).


person Odrai    schedule 13.06.2013    source источник


Ответы (3)


См. Следующие ссылки: OpenCV: Как рассчитать расстояние между камерой и объектом с помощью изображения?, Определение расстояния от камеры до объекта известного размера, http://answers.opencv.org/question/5188/measure-distance-from-detected-object-using-opencv/
Если это вас не решит проблема, напишите подробнее - почему не работает и т. д.

person cyriel    schedule 14.06.2013
comment
См. --Обновить- в первом посте. - person Odrai; 14.06.2013
comment
@cyriel можем ли мы предсказать глубину точки с двумя видами камеры? - person Salih Karagoz; 23.09.2018

Математика для преобразования диспаратности (в пикселях или процентах ширины изображения) в фактическое расстояние довольно хорошо задокументирована (и не очень сложна), но я также задокументирую ее здесь.

Ниже приведен пример изображения несоответствия (в пикселях) и входного изображения шириной 2K (2048 пикселей в поперечнике):

Расстояние конвергенции определяется вращением линз камеры. В этом примере это будет 5 метров. Расстояние конвергенции 5 (метров) означает, что расстояние между объектами на расстоянии 5 метров равно 0.

CD = 5 (meters)        

Обратное расстояние схождения: 1 / CD

IZ = 1/5 = 0.2M

Размер сенсора камеры в метрах

SS  = 0.035 (meters)    //35mm camera sensor

Ширина пикселя на датчике в метрах

PW = SS/image resolution = 0.035 / 2048(image width) = 0.00001708984

Фокусное расстояние ваших фотоаппаратов в метрах

FL = 0.07 //70mm lens

Межосевое расстояние: расстояние от центра левой линзы до центра правой линзы.

IA = 0.0025 //2.5mm

Сочетание физических параметров вашего фотоаппарата

A = FL * IA / PW

Несоответствие, скорректированное камерой: (только для левого обзора, правого обзора будет использоваться положительное [значение диспаратности])

AD = 2 * (-[disparity value] / A) 

Отсюда вы можете вычислить фактическое расстояние, используя следующее уравнение:

realDistance = 1 / (IZ – AD)

Это уравнение работает только для систем камер с «схождением». В параллельных установках камеры будет использоваться немного другое уравнение, чтобы избежать значений бесконечности, но я пока оставлю это как есть. Если вам нужны параллельные вещи, просто дайте мне знать.

person BHawk    schedule 26.04.2017
comment
Можете ли вы отменить это вычисление, то есть сделать снимок глубины с известными параметрами камеры и получить карту несоответствия? - person IntegrateThis; 11.09.2020
comment
Да, это обратимое уравнение. - person BHawk; 11.09.2020

if len(puntos) == 2:
    x1, y1, w1, h1 = puntos[0]
    x2, y2, w2, h2 = puntos[1]
    
    if x1 < x2:
        distancia_pixeles = abs(x2 - (x1+w1)) 
        distancia_cm = (distancia_pixeles*29.7)/720
        cv2.putText(imagen_A4, "{:.2f} cm".format(distancia_cm), (x1+w1+distancia_pixeles//2, y1-30), 2, 0.8, (0,0,255), 1,

cv2.LINE_AA) cv2.line (imagen_A4, (x1 + w1, y1-20), (x2, y1-20), (0, 0, 255), 2) cv2.line (imagen_A4, (x1 + w1, y1 -30), (x1 + w1, y1-10), (0, 0, 255), 2) cv2.line (imagen_A4, (x2, y1-30), (x2, y1-10), (0, 0 , 255), 2) else: distancia_pixeles = abs (x1 - (x2 + w2)) distancia_cm = (distancia_pixeles * 29.7) / 720 cv2.putText (imagen_A4, {: .2f} cm.format (distancia_cm), (x2 + w2 + distancia_pixeles // 2, y2-30), 2, 0.8, (0,0,255), 1, cv2.LINE_AA) cv2.line (imagen_A4, (x2 + w2, y2-20), (x1, y2-20) ), (0, 0, 255), 2) cv2.line (imagen_A4, (x2 + w2, y2-30), (x2 + w2, y2-10), (0, 0, 255), 2) cv2. строка (imagen_A4, (x1, y2-30), (x1, y2-10), (0, 0, 255), 2)

        cv2.imshow('imagen_A4',imagen_A4)

    cv2.imshow('frame',frame)    
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
cap.release()
cv2.destroyAllWindows()

Думаю, это хороший способ измерить расстояние между двумя объектами.

person Diana Lopez    schedule 20.06.2021
comment
Добро пожаловать в SO, пожалуйста, правильно используйте форматирование текста. - person ILoveLogCat; 21.06.2021