Я выполняю калибровку камеры, как описано в калибровочном образце 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() не вращает изображение.
Что здесь не так? Как правильно «сопоставить» изображение?
warpPerspective() просто ничего не делает для преобразования, поэтому, похоже, это не вопрос (не) инвертированной матрицы. – Elmi
Опять же, вы не можете использовать 'rotMtx', как это делается при вызове функции _Rodrigues_. Вы должны использовать фокусное расстояние камеры и основных точек, чтобы сначала вычислить матрицу 3x3 __homography__. Используйте эту матрицу для преобразования. – Pranjal
Но ... какое вращение возвращается cvCalibrateCamera2() - для чего его можно использовать? – Elmi