一. 概念理解
1.视差:
左右双目图像中,两个匹配块中心像素的水平距离。视差越大越靠近摄像头,而视差小的像素离摄像机远。
2.窗口计算视差:
构造一个小窗口,用窗口覆盖左边的图像,选择出窗口覆盖区域内的所有像素点,同样用窗口覆盖右边的图像并选择出覆盖区域的像素点,左边覆盖区域减去右边覆盖区域,并求出所有像素点灰度差的绝对值之和。此算法常用于图像块匹配,将每个像素对应数值之差的绝对值求和,用来评估两个图像块的相似度。
3.影响视差的因素
1) 光学失真和噪声(亮度、色调、饱和度等失衡)
2) 平滑表面的镜面反射
3)投影缩减
4)透视失真
5) 低纹理
6) 重复纹理
7) 透明物体
8) 重叠和非连续
二. 视差计算步骤
- 首先要对相机进行标定
标定的目的为获得相机的内外参,其基本原理是基于相机成像平面与空间的映射对应关系 - 立体标定
获取左右相机的空间转换关系 - 极线校正
同一个点在两幅图像上的映射,校正后两幅图片的点的坐标y值是一样的,可以减少待匹配的点数量 - 立体匹配
求点跟点的视差,每个点的视差都求出来,就有了点的三维坐标了
三. NCC视差匹配
- 对于原始的图像内任意一个像素点 ( P x , P y ) (Px,Py) (Px,Py)构建一个n×n 的邻域作为匹配窗口。然后对于目标相素位置 ( P x + d , P y ) (Px+d,Py) (Px+d,Py)同样构建一个n×n 大小的匹配窗口,对两个窗口进行相似度度量,这里的d 有一个取值范围。对于两幅图像来说,在进行NCC计算之前要对图像处理,也就是将两帧图像校正到水平位置,光心处于同一水平线上,此时极线是水平的,否则匹配过程只能在倾斜的极线方向上完成,会消耗更多的计算资源。
- NCC计算公式如下:
四. 代码
/# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
import cv2
f