Для своего работодателя я сравниваю результаты уже реализованного метода исправления изображений с результатами соответствующей реализации OpenCV. Однако после вызова функции OpenCV возникает исключение.
Заголовок функции исправления OpenCV:
void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1,
InputArray cameraMatrix2, InputArray distCoeffs2,
Size imageSize, InputArray R, InputArray T, OutputArray R1,
OutputArray R2, OutputArray P1, OutputArray P2,
OutputArray Q, int flags=CALIB_ZERO_DISPARITY,
double alpha=-1, Size newImageSize=Size(),
Rect* validPixROI1=0, Rect* validPixROI2=0);
В качестве InputArray и OutputArray я использовал объекты типа
cv::Mat
. Поскольку калибровка камер уже известна, я вручную инициализировал входные матрицы с правильными значениями. Матрицы имеют следующие размеры в соответствии с соответствующей страницей документации:
cv::Mat cameraMatrix1; // 3x3 matrix
cv::Mat distCoeffs1; // 5x1 matrix for five distortion coefficients
cv::Mat cameraMatrix2; // 3x3 matrix
cv::Mat distCoeffs2; // 5x1 matrix
cv::Mat R; // 3x3 matrix, rotation left to right camera
cv::Mat T; // 4x1 matrix, translation left to right proj. center
Я инициализировал матрицы следующим образом:
T = cv::Mat::zeros(4, 1, CV_64F);
T.at<double>(0, 0) = proj_center_right.x - proj_center_left.x;
T.at<double>(1, 0) = proj_center_right.y - proj_center_left.y;
T.at<double>(2, 0) = proj_center_right.z - proj_center_left.z;
Для всех матриц я использовал CV_64F как тип значения.
Я распечатал содержимое матриц на консоли, чтобы убедиться, что все значения установлены правильно (округлены):
cameraMatrix1:
| 6654; 0, 1231 |
| 0; 6654; 1037 |
| 0; 0; 1 |distCoeffs1:
| -4.57e-009; 5.94e-017; 3.68e-008; -3.46e-008; 6.37e-023 |cameraMatrix2:
| 6689; 0, 1249 |
| 0; 6689; 991 |
| 0; 0; 1 |distCoeffs2:
| -4.72e-009; 2.88e-016; 6.2e-008; -8.74e-008; -8.18e-024 |R:
| 0.87; -0.003, -0.46 |
| 0.001; 0.999; -0.003 |
| 0.46; 0.002; 0.89 |T:
| 228; 0; 0; 0 |
Мне пока все кажется правильным. Кроме того, я инициализировал выходные матрицы как матрицы идентичности (используя cv :: Mat :: eye (...)) со следующими размерами:
cv::Mat R1; // 3x3 matrix
cv::Mat R2; // 3x3 matrix
cv::Mat P1; // 3x4 matrix
cv::Mat P2; // 3x4 matrix
cv::Mat Q; // 4x4 matrix
Наконец, для требуемого объекта cv :: Size устанавливается ширина 2448 и высота 2050 (размер изображений, получаемых камерами). Как только я передаю параметры OpenCV как
cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imgSize, R, T, R1, R2, P1, P2, Q);
, программа вылетает. В сообщении об ошибке на консоли указано
opencv_core248, void cdecl cv :: error (class cv :: Exception const & ptr64) + 0x152 (недопустимый указатель кадра)
Поскольку все матрицы и объект cv :: Size инициализированы правильно, я не вижу, что может быть не так. Я благодарен за любые предложения.