Вызов 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 |

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 инициализированы правильно, я не вижу, что может быть не так. Я благодарен за любые предложения.


person Simon Oelmann    schedule 16.01.2014    source источник


Ответы (1)


ваш код изначально разбился для меня в gemm (), изменение T на vec 3x1, похоже, помогло:

// 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;
person berak    schedule 16.01.2014