Функции стереозрения в OpenCV - Recog.ru

advertisement
Функции стереозрения в OpenCV
В OpenCV реализовано два алгоритма стереозрения. Алгоритм Kurt Konolige, являющийся
очень быстрым и использующий скользящие суммы абсолютных различий между пикселями в левом
изображении
и
пикселями
в
правом
изображении,
и
алгоритм
вырезки
графа
FindStereoCorrespondenceGC [1]. С первым алгоритмом связаны функции и структуры, в названиях
которых встречается «BM» (block matching – соответствие блока), у второго – «GC».
CvStereoBMState
typedef struct CvStereoBMState{
//Пред-фильтры для нормализации входного изображения:
int
preFilterType; // 0
int
preFilterSize; // ~5x5..21x21
int
preFilterCap; // до ~31
//Соответствие, использующее сумму абсолютного различия
int
SADWindowSize; // Должно быть 5x5..21x21
int
minDisparity; //минимальное различие (=0)
int
numberOfDisparities; // максимальное различие – минимально различие
//Пост-фильтры ,удаляющие плохие значения
int
textureThreshold; // зоны без текстур игнорируются
float
uniquenessRatio;// фильтровать выходные пиксели, если есть закрытые значения
// с разными различиями
int
speckleWindowSize;// Disparity variation window (НЕ ИСПОЛЬЗУЕТСЯ)
int
speckleRange; // Acceptable range of variation in window (НЕ ИСПОЛЬЗУЕТСЯ)
// Внутренние буферы, не модифицировать
CvMat* preFilteredImg0;
CvMat* preFilteredImg1;
CvMat* slidingSumBuf;
} CvStereoBMState;
Изображения
сдвинуты
на
некоторое
количество
пикселей
(между
minDisparity
и
minDisparity+numberOfDisparities). Чтобы улучшать качество алгоритма в него включена предфильтрация и пост-фильтрация. Алгоритм работает только при смещении изображений по оси X.
CreateStereoBMState
#define CV_STEREO_BM_BASIC 0
#define CV_STEREO_BM_FISH_EYE 1
http://recog.ru
Создание документа: 13 декабря 2011 (Кручинин Александр)
#define CV_STEREO_BM_NARROW 2
CvStereoBMState* cvCreateStereoBMState(
int preset=CV_STEREO_BM_BASIC,
int numberOfDisparities=0
);
Параметры:
preset
ID одного из предопределённых наборов параметров. Любые параметры могут быть
переопределены после вызова функции.
numberOfDisparities
Число различий. Если 0 – то по умолчанию.
Функция создаёт и инициализирует структуру CvStereoBMState.
ReleaseStereoBMState
void cvReleaseStereoBMState(
CvStereoBMState** state
);
Параметры:
state
Двойной указатель на освобождаемую структуру.
Функция ReleaseStereoBMState освобождает структуру и все связанные с ней буфера.
FindStereoCorrespondenceBM
void cvFindStereoCorrespondenceBM(
const CvArr* left,
const CvArr* right,
CvArr* disparity,
CvStereoBMState* state
);
Параметры:
left
Левое одноканальное 8-битное изображение.
right
Правое одноканальное 8-битное изображение.
disparity
http://recog.ru
Создание документа: 13 декабря 2011 (Кручинин Александр)
Одноканальная выходная 16-битная знаковая карта различий того же размера, что и входные
изображения. Её элементы будут содержать различия, умноженные на 16 и округлённые к целому.
state
Стерео структура CvStereoBMState.
Функция вычисляет карту неравенств по входной паре изображений.
CvStereoGCState
typedef struct CvStereoGCState{
int Ithreshold; // Пороговое значение для функции, анализирующей данные (5 по умолчанию)
int interactionRadius; // Радиус размытия (1 по умолчанию; использует модель Поттса)
float K, lambda, lambda1, lambda2; // Параметры для функции
// (обычно адаптируются к входным образам)
int occlusionCost; // 10000 по умолчанию
int minDisparity; // 0 по умолчанию; см. CvStereoBMState
int numberOfDisparities; // определяется пользователем; см. CvStereoBMState
int maxIters; // количество итераций; определяется пользователем.
// внутренние буферы
CvMat* left;
CvMat* right;
CvMat* dispLeft;
CvMat* dispRight;
CvMat* ptrLeft;
CvMat* ptrRight;
CvMat* vtxBuf;
CvMat* edgeBuf;
} CvStereoGCState;
Алгоритм вырезки графа не предназначен для использования в реальном времени. Он даёт
очень точную карту глубины с чёткими границами объекта.
CreateStereoGCState
CvStereoGCState* cvCreateStereoGCState(
int numberOfDisparities,
int maxIters
);
Параметры:
http://recog.ru
Создание документа: 13 декабря 2011 (Кручинин Александр)
numberOfDisparities
Число различий. Диапазон поиска различий: state->minDisparity ≤ disparity < state->minDisparity +
state->numberOfDisparities
maxIters
Максимальное количество итераций. На каждой итерации испытываются все возможные альфарасширения. Смотрите [1] для подробностей.
Функция создаёт структуру CvStereoGCState. Её параметры можно поменять вручную после
создания.
ReleaseStereoGCState
void cvReleaseStereoGCState(
CvStereoGCState** state
);
Параметры:
state
Двойной указатель на освобождаемую структуру.
Функция ReleaseStereoGCState освобождает структуру и все связанные с ней буфера.
FindStereoCorrespondenceGC
void cvFindStereoCorrespondenceGC(
const CvArr* left,
const CvArr* right,
CvArr* dispLeft,
CvArr* dispRight,
CvStereoGCState* state,
int useDisparityGuess CV_DEFAULT(0)
);
Параметры:
left
Левое одноканальное 8-битное изображение.
right
Правое одноканальное 8-битное изображение.
dispLeft
Необязательная одноканальная левая выходная 16-битная знаковая карта различий того же
размера, что и входные изображения.
dispRight
http://recog.ru
Создание документа: 13 декабря 2011 (Кручинин Александр)
Необязательная одноканальная правая выходная 16-битная знаковая карта различий того же
размера, что и входные изображения.
state
Структура CvStereoGCState.
useDisparityGuess
Если параметр не равен 0, алгоритм начинается с предопределённых карт различий. И dispLeft,
и dispRight должны содержать правильные карты различий.
Функция
cvFindStereoCorrespondenceGC
вычисляет
карты
различий
по
входной
паре
изображений. Левое изображение различий будет содержать значения в следующем диапазоне:
-state->numberOfDisparities-state->minDisparity < dispLeft(x,y) = -state->minDisparity,
или
dispLeft(x,y) == CV_STEREO_GC_OCCLUSION,
где для правого изображения различий будет верно следующее:
state->minDisparity = dispRight(x,y) < state->minDisparity+state->numberOfDisparities,
или
dispRight(x,y) == CV_STEREO_GC_OCCLUSION,
т.е. диапазон для левого изображения различий должен быть инверсным, и пиксели, для
которых не будут найдены соответствия, будут отмечены как преграды.
Литература:
1. V. Kolmogorov. Graph Based Algorithms for Scene Reconstruction from Two or More Views. PhD
thesis, Cornell University, September 2003.
http://recog.ru
Создание документа: 13 декабря 2011 (Кручинин Александр)
Download