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;// 校正后的坐标点
相关文章推荐
- 【opencv3.0】鱼眼图像畸变校正——标定校正
- 利用OpenCV进行图像伽马校正
- ubuntu 14.04 +Kinect+ openNI+ openCV+ Sensorkinect 配置 +获取深度图像及相关问题
- opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学
- 利用互相关方法校正二维图像移动
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
- 【OpenCV图像处理】十二、图像的直方图与相关处理(下)
- 【opencv】鱼眼图像畸变校正——双经度法
- 图像投影特征图的波峰波谷查找的相关原理及利用差分遍历法查找波峰的OpenCV代码
- opencv的相关类及示例分析(一)之在QT中利用opencv用摄像头采集图像
- opencv 图像伽马校正
- 基于opencv的图像梯形畸变(透视)校正
- opencv2-摄像头获取图像相关参数设置
- 图像畸变校正OPENCV
- openCV—Python(7)—— 彩色图像R、G、B分量的提取与合并及其相关颜色空间的转化
- 图像畸变校正OPENCV
- Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)
- 【OpenCV学习】图像亮度、对比度调节(伽马校正)
- OpenCV、图像处理相关博客留存
- 【OpenCV图像处理】十、图像的直方图及相关处理(上)