Перейти к содержимому
Compvision.ru
Khludenkov

Определение расстояния до объекта по двум фотографиям

Recommended Posts

Здравствуйте.

Скажите, есть ли в opencv стандартная последовательность (pipeline) определения расстояния до объекта?

Объект присутствует на двух фотографиях, снятых на расстоянии (база) 1м друг от друга.

Смотрел в гугле, попадались проекты. Но они больше какие-то "самодельные".

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну если стереопара ректифицирована, то через SGBM получаешь Disparity Map по которому можно посчитать расстояние.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь http://www.compvision.ru/forum/index.php?/topic/1923-создание-3d-моделей-из-2-снимков/  тоже хотел выяснить  для произвольных снимков, но так и не понял как найти матрицу R и T. Если фотоаппараты закреплены на жесткой планке, то  R и T можно найти через stereoCalibrate. А какое порядок расстояний надо определять с базой 1м и какая точность желательна?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 hours ago, fotomer said:

Если фотоаппараты закреплены на жесткой планке, то  R и T можно найти через stereoCalibrate.

Да, нужно калибровать по шаблону.

5 hours ago, fotomer said:

А какое порядок расстояний надо определять с базой 1м и какая точность желательна?

Не понял вопроса. Формула перехода от диспаритета к дистанции стандартная: depth = focal * baseline / disparity. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Точность также примерно 1 метр.

Вдалеке - до километра.

15 часов назад, BeS сказал:

если стереопара ректифицирована

То есть снимки полностью параллельны? Или что это означает?

 

Можно ли как-то учесть непараллельность снимков?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нашёл пример

http://blog.vidikon.com/?p=148

Но там используется CvStereoGCState. В моём openCV такой функции нет.Где его взять?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
14 часа назад, BeS сказал:

Не понял вопроса. Формула перехода от диспаритета к дистанции стандартная: depth = focal * baseline / disparity. 

Я имел ввиду точность измерения линейного размера. Я в свое время делал для ГАИ фотограмметрическую программу, погрешность измерения была до 30 метров не более 1%, до 50метров не более 3%, съемка на обычный фотоаппарат.

 

Еще не подскажешь, есть метод findFundamentalMat. который выдает фундаментальную матрицу для 2 снимков. Есть stereoRectify который выпрямляет снимки, но метод требует матрицы R и T. Как из фундаментальной матрицы получить  R и T ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Код. Нашёл в бескрайних просторах инета и слегка подредактировал.

Подскажите, где здесь настройки задать можно (шкалу расстояний).

 

 

#include "stdafx.h"


#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>

#include <cv.h>
#include <highgui.h>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/legacy/legacy.hpp"

using namespace cv;

int main(int argc, char* argv[])
{
	IplImage *image_ = 0;
	IplImage *image1_ = 0;

	//загрузка тестовых картинок
	image_ = cvLoadImage("D:\\stereoVision\\left.jpg", 1 );
	image1_ = cvLoadImage("D:\\stereoVision\\right.jpg", 1 );

	//создание дополнительных изображений
	IplImage *image_g = cvCreateImage( cvSize(image_->width,image_->height), 8, 1);
	IplImage *image1_g = cvCreateImage( cvSize(image_->width,image_->height), 8, 1);

	CvSize size = cvGetSize(image_);

	//создание матриц
	CvMat* disparity_left = cvCreateMat( size.height, size.width, CV_16S );
	CvMat* disparity_right = cvCreateMat( size.height, size.width, CV_16S );

	//перевод изображений к градациям серого
	cvCvtColor( image_, image_g, CV_BGR2GRAY );
	cvCvtColor( image1_, image1_g, CV_BGR2GRAY );

	//задание начальных параметров стереозрения
	CvStereoGCState* state = cvCreateStereoGCState(16, 2);

	//выполнение основной функции стереозрения, возвращающей матрицу 3d
	cvFindStereoCorrespondenceGC( image_g, image1_g, disparity_left, disparity_right, state, 0 );
	cvReleaseStereoGCState( &state );

	//вывод матрицы в файл
	CvMat* disparity_left_visual = cvCreateMat( size.height, size.width, CV_8U );
	cvConvertScale( disparity_left, disparity_left_visual, -16 );
	cvSave("D:\\333\\disparity.png", disparity_left_visual );
	cvSaveImage("D:\\333\\disparity.jpg", disparity_left_visual );
	return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выдаёт изображение в чёрно-былом (не сером) виде. Градаций серого нет. Что можно сделать?

 

Какое примерно расстояние должно быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

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

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×