opencv 中的双目立体视觉匹配

相关类的继承关系如下:
opencv 中的双目立体视觉匹配_第1张图片
对于cv::StereoBM类,其重要的成员函数是:

static Ptr cv::StereoBM::create(
int numDisparities = 0,//disparity 搜寻范围,0~numDisparity
int blockSize = 21//块的线性尺寸,这个数必须是奇数(块的中心位于当前像素)
 )	
 //blockSize越大,disparity map精度越差;blockSize越小,发生误匹配的概率越大

对于cv::StereoSGBM类,其重要的成员函数是:

static Ptr cv::StereoSGBM::create	(	
int 	minDisparity = 0,//最小diaparity value,通常设置为0
int 	numDisparities = 16,//disparity 范围,=maxDisparity-minDisparity
int 	blockSize = 3,//匹配块尺寸,必须大于等于1,通常在范围3~11中选取
int 	P1 = 0,//控制disparity 平滑的第一个参数
int 	P2 = 0,//控制disparity 平滑的第二个参数
int 	disp12MaxDiff = 0,//左右视差检测中,最大允许不同;若取消检测,设为负数
int 	preFilterCap = 0,//prefiltered image pixels的截断值
int 	uniquenessRatio = 0,//first best match比second best match的正确率
		//至少高的百分比,通常为5~15
int 	speckleWindowSize = 0,//斑点噪声过滤窗口尺寸,不过滤设为0,
		//过滤通常在范围50~200之间选取
int 	speckleRange = 0,//每一个连通区域的最大允许变形;
		//若执行滤波,设为正值,因为它会隐式的乘以16,通常设为1或2
int 	mode = StereoSGBM::MODE_SGBM // 可以设置StereoSGBM::MODE_HH
		//if set,会执行 full-scale two-pass dynamic programming algorithm
		//这个算法会消耗大量空间
)		

这里有一个补充说明:

opencv 中有这样一段话:
Some algorithms, like StereoBM or StereoSGBM compute 16-bit fixed-point 
disparity map(where each disparity value has 4 fractional bits), whereas
 other algorithms output 32-bit floating-point disparity map.
 表示我们得到的disparity map 使用的数据格式是CV_16SC1,
 且结果是有尾数的定点数表示;尾数部分的位数是4位,
 故CV_16SC1中表示的数据是结果的2^4=16倍。
 所以为了得到真实的视差值,我们需要对StereoSGBM得到的视差值除以16.
 

匹配之前要进行畸变和立体视觉校正

bool cv::stereoRectifyUncalibrated	(	
InputArray 	points1,//Array of feature points in the first image.
InputArray 	points2,//The corresponding points in the second image.
InputArray 	F,//Input fundamental matrix. 
Size 	imgSize,//Size of the image.
OutputArray 	H1,//Output rectification homography matrix for the first image.
OutputArray 	H2,//Output rectification homography matrix for the second image.
double 	threshold = 5 //Optional threshold used to filter out the outliers.
)		

你可能感兴趣的:(opencv 中的双目立体视觉匹配)