OpenCV stereoRectify distorce a imagem

temos uma câmera estéreo ELP de 1,0 megapixel com lente dupla e estamos tentando calibrá-la usando o OpenCV 3.1 em C ++. No entanto, o resultado da calibração é totalmente inutilizável, porque chamar stereoRectify distorce totalmente a imagem. Isto é o que fazemos:

Localizando o padrão de calibração (tabuleiro de xadrez) nas duas câmeras, o tamanho do tabuleiro é de 5x7 e o resultado é quase o mesmo, independentemente do número de imagens capturadas

findChessboardCorners(img[k], boardSize, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE)
cornerSubPix(img[k], corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01));

Todos os tabuleiros de xadrez foram detectados corretamente e verificados usando

drawChessboardCorners(img[k], boardSize, corners, bFound);

Em seguida, calibramos cada câmera separadamente (mas essa etapa parece não ser importante para a calibração estéreo), mas podemos usá-la para verificar cada câmera separadamente

calibrateCamera(objectPoints, imagePoints[k], Size(320, 240), cameraMatrix[k], distCoeffs[k], rvecs, tvecs, 0)

Então fazemos calibração estéreo

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1],
    Size(320, 240), R, T, E, F, CALIB_USE_INTRINSIC_GUESS);

Calcular a transformação de retificação

stereoRectify(cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1], Size(320, 240), R, T, R1, R2, P1, P2, Q,
    CALIB_ZERO_DISPARITY, 1, Size(320, 240), &validRoI[0], &validRoI[1]);

Inicializar mapas para remapear

Mat rmap[2][2];
initUndistortRectifyMap(cameraMatrix[0], distCoeffs[0], R1, P1, Size(FRAME_WIDTH, FRAME_HEIGHT), CV_16SC2, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cameraMatrix[1], distCoeffs[1], R2, P2, Size(FRAME_WIDTH, FRAME_HEIGHT), CV_16SC2, rmap[1][0], rmap[1][1]);
...
remap(img, rimg, rmap[k][0], rmap[k][1], INTER_LINEAR);
imshow("Canvas", rimg);

O resultado é uma imagem totalmente distorcida. Como eu disse no começo, todos os padrões de calibração / tabuleiro de xadrez são detectados corretamente e, se não chamarmos a função stereoRectify, as imagens sem distorção (após o remapeamento) parecerão perfeitas. O problema ocorre se chamarmos a função stereoRectify.

Há algo que perdemos? O número de imagens de calibração parece não ter efeito (às vezes, a captura de 2 imagens fornece um melhor resultado (mas ainda não é utilizável) do que 10 imagens)

Este é o exemplo do padrão de calibração. Tomamos várias orientações diferentes:

Este é o resultado da calibração se não chamarmos stereoRectify:

Este é o resultado errado se chamarmos stereoRectify (mas na maioria das vezes fica muito pior):

Agradecemos antecipadamente por qualquer ajuda que possa estar errado.

questionAnswers(2)

yourAnswerToTheQuestion