Функции стереозрения в 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 (Кручинин Александр)