2016-10-20 4 views
-1

я наткнулся на ошибку во время выполнения stereoCalibrate в OpenCV 2.4.11, который говорит:Ассамблеи объяснение о stereoCalibrate ошибке с OutputArray :: Создание ошибка утверждение

OpenCV Error: Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == Size(cols, rows)) in cv::_OutputArray::create, 

Я думаю, что это должно быть какая-то ошибка размера между ними параметры, которые проходят через них один за другим. Но есть еще ошибка. Я надеюсь, что кто-то удивительный может найти ошибку из кода сборки ниже. Вот вызов метода в моем коде.

double error = cv::stereoCalibrate(
     objPoints, cali0.imgPoints, cali1.imgPoints, 
     camera0.intr.cameraMatrix, camera0.intr.distCoeffs, 
     camera1.intr.cameraMatrix, camera1.intr.distCoeffs, 
     cv::Size(1920,1080), m.rvec, m.tvec, m.evec, m.fvec, 
     cv::TermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5) 
     ,CV_CALIB_FIX_INTRINSIC + CV_CALIB_USE_INTRINSIC_GUESS 
    ); 

В моем коде, это m.rvec (3,3, CV_64F), m.tvec есть (3,1, CV_64F), m.evec и m.fvec не выделяется заранее что то же самое с Пример стереокалибровки. И intr.cameraMatrix - это (3,3, CV_64F), а intr.distCoeffs - это (8,1, CV_64F), objPoints вычисляется с шахматной доски, которая хранит трехмерное положение углов, а все значение z для точки равно нулю.

После прочтения совета от @Josh, я изменяю код как простой выходной мат-объект, который находится в CV_64F, но он все равно выбрасывает это утверждение.

cv::Mat R, t, e, f; 
    double error = cv::stereoCalibrate(
     objPoints, cali0.imgPoints, cali1.imgPoints, 
     camera0.intr.cameraMatrix, camera0.intr.distCoeffs, 
     camera1.intr.cameraMatrix, camera1.intr.distCoeffs, 
     cali0.imgSize, R, t, e, f, 
     cv::TermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 100, 1e-5)); 

Наконец я решил эту проблему, как напоминание, убедитесь, что параметры камеры вы прошли в не const типа ....

+0

Сборка, которую вы показали, кажется, не имеет отношения к вашей проблеме. Вам нужно показать полный пример исходного кода, который демонстрирует проблему, в частности минимальный, полный и проверяемый пример. Слишком опасно предположить, что сообщение об ошибке с подтверждением, похоже, говорит о том, что один из ваших объектов '_OutputArray' не имеет такого размера, который он должен иметь. –

+0

Спасибо, Росс, ваш совет очень полезен, что заставляет меня начать поиск исходного кода. Это действительно не относится к сборке, сборка показывает мне только расположение параметра, которое приводит к утверждению. В следующий раз я буду уделять больше внимания этой должности. :) – EdwinDebuger

ответ

1

Зачем идти на собрание? OpenCV является открытым исходным кодом, и вы можете проверить код, который вы здесь вызываете: https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibration.cpp#L3523

Если вы не уверены, что в OpenCV утверждение не выполняется, это обычно связано с тем, что вы передали матрицу с неправильной формой. OpenCV чрезвычайно разборчив. Утверждение потерпеть неудачу на OutputArray, поэтому проверка функции подписи есть четыре возможных виновники:

OutputArray _Rmat, OutputArray _Tmat, OutputArray _Emat, OutputArray _Fmat 

проклейки делается внутри cv::stereoCalibrate здесь:

https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibration.cpp#L3550

_Rmat.create(3, 3, rtype); 
_Tmat.create(3, 1, rtype); 

<-- snipped --> 

if(_Emat.needed()) 
{ 
    _Emat.create(3, 3, rtype); 
    p_matE = &(c_matE = _Emat.getMat()); 
} 
if(_Fmat.needed()) 
{ 
    _Fmat.create(3, 3, rtype); 
    p_matF = &(c_matF = _Fmat.getMat()); 

}

Утверждение запускается в одном из этих вызовов, код здесь:

https://github.com/opencv/opencv/blob/master/modules/core/src/matrix.cpp#L2241

Попробуйте переходящий в равнинных Mat объектов без их предварительного выделения формы.

+0

Большое спасибо Josh !!! Я просто считаю, что параметры камеры также принадлежат outputArray, что заставляет меня понять, что я не могу передавать параметры камеры в качестве объекта const. Тогда проблема решена! Большое вам спасибо за подробное объяснение, которое мне очень помогает и дает мне понять, как отлаживать исходный код:) – EdwinDebuger