OpenCV在未知相机内参数情况下的立体图像矫正方法及注意事项
来源:互联网 发布:核聚变 不能实现 知乎 编辑:程序博客网 时间:2024/04/30 18:25
很多时候我们不知道摄像机的内参数矩阵,并且我们也不太关注内参数到底是多少,因为我们仅仅关心如何得到两幅图像的稠密匹配,或者两幅图像的差别——例如我们只想计算两幅图像的视差图,或者说得到两幅立体图像对的深度图就足够了。既然不知道摄像机的内参数,那么就只能借助对极约束来达到目的了。通过计算两幅图像的基础矩阵F,然后利用对极约束矫正极线为平行线的方法,可以很好的实现这个目标,该方法也被称为Hartly方法,在OpenCV中由cv::stereoRectifyUncalibrate
(1)提取特征点并匹配,参考http://blog.sina.com.cn/s/blog_4298002e01013w4z.html
(2)计算基本矩阵F,参考http://blog.sina.com.cn/s/blog_4298002e01013w9a.html
(3)极线矫正。
//! computes the rectification transformation for an uncalibrated stereo camera (zero distortion is assumed)
CV_EXPORTS_W bool stereoRectifyUncalibrate
该函数输入参数为两幅图像的匹配特征点,基本矩阵F以及图像的尺寸,返回的参数是两幅图像各自对应的单应变换矩阵H1和H2。只需要对两幅图像按照H1和H2做单应变换,即可得到矫正后图像。假设I为图像,变换如下:
I_recty = H*I
// 假设前面我们已经得到两幅图像的匹配特征点,并计算出了基本矩阵F,同时得到了匹配特征点的inlier
// Mat m_matLeftImage;
//
// vector<Point2f> m_LeftInlier;
//
// Mat m_Fundamental;
// 计算图像矫正的单应变换矩阵
Mat m_LeftH;
Mat m_RightH;
stereoRectifyUncalibrate
// 任意指定一个内参数矩阵K,不会影响计算结果,此处设为单位阵。
Mat K = Mat::eye(3, 3, CV_64F); // 注意一定是double类型
Mat invK = K.inv(DECOMP_SVD);
Mat LeftR = invK*m_LeftH*K;
Mat RightR = invK*m_RightH*K;
Mat LeftMap1, LeftMap2;
Mat RightMap1, RightMap2;
Mat Distort;
Size UndistSize(m_matLeftImage.cols, m_matLeftImage.rows);
// 计算左右两幅图像的映射矩阵
initUndistortRectifyMap(K, Distort, LeftR, K, UndistSize, CV_32FC1, LeftMap1, LeftMap2);
initUndistortRectifyMap(K, Distort, RightR, K, UndistSize, CV_32FC1, RightMap1, RightMap2);
// 把原始图像投影到新图像上,得到矫正图像
Mat m_LeftRectyImage;
Mat m_RightRectyImage;
remap(m_matLeftImage, m_LeftRectyImage, LeftMap1, LeftMap2, INTER_LINEAR);
remap(m_matRightImage, m_RightRectyImage, RightMap1, RightMap2, INTER_LINEAR);
// 显示结果
cvNamedWindow( "left image", 1);
cvShowImage("left image", &(IplImage(m_LeftRectyImage)));
cvNamedWindow( "right image", 1);
cvShowImage("right image", &(IplImage(m_RightRectyImage)));
cvWaitKey( 0 );
cvDestroyWindow( "left image" );
cvDestroyWindow( "right image" );
程序计算的结果如下图所示:
原始图像对:
极线矫正后的图像:
SGBM算法:
GC算法:
from: http://blog.sina.com.cn/s/blog_4298002e01013yb8.html
- OpenCV在未知相机内参数情况下的立体图像矫正方法及注意事项
- OpenCV在未知相机内参数情况下的立体图像矫正方法
- OpenCV在未知相机内参数情况…
- 根据相机内参数及畸变系数给图像去畸变
- 双目相机的畸变矫正及平行矫正
- OpenCV编程->单目相机内参及畸变求解
- halcon相机标定及图像矫正(代码)
- OpenCV文本图像的旋转矫正
- 利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码
- opencv 相机标定与矫正
- 基于OpenCv的摄像机立体标定和立体矫正的源代码
- OpenCV3.1.0的calibrateCamera()函数计算相机内参数
- opencv打开多种情况下的图像
- css在未知高度的情况下实现垂直居中
- 相机的内参及外参详细解释
- 双目相机标定以及立体测距原理及OpenCV实现
- 双目相机标定以及立体测距原理及OpenCV实现
- opencv 图像畸变矫正加速、透视变换加速方法总结
- 使用CSS制作Loading加载Icon
- iOS选择相册中的视频并且展示视频第一帧的图片
- 常用正则表达
- Property Animation属性动画,还用补间动画你就out了
- m版页面判断安卓与ios系统
- OpenCV在未知相机内参数情况下的立体图像矫正方法及注意事项
- ajaxfileupload回到json带<pre>
- ios 根据文字数量计算UILabel高度
- 在线工具
- java String 常用方法
- nodejs IDE 编译器
- 28. Implement strStr() leetcode Python new season 2016
- JAVA相对路径、绝对路径
- 自定义View--CascadeView