Opencv问题
使用opencv提供的Example。 在我校准了RMS为0.66左右的立体对之后,我尝试制作一个3d点云。 不幸的是,在我进行立体校正后,我的输入图像变成黑色。没有其他的工作是可能的。 可能是因为我校准不好Opencv问题,opencv,Opencv,使用opencv提供的Example。 在我校准了RMS为0.66左右的立体对之后,我尝试制作一个3d点云。 不幸的是,在我进行立体校正后,我的输入图像变成黑色。没有其他的工作是可能的。 可能是因为我校准不好 Mat img1 = imread(img1_filename, IMREAD_GRAYSCALE); Mat img2 = imread(img2_filename, IMREAD_GRAYSCALE); if (img1.empty()) { printf("Command-
Mat img1 = imread(img1_filename, IMREAD_GRAYSCALE);
Mat img2 = imread(img2_filename, IMREAD_GRAYSCALE);
if (img1.empty())
{
printf("Command-line parameter error: could not load the first input image file\n");
return -1;
}
if (img2.empty())
{
printf("Command-line parameter error: could not load the second input image file\n");
return -1;
}
scale = 1;
if (scale != 1.f)
{
Mat temp1, temp2;
int method = scale < 1 ? INTER_AREA : INTER_CUBIC;
resize(img1, temp1, Size(), scale, scale, method);
img1 = temp1;
resize(img2, temp2, Size(), scale, scale, method);
img2 = temp2;
}
Size img_size = img1.size();
Rect roi1, roi2;
Mat Q;
if (!intrinsic_filename.empty())
{
// reading intrinsic parameters
FileStorage fs(intrinsic_filename, FileStorage::READ);
if (!fs.isOpened())
{
printf("Failed to open file %s\n", intrinsic_filename.c_str());
return -1;
}
Mat M1, D1, M2, D2;
fs["M1"] >> M1;
fs["D1"] >> D1;
fs["M2"] >> M2;
fs["D2"] >> D2;
M1 *= scale;
M2 *= scale;
fs.open(extrinsic_filename, FileStorage::READ);
if (!fs.isOpened())
{
printf("Failed to open file %s\n", extrinsic_filename.c_str());
return -1;
}
Mat R, T, R1, P1, R2, P2;
fs["R"] >> R;
fs["T"] >> T;
stereoRectify(M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CV_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);
Mat img1r, img2r;
remap(img1, img1r, map11, map12, INTER_CUBIC);
remap(img2, img2r, map21, map22, INTER_CUBIC);
img1 = img1r;
img2 = img2r;
imshow("img1", img1);
imshow("img2", img2);
cv::waitKey(0);
}
Mat img1=imread(img1\u文件名,imread\u灰度);
Mat img2=imread(img2\u文件名,imread\u灰度);
if(img1.empty())
{
printf(“命令行参数错误:无法加载第一个输入图像文件\n”);
返回-1;
}
if(img2.empty())
{
printf(“命令行参数错误:无法加载第二个输入图像文件\n”);
返回-1;
}
比例=1;
如果(比例!=1.f)
{
Mat temp1、temp2;
int方法=比例<1?内部面积:内部立方;
调整大小(img1、temp1、Size()、比例、比例、方法);
img1=temp1;
调整大小(img2、temp2、Size()、比例、比例、方法);
img2=temp2;
}
大小img_Size=img1.Size();
矩形roi1,roi2;
matq;
如果(!固有_filename.empty())
{
//读取内部参数
文件存储fs(内部文件名,文件存储::读取);
if(!fs.isopeed())
{
printf(“无法打开文件%s\n”,固有的_filename.c_str());
返回-1;
}
材料M1、D1、M2、D2;
fs[“M1”]>>M1;
fs[“D1”]>>D1;
fs[“M2”]>>M2;
fs[“D2”]>>D2;
M1*=刻度;
M2*=比例;
打开(外部文件名,文件存储::读取);
如果(!fs.isOpened())
{
printf(“无法打开文件%s\n”,外部文件名.c_str());
返回-1;
}
材料R、T、R1、P1、R2、P2;
fs[“R”]>>R;
fs[“T”]>>T;
立体校正(M1、D1、M2、D2、img_大小、R、T、R1、R2、P1、P2、Q、CV_校准_零度视差、-1、img_大小、roi1和roi2);
Mat map11、map12、map21、map22;
初始畸变校正映射(M1、D1、R1、P1、img_大小、CV_16SC2、map11、map12);
初始无畸变整流图(M2、D2、R2、P2、img_尺寸、CV_16SC2、map21、map22);
Mat img1r、img2r;
重新映射(img1、img1r、map11、map12、内部立方);
重新映射(img2、img2r、map21、map22、内部立方);
img1=img1r;
img2=img2r;
imshow(“img1”,img1);
imshow(“img2”,img2);
cv::waitKey(0);
}
根据:
在opencv校准示例中更改stereoCalibrate标志可以解决此问题。
例如,使用:cv::CALIB_RATIONAL_MODEL+cv::CALIB_FIX_K3+cv::CALIB_FIX_K4+cv::CALIB_FIX_K5+cv::CALIB_FIX_K6
另一个会产生更大的RMS错误,但至少正确的重新映射是同时校准内部和外部。
所以不要使用cv::CALIB_USE_instruction_GUESS+cv::CALIB_FIX_instruction