双目立体匹配算法--SAD(C++\FPGA)

 SAD(Sum of absolute differences)是一种图像局部匹配算法。

1、本文结构

首先介绍SAD算法的基本原理与流程,之后使用C++和Verilog实现算法。

2、算法流程

输入:左摄像机图片,右摄像机图片,最大视差等级

(1)确定模板大小(一般是3*3,5*5);

(2)用这个模板提取左图像的一块区域中的像素值;

(3)用这个模板提取右图相对应位置的一块区域中的像素值;

(4)用左图像中提取的数据分别减去右图像中提取的数据,结果取绝对值;

(5)在搜索范围内移动右图像的模板,重复(4)

(6)找到这个范围内SAD最小值对应的位置,即找到了左边图像在右图像中的最佳匹配像素块。



#pragma once
#include <iostream>
#include <iomanip>
#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

class mySAD
{
public :
	mySAD() :wsize(3), dsr(30) {}
	mySAD(unsigned int _size, int _dsr) :wsize(_size), dsr(_dsr) {}
	Mat computeSAD(Mat &L,Mat &R);
private:
	int wsize;
	int dsr;
};
#include "stdafx.h"
#include "mysad.h"


Mat mySAD::computeSAD(Mat &L, Mat &R)
{
	Mat Disparity(L.rows,L.cols,CV_8U,Scalar::all(0));

	float temp=0;
	float temp_min = 0;

	for (int nrow = 1; nrow < L.rows-1; nrow++)
	{
		for (int ncol = 1; ncol < L.cols-1; ncol++)
		{
			temp_min = 100000;
			for (int d = 0; (d < this->dsr && ncol+d+1<L.cols-1); d++)
			{
				temp =  abs(  L.at<unsigned char>(nrow - 1, ncol - 1) - R.at<unsigned char>(nrow - 1, ncol + d - 1)
						+ L.at<unsigned char>(nrow - 1, ncol   )  - R.at<unsigned char>(nrow - 1, ncol + d    )
						+ L.at<unsigned char>(nrow - 1, ncol + 1) - R.at<unsigned char>(nrow - 1, ncol + d + 1)
						+ L.at<unsigned char>(nrow    , ncol - 1) - R.at<unsigned char>(nrow    , ncol + d - 1)
						+ L.at<unsigned char>(nrow    , ncol    ) - R.at<unsigned char>(nrow    , ncol + d   )
						+ L.at<unsigned char>(nrow    , ncol + 1) - R.at<unsigned char>(nrow    , ncol + d + 1)
						+ L.at<unsigned char>(nrow + 1, ncol - 1) - R.at<unsigned char>(nrow + 1, ncol + d - 1)
						+ L.at<unsigned char>(nrow + 1, ncol    ) - R.at<unsigned char>(nrow + 1, ncol + d   )
						+ L.at<unsigned char>(nrow + 1, ncol + 1) - R.at<unsigned char>(nrow + 1, ncol + d + 1));
				if (temp < temp_min)
				{
					temp_min = temp;
					Disparity.at<unsigned char>(nrow,ncol) = d*16;
				}			
			}
		}
		float rate = (float)(nrow / L.rows);
	}
	return Disparity;
}
// SAD.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include "mysad.h"

using namespace std;
using namespace cv;


int main()
{
	Mat imgl_gray = imread("C:\\Users\\WangDongwei\\Documents\\Visual Studio 2015\\Projects\\SAD\\pic\\im6.png", CV_LOAD_IMAGE_GRAYSCALE);
	Mat imgr_gray = imread("C:\\Users\\WangDongwei\\Documents\\Visual Studio 2015\\Projects\\SAD\\pic\\im2.png", CV_LOAD_IMAGE_GRAYSCALE);
	Mat d;
	mySAD my_sad;
	d = my_sad.computeSAD(imgl_gray,imgr_gray);
    return 0;
}


效果不好


fpga的实现将在之后补上

            

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值