2017-12-19 30 views
0

저는 opencv를 배우고 입체 카메라를 테스트하고 있습니다. 내 코드에서, stereoRectify 함수는 때때로 크기 (0,0)로 ROI를 반환합니다. 이 문제를 파악할 수 없습니다. 단말기왜 cv :: stereoRectify는 ROI를 size (0,0)로 반환합니까?

Mat cameraMatrix[2], distCoeffs[2]; 
cameraMatrix[0] = initCameraMatrix2D(objectPoints, imagePoints_l, 
    imageSize, 0); 
cameraMatrix[1] = initCameraMatrix2D(objectPoints, imagePoints_r, 
    imageSize, 0); 

Mat R, T, E, F; 
double rms = stereoCalibrate(objectPoints, imagePoints_l, imagePoints_r, 
    cameraMatrix[0], distCoeffs[0], 
    cameraMatrix[1], distCoeffs[1], 
    imageSize, R, T, E, F, 
    CALIB_FIX_ASPECT_RATIO + 
    CALIB_ZERO_TANGENT_DIST + 
    CALIB_USE_INTRINSIC_GUESS + 
    CALIB_SAME_FOCAL_LENGTH + 
    CALIB_RATIONAL_MODEL + 
    CALIB_FIX_K3 + CALIB_FIX_K4 + CALIB_FIX_K5, 
    TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, 1e-5)); 

Mat R1, R2, P1, P2, Q; 
Rect validRoi[2]; 

stereoRectify(cameraMatrix[0], distCoeffs[0], 
    cameraMatrix[1], distCoeffs[1], 
    imageSize, R, T, R1, R2, P1, P2, Q, 
    CALIB_ZERO_DISPARITY, 0.5, imageSize, &validRoi[0], &validRoi[1]); 

cout << validRoi[0] << validRoi[1] << endl; 

이 출력 :

[0 x 0 from (0, 0)][215 x 184 from (77, 19)] 

또는 :

[0 x 0 from (0, 0)][0 x 0 from (0, 0)] 

I는 출력 카메라 행렬 왜곡 매트릭스 :

[204.3355426705726, 0, 193.3280616575545; 
0, 189.8976931576431, 123.307676870377; 
0, 0, 1] 
[-0.5404320611827982, 0.3292134879059271, 0, 0, 0, 0, 0, 
0.1371856537119246, 0, 0, 0, 0, 0, 0] 
[204.3355426705726, 0, 183.756931129648; 
0, 189.8976931576431, 131.4500619272754; 
0, 0, 1] 
[-0.524923482702874, 0.3121043629068334, 0, 0, 0, 0, 0, 
0.1269780773557047, 0, 0, 0, 0, 0, 0] 

답변

0

stereoRectify 함수 어쩌면 반환 유효한 ROI가 없습니다. 전체 코드를 게시하십시오.

이전에 스테레오 보정을 수행 했습니까? 입력 행렬은 무엇입니까? 카메라 매트릭스가 스테레오 보정의 출력 매트릭스입니까? 자유 스케일 매개 변수 aplha = 0을 설정하려고 시도 했습니까? 그런 다음 ROI가 전체 이미지를 포함합니다. 수정 된 이미지를 게시 할 수 있습니까? https://github.com/opencv/opencv/blob/master/samples/cpp/stereo_calib.cpp

및 StereoRectify에 대한 OpenCV의-문서 : https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereorectify

+0

일부 코드 및 출력을 추가했습니다. 고맙습니다. – Ayoung

0

먼저 확인 당신은`의 stereoCalibration 플래그에서 다음

전체 StereoCalibration의 OpenCV의 예입니다. 플래그가 필요한 OpenCV-Documentation을보십시오. 당신은 어떤 깃발없이 먼저 그것을 시도 할 수 있습니다.

스테레오 보정에서 반환 된 rms 값을 확인 했습니까? 좋은 보정은 1 미만의 실효 값을 반환합니다.

잘 정돈 된 이미지입니까? 다음 코드를 사용하여 다시 매핑하고 표시 할 수 있습니다.

// remap 
Mat rmap[2][2]; 
initUndistortRectifyMap(cameraMatrix1, distCoeffs1, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][1]); 
initUndistortRectifyMap(cameraMatrix2, distCoeffs2, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][1]); 
Mat out1, out2; 
remap(img1, out1, rmap[0][0], rmap[0][1], CV_INTER_LINEAR); 
remap(img2, out2, rmap[1][0], rmap[1][1], CV_INTER_LINEAR); 
Mat result; 
hconcat(out1, out2, result); 

// draw horizontal line 
for(int j = 0; j < result.rows; j += 16) { 
    line(result, Point(0, j), Point(result.cols, j), Scalar(0, 255, 0), 1, 8); 
} 

// show 
imshow("result", result); 
waitKey();