1. 程式人生 > >雙目立體匹配演算法--SAD(C++\FPGA)

雙目立體匹配演算法--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的實現將在之後補上

相關推薦

雙目立體匹配演算法--SADC++\FPGA

 SAD(Sum of absolute differences)是一種影象區域性匹配演算法。 1、本文結構 首先介紹SAD演算法的基本原理與流程,之後使用C++和Verilog實現演算法。 2、演算

演算法4-6:KMP字串模式匹配演算法實現 c語言

[提交] [統計] [提問] 題目描述 KMP演算法是字串模式匹配演算法中較為高效的演算法之一,其在某次子串匹配母串失敗時並未回溯母串的指標而是將子串的指標移動到相應的位置。嚴蔚敏老師的書中詳細描述了KMP演算法,同時前面的例子中也描述了子串移動位置的陣列實現的演算法。前面你已經實現

RSA加密演算法驗證C#實現

RSA演算法簡單原理介紹(節選於網路) 假設Alice想要通過一個不可靠的媒體接收Bob的一條私人訊息。她可以用以下的方式來產生一個公鑰和一個私鑰: 隨意選擇兩個大的質數p和q,p不等於q,計算N=pq。 根據尤拉函式,求得r = (p-1)(q-1) 選擇一個小於 r

常見排序演算法彙總C++實現

插入排序 #include<iostream> using namespace std; /* 插入排序的細節講解與複雜度分析 時間複雜度O(N ^ 2),額外空間複雜度O(1) */ void InsertSort(int *arr, int length) { int i,

Leetcode演算法C語言1

題目描述:給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], ta

Leetcode演算法C語言5--存在重複

題目:存在重複 給定一個整數陣列,判斷是否存在重複元素。 如果任何值在陣列中出現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。 示例 1: 輸入: [1,2,3,1

Leetcode演算法C語言8--加一

題目:加一 給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。 最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。 你可以假設除了整數 0 之外,這個整數不會以零開頭。 示

Leetcode演算法C語言9--移動零

題目:移動零 給定一個數組 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 說明: 1

Leetcode演算法C語言11--有效的數獨

題目:有效的數獨 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 1 數字 1-9 在每一行只能出現一次。 2 數字 1-9 在每一列只能出現一次。 3 數

Leetcode演算法C語言17--驗證迴文字串

題目:驗證迴文字串 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。 說明:本題中,我們將空字串定義為有效的迴文串。 示例 1: 輸入: “A man, a plan

凸包問題的快包演算法程式碼C語言

二維凸包可以用來解決圍欄問題、城市規劃問題、聚類分析等等。 分治法 時間複雜度:O(n㏒n)。 思路:應用分治法思想,把一個大問題分成幾個結構相同的子問題,把子問題再分成幾個更小的子問題……。然後我們就能用遞迴的方法,分別求這些子問題的解。最後把每個子問題的解“組裝”

完美數的演算法設計C語言

完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。它所有的真因子(即除了自身以外的約數)的和(即因子函式),恰好等於它本身。如果一個數恰好等於它的因子之和,則稱該數為“完全數”。 尋找完美的數 題目描述:所謂完美的數是這個數除了它自身之外,所有因子的和等於該數。

六大排序演算法與常見的兩大查詢演算法彙總C語言

六大排序演算法程式如下: #include<stdio.h> /*void Bubblesort(int arry[],int len)//氣泡排序演算法 { int i,j; for(i=0;i<len-1;i++) { for(j=i+1;j<le

分治演算法排序C++版

分治排序: 把一個數組分成兩個陣列,然後在把這兩個陣列再各自分成兩個陣列,直到陣列有兩個數,然後比較這兩個數,並且合併,排序。 就是上面這個樣子 的。。 不說了上程式碼(c++版): /** * name:分治演算法 * time:15/8/9 14:25 * envi

Leetcode演算法C語言15--字串中的第一個唯一字元

題目:字串中的第一個唯一字元 給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = “leetcode” 返回 0. s = “loveleetco

Leetcode演算法C語言2

題目: 從排序陣列中刪除重複項 給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1

最短路徑——dijkstra演算法程式碼c語言

最短路徑問題   看了王道的視訊,感覺雲裡霧裡的,所以寫這個部落格來加深理解。(希望能在12點以前寫完) 一、總體思想 dijkstra演算法的主要思想就是基於貪心,找出從v開始的頂點到各個點的最短路徑,做法入下 1.初始化三個輔助陣列   s[],dist[],path[]  

【作業系統】銀行家演算法實現C語言

# 【作業系統】銀行家演算法實現(C語言) ##### 注意:本人編碼水平很菜。算是自己的一個總結。可能會有我還沒有發現的bug。如果有人發現後可以指出,不勝感激。 ## 1.銀行家演算法: > 我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於

雙目立體匹配經典演算法之Semi-Global MatchingSGM概述:視差計算、視差優化

文章目錄 視差計算 視差優化 剔除錯誤匹配 提高視差精度 抑制噪聲 視差計算   在SGM演算法中,視差計算採用贏家通吃(WTA)演算法,每個畫素選擇最小聚

雙目立體匹配經典演算法之Semi-Global MatchingSGM概述:代價聚合Cost Aggregation

  由於代價計算步驟只考慮了局部的相關性,對噪聲非常敏感,無法直接用來計算最優視差,所以SGM演算法通過代價聚合步驟,使聚合後的代價值能夠更準確的反應畫素之間的相關性,如圖1所示。聚合後的新的代價值儲存在與匹配代價空間C同樣大小的聚合代價空間S中,且元素位置一一對應。 圖1:代價聚合