您当前的位置: 首页 >  算法

关于双目立体视觉的三大基本算法及发展现状的总结

发布时间:2020-07-30 07:00:00 ,浏览量:1

点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

双目立体视觉一直是机器视觉研究领域的发展热点和难点,“热”是因为双目立体视觉有着及其广阔的应用前景,且随着光学、计算机科学等学科的不断发展,双目立体技术将不断进步直到应用到人类生活的方方面面。“难”则是因为受到摄像机、镜头等硬件设备及一些相关算法的限制,双目立体视觉的研究及如何更好的应用到生产实际中仍有待在座的各位去进行突破。

一.简介

双目立体视觉是机器视觉中的一个重要分支,自上世纪60年代中期开创以来,经过几十年的发展,如今在机器人视觉、航空测绘、军事应及医学成像、工业检测上应用极其广泛。双目立体视觉基于视差原理并利用成像设备从不同的位置获取被测物体的左右两幅图像,然后根据三角测量原理计算空间点在二维图像的位置偏差,最后再利用位置偏差进行三维重建来获取被测物体的三维几何信息(本文不对双目立体视觉的数学原理进行详细介绍)。

二.双目立体视觉的三大基本算法的原理及其代码实现(基于opencv)

双目立体视觉中常用的基于区域的局部匹配准则主要有图像序列中对应像素差的绝对值之和SAD(sum of absolute differences)、对应像素差的平方之和SSD(sum of squared differences)及半全局匹配算法SGM(semi—global matching)。

2.1 SAD(sum of absolute differences)的原理

匹配算法SAD的基本思想是对经行对准后的左右视图图像的对应像素块的对应像素差的绝对值进行求和。

其数学公式如下:

SAD匹配算法的基本流程如下:

①输入两幅已经校正实现行对准的左视图(Left-Image)及右视图(Right-Image)。

②对左视图Left-Image进行扫描选定一个锚点并构建一个类似于卷积核的小窗口。

③用此小窗口覆盖Left-Image,并选择出小窗口覆盖区域的全部像素点

④同样用此小窗口覆盖Right-Image,并选择出小窗口覆盖区域的全部像素点。

⑤Left-Image覆盖区域的像素减去Right-Image覆盖区域的像素,并求出所有像素点的差的绝对值之和。

⑥移动Right-Image的小窗口并重复④—⑤的操作(注意此处会设置一个搜索范围,超过此范围则跳出)

⑦找到这个范围内SAD值最小的小窗口,此时便找到了与Left-Image锚点的最佳匹配的像素块。

2.1.1 SAD(sum of absolute differences)的基于opencv的C++代码实现

首先先定义一个SAD 算法的头文件(SAD_Algorithm.h):

#include"iostream"
#include"opencv2/opencv.hpp"
#include"iomanip"
using namespace std;
using namespace cv;
class SAD
{
public:
  SAD() :winSize(7), DSR(30) {}
  SAD(int _winSize, int _DSR) :winSize(_winSize), DSR(_DSR) {}
  Mat computerSAD(Mat &L, Mat &R); //计算SAD


private:
  int winSize; //卷积核的尺寸
  int DSR;     //视差搜索范围
};


Mat SAD::computerSAD(Mat &L, Mat &R)
{
  int Height = L.rows;
  int Width = L.cols;


  Mat Kernel_L(Size(winSize, winSize), CV_8U, Scalar::all(0));
  Mat Kernel_R(Size(winSize, winSize), CV_8U, Scalar::all(0));
  Mat Disparity(Height, Width, CV_8U, Scalar(0)); //视差图


  for (int i = 0; i            
关注
打赏
1688896170
查看更多评论

暂无认证

  • 1浏览

    0关注

    106591博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1747s