2013-06-13 6 views
6

- Update 2 -Вычислить расстояние (неравенство) OpenCV

Следующая статья очень полезна (хотя он использует Python вместо C++), если вы используете одну камеру, чтобы вычислить расстояние: Find distance from camera to object/marker using Python and OpenCV

Лучший ссылка является Stereo Webcam Depth Detection. Реализация этого проекта с открытым исходным кодом действительно понятна.

Ниже приведен оригинальный вопрос.


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

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

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

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

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

Спасибо заранее!

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 -

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

enter image description here

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

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

ответ

2

Смотреть это ссылка: OpenCV: How-to calculate distance between camera and object using image?, Finding distance from camera to object of known size, http://answers.opencv.org/question/5188/measure-distance-from-detected-object-using-opencv/
Если это не решит проблему вам, напишите подробнее - почему он не работает, и т.д.

+0

См. - Обновление в первом сообщении. – Odrai

1

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

Ниже приведен пример, приведенный несоответствие изображения (в пикселях) и ширина входного изображения 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) 

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