您的位置:首页 > 运维架构

opencv中的图像校正相关

2017-10-31 13:53 1386 查看

0. 前言

       与双目相机打交道过程中,在经过标定后,一般通过stereoRectify()和initUndistortRectifyMap()得到用于校正映射的映射矩阵,之后利用remap()进行图像的校正。基本流程是这样,不过自己实践过程中遇到了一些坑,记录下来作为备忘。

1.remap()函数

        有关remap()的使用这里不再详细阐述,需要注意的就是remap()采取的是“向后映射”,即initUndistortRectifyMap()产生的映射矩阵映射的是目标图像中每一点坐标对应的原图中的相关坐标,所以如果我们拿到了initUndistortRectifyMap()的映射矩阵结果后自己进行简单的映射计算时,应该如下操作:

Mat src, dst;
Mat map11, map12;// initUndistortRectifyMap()得到的一对映射矩阵
for(int i = 0; i < dst.rows; i++)
{
for(int j = 0; j < dst.cols; j++)
{
int i_src, j_src;
i_src = map11.at<cv::Vec2s>(i,j)[1];
j_src = map11.at<cv::Vec2s>(i,j)[0];
if(i_src >=0 && i_src < src.rows && j_src >=0 && j_src < src.cols)
{
dst.at<unsigned char>(i,j) = src.at<unsigned char>(i_src, j_src);
}

}
}


2. undistortPoints()函数

       有时候我们在校正图像时,并不需要对整幅图像校正(此时乖乖使用remap即可),而是只需要求几个点甚至一个点的校正后坐标。此时使用remap()就显得很浪费资源:校正了整幅图像,但实际上我只需要其中几个坐标。那么使用undistortPoints()就十分合适了,譬如我只需要校正一个点(x,y),就可以如下操作:

vector<Point2f> points;
points.push_back(Point2f(x,y));
undistortPoints(points, points, M, D, R, P);
float x_ = points[0].x;
float Y_ = points[0].y;// 校正后的坐标点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: