ssovec 1 Жалоба Опубликовано August 6, 2012 Здравствуйте, я тут уже наверное всех замучал вопросами , но задам еще один. Вызываю функцию StereoRectify() , она выдает ошибку All the matrices must have the same data type. Искал в интернете не у одного меня такая ошибка, но ни кто не чего дельного по ее исправлению не пишет, в чем может быть проблема? код ниже. public static void StereoCalibration1() { int ImageNum = 3; CvMat R = new CvMat(3, 3, MatrixType.F32C1); CvMat T = new CvMat(3, 1, MatrixType.F32C1); CvMat Q = new CvMat(4, 4, MatrixType.F32C1); CvMat R1 = new CvMat(3, 3, MatrixType.F32C1); CvMat R2 = new CvMat(3, 3, MatrixType.F32C1); CvMat P1 = new CvMat(3, 4, MatrixType.F32C1); CvMat P2 = new CvMat(3, 4, MatrixType.F32C1); IplImage[] srcImg = new IplImage[ImageNum]; for (int i = 0; i < ImageNum; i++) { srcImg[i] = new IplImage(string.Format("Data/Calibration/Right/{0:D2}.jpg" , i) , LoadMode.Color); } CvSize imageSize = srcImg[0].Size; CvMat intrinsic_left, intrinsic_right, distortion_left, distortion_right, imagePoints_left, imagePoints_right, objectPoints, pointsCount; objectPoints = Cv.Load<CvMat>("objectPoints_left.xml"); imagePoints_left = Cv.Load<CvMat>("imagePoints_left.xml"); imagePoints_right = Cv.Load<CvMat>("imagePoints_right.xml"); pointsCount = Cv.Load<CvMat>("pointsCount_left.xml"); intrinsic_left = Cv.Load<CvMat>("intrinsic_left.xml"); intrinsic_right = Cv.Load<CvMat>("intrinsic_right.xml"); distortion_left = Cv.Load<CvMat>("distortion_left.xml"); distortion_right = Cv.Load<CvMat>("distortion_right.xml"); Cv.StereoCalibrate(objectPoints, imagePoints_left, imagePoints_right, pointsCount, intrinsic_left, distortion_left, intrinsic_right, distortion_right, imageSize, R, T); Cv.StereoRectify(intrinsic_left, intrinsic_right, distortion_left, distortion_right, imageSize, R, T, R1, R2, P1, P2, Q); using (CvFileStorage fs = new CvFileStorage("stereo_calibration.xml" , null , FileStorageMode.Write)) { fs.Write("stereo_rotation", R); fs.Write("stereo_translation", T); fs.Write("disparity_matrix", Q); fs.Write("rectification1", R1); fs.Write("rectification2", R2); fs.Write("projection1", P1); fs.Write("projection2", P2); }; Cv.Save(R, "stereo_rotation.xml"); Cv.Save(T, "stereo_translation.xml"); Cv.Save(Q, "disparity_matrix.xml"); Cv.Save(R1, "rectification1.xml"); Cv.Save(R2, "rectification2.xml"); Cv.Save(P1, "projection1.xml"); Cv.Save(P2, "projection2.xml"); foreach (IplImage img in srcImg) { img.Dispose(); } Console.WriteLine(File.ReadAllText("stereo_calibration.xml")); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 6, 2012 В примере stereo_calib.cpp есть применение этой команды. У Вас ошибка несоответствия типов матриц и я подозреваю, что загружаемые матрицы у Вас имеют тип CV_64FC1, а не CV_32FC1. Чтобы это проверить поменяйте типы остальных матриц на CV_64FC1. Или переконвертируйте загруженные при помощи convertTo. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ssovec 1 Жалоба Опубликовано August 6, 2012 Не выходит, при изменении матриц выдает кретическую ошибку выполнения. Но видимо вы правы надо как то привести матрицы к одному типу, буду думать, спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах