SAD匹配

#ifndef SAD_H
#define SAD_H

#include"opencv2/opencv.hpp"
using namespace cv;
class SAD
{
public:
    SAD():winSize(7),DSR(30){}
    SAD(int _winSize, int _DSR): winSize(_winSize), DSR(_DSR){}
    Mat computeSAD (Mat& imgL, Mat& imgR);   //返回视差图
private:
    int winSize;
    int DSR;
};

#endif//SAD_H
#include"opencv2/opencv.hpp"
#include"../include/Sad.h"
using namespace cv;
Mat SAD::computeSAD (Mat& imgL, Mat& imgR)
{
    int Height = imgL.rows;
    int Width = imgR.cols;
    Mat Kernel_L = Mat(Size(winSize, winSize), CV_8U);
    Mat Kernel_R = Mat(Size(winSize, winSize), CV_8U);
    Mat Kernel_Diff = Mat(Size(winSize, winSize), CV_8U);
    Mat Disparity = Mat(Size(Width, Height), CV_8U);     //Size_(_Tp _width, _Tp _height);! ! !先说width,再说HEIGHT
    Mat uRight = Mat(Size(Width, Height), CV_8U);
    
    //对每个像素点运用SAD匹配
    for (int i = 0; i < Width - winSize; i++)
    {
	for (int j = 0; j < Height - winSize; j++)
	{
	    Kernel_L = imgL(Rect(i, j , winSize, winSize));
	    Mat Diff_sum = Mat(1, DSR, CV_32F);
	    float Diff_min = 1000000;
	    //取得右图的窗口
	    for (int k = 0; k < DSR; k++)
	    {
		int new_x = i + k;
		if (new_x < Width - winSize)
		{
		    Kernel_R = imgR(Rect(new_x, j, winSize, winSize));
		    //计算差值
		    cv::absdiff(Kernel_L, Kernel_R, Kernel_Diff);
		    Scalar ADD = sum(Kernel_Diff);
		    Diff_sum.at<char>(k) = ADD[0];
		    if (Diff_sum.at<char>(k) < Diff_min)
		    {
			Diff_min = Diff_sum.at<char>(k) ;
			uRight.at<char>(j,i) = imgR.at<char>(new_x);
		    }
		}
	    }
	    Disparity.at<char>(j,i) = imgL.at<char>(j,i) - uRight.at<char>(j, i);    
	}
    }
    return Disparity;
}
#include "../include/Sad.h"
#include "opencv2/opencv.hpp"
#include "iostream"
#include "../src/Sad2.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    if(argc!=3)
    {
	cerr << endl << "Usage: ./imgL imgR" << endl;
	return 1;
    }
    Mat imgL = imread("imgL.jpg", 0);
    Mat imgR = imread("imgR.jpg", 0);
    Mat Disparity;
    SAD my_SAD(7, 30);
    Disparity = my_SAD.computeSAD(imgL, imgR);
    
    imshow("imgL", imgL);
    imshow("imgR", imgR);
    imshow("Disparity", Disparity);
    imwrite("Disparity.jpg", Disparity);
    cvWaitKey(0);
    return 0;
}

 左图

右图

视差图 速度很慢,因为采取的是遍历每一个像素,后续尝试写提取特征点再用SAD匹配的方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值