Я только начал с калибровки моно камеры в OpenCV.
Тем самым я использую пример кода из
http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html
что удобно и красиво написано.
Теперь проблема в том, что я использую пейзажные и портретные изображения для ввода. Все эти изображения имеют размер 1600×1200 пикселей и отображают шахматную доску, однако на некоторых из этих изображений вид поворачивается на 90 градусов. Теперь код выглядит так:
view = imread(s.imageList[i], 1);
if(view.empty())
continue;
remap(view, rview, map1, map2, INTER_LINEAR);
imshow("Image View", rview);
imwrite(s.imageList[i], rview);
Перераспределение (избавление от искажений) является успешным, но сохраненное изображение обрезается для пейзажных изображений. Это означает, что алгоритм каким-то образом пытается поместить неискаженное изображение в портретную форму, что приводит к следующему:
http://picload.org/view/lccorri/img_0197.jpg.html
Кто-нибудь получил какой-то вклад, почему это?
Проблема была в вычислении выпрямительных карт:
initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, Size(1600,1600), 1, Size(1600,1600), 0),
Size(1600,1600), CV_16SC2, map1, map2);
Здесь я допустил ошибку, так как для размера изображения я теперь установил Размер (1600,1600), который установил размер 1600 x 1600. Теперь не имеет значения, повернуто ли изображение (1200×1600), оно не будет обрезано. На данный момент я доволен, конечно, это не лучшее решение.