私はステレオカメラが初めてです(または、おそらくopencvが初めてです)。ただし、選択したオブジェクトの距離を測定するためにステレオ カメラを必要とする FYP を実行する必要があります。
正確な視差マップを取得するための手順は何ですか? 私の知る限り、内部パラメータと外部パラメータを取得するために調整し、歪みを解消してから修正し、視差マッピングのみを計算する必要があります。
固有値と外部値を取得するためにキャリブレーションを行いました。次に、それを修正しようとしましたが、このRMS value_and_reprojection_error_value.jpgを取得しました。質問は、視差マッピングに許容される値はどれくらいですか?
その後、Block Matching を使用して視差マッピングを開始します。これが私のコードです `
int main(void)
{
VideoCapture camLeft(0);
VideoCapture camRight(2);
camLeft.set(CV_CAP_PROP_FRAME_WIDTH, 500);
camLeft.set(CV_CAP_PROP_FRAME_HEIGHT, 500);
camRight.set(CV_CAP_PROP_FRAME_WIDTH, 500);
camRight.set(CV_CAP_PROP_FRAME_HEIGHT, 500);
if (!camLeft.isOpened() || !camRight.isOpened()) {
cout << "Error: Stereo Cameras not found or there is some problem connecting them. Please check your cameras.\n";
exit(-1);
}
//Read intrinsice parameters
string intrinsic_filepath = "C:/Users/Jerry/Documents/Visual Studio 2015/Projects/OctStereoCalibration/OctStereoCalibration/intrinsics.yml";
FileStorage fs(intrinsic_filepath, FileStorage::READ);
if (!fs.isOpened())
{
printf("Failed to open intrinsics.yml");
return -1;
}
Mat M1, D1, M2, D2;
fs["M1"] >> M1;
fs["D1"] >> D1;
fs["M2"] >> M2;
fs["D2"] >> D2;
//Read Extrinsic Parameters
string extrinsic_filepath = "C:/Users/Jerry/Documents/Visual Studio 2015/Projects/OctStereoCalibration/OctStereoCalibration/extrinsics.yml";
fs.open(extrinsic_filepath, FileStorage::READ);
if (!fs.isOpened())
{
printf("Failed to open extrinsics");
return -1;
}
Mat R, T, R1, P1, R2, P2;
fs["R"] >> R;
fs["T"] >> T;
Mat frame1, frame2, gray1, gray2, copyImageLeft, copyImageRight;
int counter = 0;
camLeft >> frame1;
camRight >> frame2;
Size img_size = frame1.size();
Rect roi1, roi2;
Mat Q;
stereoRectify(M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2);
Mat map11, map12, map21, map22;
initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12);
initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22);
while (1) {
createTrackbars();
on_trackbar(0, 0);
bm->setROI1(roi1);
bm->setROI2(roi2);
bm->setPreFilterCap(PreFilterCap);
bm->setPreFilterSize(PrefilterSize);
bm->setBlockSize(SADWindowSize);
bm->setMinDisparity(MinDisparity); //0
bm->setNumDisparities(numberOfDisparities);
bm->setTextureThreshold(TextureThreshold);
bm->setUniquenessRatio(UniquenessRatio);
bm->setSpeckleWindowSize(SpeckleWindowSize);
bm->setSpeckleRange(SpeckleRange);
bm->setDisp12MaxDiff(Disp12MaxDiff); //1
camLeft >> frame1;
camRight >> frame2;
if ((frame1.rows != frame2.rows) || (frame1.cols != frame2.cols)) {
cout << "Error: Images from both cameras are not of some size. Please check the size of each camera.\n";
exit(-1);
}
//frame1.copyTo(copyImageLeft);
//frame2.copyTo(copyImageRight);
imshow("Cam1", frame1);
imshow("Cam2", frame2);
/************************* STEREO ***********************/
cvtColor(frame1, gray1, CV_RGB2GRAY);
cvtColor(frame2, gray2, CV_RGB2GRAY);
int64 t = getTickCount();
Mat img1r, img2r;
remap(gray1, img1r, map11, map12, INTER_LINEAR);
remap(gray2, img2r, map21, map22, INTER_LINEAR);
Mat disp, disp8;
Mat XYZ;
bm->compute(img1r, img2r, disp);
t = getTickCount() - t;
printf("Time elapsed: %fms\n", t * 1000 / getTickFrequency());
disp.convertTo(disp8, CV_8U, 255 / (numberOfDisparities*16.));
//normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);
imshow("disparity", disp8);
//reprojectImageTo3D(disp8, XYZ, Q, false, CV_32F);
char keyBoardInput = (char)waitKey(50);
if (keyBoardInput == 'q' || keyBoardInput == 'Q') {
break;
return(0);
}
}
} `
私のBMパラメータは次のとおりです。
int PreFilterCap = 31;
int PrefilterSize = 21;
int SADWindowSize = 33;
int MinDisparity = 0;
int numberOfDisparities = 48;
int TextureThreshold = 29;
int UniquenessRatio = 15;
int SpeckleWindowSize = 32;
int SpeckleRange = 32;
int Disp12MaxDiff = 0;
私が得る視差マップは次のとおりです:
視差マップ
視差マッピングの品質を向上させるにはどうすればよいですか? ありがとう