2012-04-17 3 views
5

Я пытаюсь выполнить калибровку камеры Kinect и внешней камеры с помощью Emgu/OpenCV. Я застрял, и я был бы очень признателен за любую помощь.Исправление некалиброванных камер через фундаментальную матрицу

Я выбрал это через фундаментальную матрицу, то есть эпиполярную геометрию. Но результат не такой, как я ожидал. Изображения результатов черные или вообще не имеют смысла. Mapx и точки Mapy, как правило, равны бесконечному или бесконечному, или все равны 0,00, и редко имеют регулярные значения.

Это, как я пытался сделать выпрямление:

1.) точек Поиск изображения получить два массива точек изображения (по одному для каждой камеры) из набора изображений. Я сделал это с помощью функции шахматной доски и FindChessboardCorners.

2.) Найти фундаментальную матрицу

CvInvoke.cvFindFundamentalMat(points1Matrix, points2Matrix, 
_fundamentalMatrix.Ptr, CV_FM.CV_FM_RANSAC,1.0, 0.99, IntPtr.Zero); 

ли я пройти все набранные баллы от всего набора изображений, или просто из двух изображений, пытаясь исправить?

3.) матрицы Поиск гомография

CvInvoke.cvStereoRectifyUncalibrated(points11Matrix, points21Matrix, 
_fundamentalMatrix.Ptr, Size, h1.Ptr, h2.Ptr, threshold); 

4.) Get MapX и мапы

double scale = 0.02; 
CvInvoke.cvInvert(_M1.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 

CvInvoke.cvMul(_H1.Ptr, _M1.Ptr, _R1.Ptr,scale); 
CvInvoke.cvMul(_iM.Ptr, _R1.Ptr, _R1.Ptr, scale); 
CvInvoke.cvInvert(_M2.Ptr, _iM.Ptr, SOLVE_METHOD.CV_LU); 
CvInvoke.cvMul(_H2.Ptr, _M2.Ptr, _R2.Ptr, scale); 
CvInvoke.cvMul(_iM.Ptr, _R2.Ptr, _R2.Ptr, scale); 

CvInvoke.cvInitUndistortRectifyMap(_M1.Ptr,_D1.Ptr, _R1.Ptr, _M1.Ptr, 
mapxLeft.Ptr, mapyLeft.Ptr) ; 

У меня есть проблема здесь ... так как я не использую откалиброван изображения, что такое матрица камеры и коэффициенты искажения? Как я могу получить это из фундаментальных матричных или гомографических матриц?

5.) Переоформления

CvInvoke.cvRemap(src.Ptr, destRight.Ptr, mapxRight, mapyRight, 
(int)INTER.CV_INTER_LINEAR, new MCvScalar(255)); 

И это не возвращение хорошего результата. Буду признателен, если кто-нибудь скажет мне, что я делаю неправильно.

У меня есть набор из 25 пар изображений и размер рисунка шахматной доски 9x6.

ответ

0

В книге «Learning OpenCV» из издательства O'Reilly есть две полные главы, посвященные этой конкретной теме. Оба активно используют подпрограммы OpenCV cvCalibrateCamera2() и cvStereoCalibrate(); Эти подпрограммы являются оболочками для кода, который очень похож на то, что вы здесь написали, с дополнительным преимуществом от более тщательной отладки тех, кто поддерживает библиотеки OpenCV. в то время как они удобны, оба требуют довольно много предварительной обработки для достижения необходимых ресурсов для подпрограмм. На самом деле может быть примерная программа, где-то глубоко в каталоге образцов дистрибутива OpenCV, которая использует эти процедуры, с примерами того, как перейти от изображения шахматной доски к матрице калибровки/внутренней матрицы. Если вы внимательно изучите любое из этих мест, я уверен, вы увидите, как вы можете достичь своей цели с советами экспертов.

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^