Jump to content
Compvision.ru
Khludenkov

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

Recommended Posts

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

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

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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

 

Share this post


Link to post
Share on other sites
5 hours ago, fotomer said:

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

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

5 hours ago, fotomer said:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites
14 часа назад, BeS сказал:

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

 

#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;
}

 

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×