Вызов StereoRectify в OpenCV вызывает исключение: неверный указатель кадра

Для своего работодателя я сравниваю результаты уже внедренного метода выпрямления изображений с результатами соответствующей реализации 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 |

Р:
| 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 (класс cv :: Исключение const & ptr64) + 0x152 (недопустимый указатель кадра)

Поскольку все матрицы и объект cv :: Size инициализированы правильно, я не вижу, что может быть не так. За любые предложения, я благодарен.

2

Решение

Ваш код изначально потерпел крах для меня в gemm (), и изменение T на vex 3×1, похоже, помогло:

// Mat_<double> used here for easy << initialization
cv::Mat_<double> cameraMatrix1(3,3); // 3x3 matrix
cv::Mat_<double> distCoeffs1(5,1);   // 5x1 matrix for five distortion coefficients
cv::Mat_<double> cameraMatrix2(3,3); // 3x3 matrix
cv::Mat_<double> distCoeffs2(5,1);   // 5x1 matrix
cv::Mat_<double> R(3,3);             // 3x3 matrix, rotation left to right camera
cv::Mat_<double> T(3,1);             // * 3 * x1 matrix, translation left to right proj. center
// ^^ that's the main diff to your code, (3,1) instead of (4,1)

cameraMatrix1 << 6654, 0, 1231, 0, 6654, 1037, 0, 0, 1;
cameraMatrix2 << 6689, 0, 1249, 0, 6689, 991, 0, 0, 1;
distCoeffs1   << -4.57e-009, 5.94e-017, 3.68e-008, -3.46e-008, 6.37e-023;
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;

cv::Mat R1,R2,P1,P2,Q;   // you're safe to leave OutpuArrays empty !
Size imgSize(3000,3000); // wild guess from you cameramat ( not that it matters )

cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imgSize, R, T, R1, R2, P1, P2, Q);

cerr << "Q" << Q << endl;
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]