2013-04-24 4 views
4

Я выполняю калибровку камеры, как описано в калибровочном образце OpenCV (который отлично подходит для коррекции объектива). Кроме того, теперь я хочу сделать пространственную коррекцию. Значит, когда камера не параллельна шахматной доске, я хочу получить поворот, необходимый для того, чтобы шахматная доска была параллельна камере. Вот что я делаю:Правильная ориентация пространственной камеры

// calculate intrinsic matrix and distortion coefficients for lens correction and get 
// the rotation "rotation" 
cvCalibrateCamera2(object_points,image_points,point_counts,cvGetSize(gray_image), 
        intrinsic_matrix, distortion_coeffs, 
        rotation,NULL, 
        0); 
... 
// convert the rotation to a 3x3 matrix 
cv::Rodrigues(rotation,rotMtx,cv::noArray()); 
// generate maps for lens correction 
cv::initUndistortRectifyMap(intrinsic,distortion,cv::Mat(), 
          cv::getOptimalNewCameraMatrix(intrinsic,distortion,imageSize,1,imageSize,0), 
                 imageSize, CV_16SC2,*handle->mapx,*handle->mapy); 
... 
// perform lens correction 
cv::remap(cv::Mat(sImage),dImage,*handle->mapx,*handle->mapy,cv::INTER_LINEAR); 
... 
// apply the rotation to make the mage parallel to the camera 
cv::warpPerspective(dImage,dImage2,rotMtx,cv::Size(handle->width,handle->height),cv::INTER_LANCZOS4,cv::BORDER_TRANSPARENT,cv::Scalar()); 

Значения вращения вращения 3x1, возвращаемые cvCalibrateCamera2() являются = 0, так что есть что-то вернулся!. Но warpPerspective() не вращает изображение.

Что здесь не так? Как правильно «сопоставить» изображение?

ответ

2

Из моего понимания предмета, матрица вращения используется для «распараллеливание» изображение обеспечивает вращение между два изображения самолетов. То, что вы ищете, это переход от плоскости изображения к плоскости камеры. Это требует вычисления гомографии между самолетами. Вам нужно будет выяснить, какая матрица выводит вас из плоскости изображения на плоскость вашей камеры. Используйте эту матрицу для распараллеливания изображения.

Также, calibrateCamera дает вам передовые преобразования, чтобы вернуться к оригиналу, вам нужно инвертировать вашу матрицу.

Попробуйте прочитать это - Homography

Подсказки: Используйте фокусное расстояние & информации главной точкой для перемещения между изображениями & плоскостями камеры.

+0

warpPerspective() просто ничего не делает для преобразования, поэтому, похоже, это не вопрос (не) инвертированной матрицы. – Elmi

+0

Опять же, вы не можете использовать 'rotMtx', как это делается при вызове функции _Rodrigues_. Вы должны использовать фокусное расстояние камеры и основных точек, чтобы сначала вычислить матрицу 3x3 __homography__. Используйте эту матрицу для преобразования. – Pranjal

+0

Но ... какое вращение возвращается cvCalibrateCamera2() - для чего его можно использовать? – Elmi

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