1. 程式人生 > >OpenCV3.4兩種立體匹配演算法效果對比

OpenCV3.4兩種立體匹配演算法效果對比

typedef cv::Point_<short> Point2s;
template <typename T> void filterSpecklesImpl(cv::Mat& img, int newVal, int maxSpeckleSize, int maxDiff, cv::Mat& _buf)
{
    using namespace cv;

    int width = img.cols, height = img.rows, npixels = width*height;
    size_t bufSize = npixels*(int
)(sizeof(Point2s) + sizeof(int) + sizeof(uchar)); if (!_buf.isContinuous() || _buf.empty() || _buf.cols*_buf.rows*_buf.elemSize() < bufSize) _buf.create(1, (int)bufSize, CV_8U); uchar* buf = _buf.ptr(); int i, j, dstep = (int)(img.step / sizeof(T)); int* labels = (int*)buf; buf
+= npixels * sizeof(labels[0]); Point2s* wbuf = (Point2s*)buf; buf += npixels * sizeof(wbuf[0]); uchar* rtype = (uchar*)buf; int curlabel = 0; // clear out label assignments memset(labels, 0, npixels * sizeof(labels[0])); for (i = 0; i < height; i++) { T* ds = img.ptr<T>(i);
int* ls = labels + width*i; for (j = 0; j < width; j++) { if (ds[j] != newVal) // not a bad disparity { if (ls[j]) // has a label, check for bad label { if (rtype[ls[j]]) // small region, zero out disparity ds[j] = (T)newVal; } // no label, assign and propagate else { Point2s* ws = wbuf; // initialize wavefront Point2s p((short)j, (short)i); // current pixel curlabel++; // next label int count = 0; // current region size ls[j] = curlabel; // wavefront propagation while (ws >= wbuf) // wavefront not empty { count++; // put neighbors onto wavefront T* dpp = &img.at<T>(p.y, p.x); //current pixel value T dp = *dpp; int* lpp = labels + width*p.y + p.x; //current label value //bot if (p.y < height - 1 && !lpp[+width] && dpp[+dstep] != newVal && std::abs(dp - dpp[+dstep]) <= maxDiff) { lpp[+width] = curlabel; *ws++ = Point2s(p.x, p.y + 1); } //top if (p.y > 0 && !lpp[-width] && dpp[-dstep] != newVal && std::abs(dp - dpp[-dstep]) <= maxDiff) { lpp[-width] = curlabel; *ws++ = Point2s(p.x, p.y - 1); } //right if (p.x < width - 1 && !lpp[+1] && dpp[+1] != newVal && std::abs(dp - dpp[+1]) <= maxDiff) { lpp[+1] = curlabel; *ws++ = Point2s(p.x + 1, p.y); } //left if (p.x > 0 && !lpp[-1] && dpp[-1] != newVal && std::abs(dp - dpp[-1]) <= maxDiff) { lpp[-1] = curlabel; *ws++ = Point2s(p.x - 1, p.y); } // pop most recent and propagate // NB: could try least recent, maybe better convergence p = *--ws; } // assign label type if (count <= maxSpeckleSize) // speckle region { rtype[ls[j]] = 1; // small region label ds[j] = (T)newVal; } else rtype[ls[j]] = 0; // large region label } } } } }

相關推薦

OpenCV3.4立體匹配演算法效果對比

typedef cv::Point_<short> Point2s; template <typename T> void filterSpecklesImpl(cv::Mat& img, int newVal, int maxSpeckleSize, int maxDiff

[演算法]字串匹配演算法(索引法,KMP演算法對比,C語言實現

今天做了個一個簡單的字元對比程式,功能是實現從A串刪除包含B最多的字元的操作,比如A=“aaaaabbbbbbabababa” B=“aaccbaab”,應當刪除“aab”的,不是aa,相信知道搜尋引擎的朋友肯定是知道的吧,這種演算法主要用於去除頁面中無效的關鍵字,來減少收錄的計算消耗的一種方法,好了,具體演

典型的立體匹配演算法

SAD演算法 #include<iostream> #include<cv.h> #include<highgui.h> using namespace std; int GetHamm

典型的立體匹配演算法(opencv 1.0 DP 演算法)(比較全)

立體匹配演算法最新動態:http://vision.middlebury.edu/stereo/eval/ 介紹立體匹配的基本原理: http://vision.deis.unibo.it/~smatt/Seminars/StereoVision.pdf 立體匹配綜述性文章 :&n

OpenCV3.0立體匹配演算法對比研究(SGBM、BM、GC)

立體匹配演算法對比研究 引言:基於OpenCV3.0,對BM、SGBM和GC演算法進行了對比測試研究。由於SGBM演算法視差效果好速度快的特點,常常被廣泛應用和改進,本文針對SGBM演算法主要引數設定作了對比測試,以供大家參考。 BM:Block Matching ,採用S

遞迴演算法的比較

首先來看第一種: def fab(n): if(n<1): print('輸入有誤!!') return -1 if n==1 or n==2: return 1 else: return fab(n-

使用檔案進行輸入輸出的方式(演算法競賽入門經典第2章)

使用檔案進行輸入輸出的兩種方式: 1,  重定向       freopen("input.txt", "r", stdin);       freopen("output.txt", "w", stdout);       上述語句將使得scanf從檔案input.

區域性立體匹配演算法BM中的匹配代價聚合方法

Block Matching methods The following matching costs are defined for patches centered at the pixel positions  and . The matching costs

Displets立體匹配演算法

1.論文基本資訊 題目:Displets:Resolving Stereo Ambiguities using Object Knowledge 來源:Conferenceon Computer Vision and Pattern Recognition (CVPR

Master原理剖析與原始碼分析:資源排程機制原始碼分析(schedule(),資源排程演算法

1、主備切換機制原理剖析與原始碼分析 2、註冊機制原理剖析與原始碼分析 3、狀態改變處理機制原始碼分析 4、資源排程機制原始碼分析(schedule(),兩種資源排程演算法) * Dri

基於最小生成樹的實時立體匹配演算法簡介

圖割,置信傳播等全域性優化立體匹配演算法,由於運算過程中需要迭代求精,運算時間長,無法達到實時計算立體匹配的需求,然而實時性需求卻廣泛存在立體匹配的應用場景中。很多基於區域性匹配的演算法雖然運算時間短,但由於僅考慮匹配窗內的代價聚合,效果很差,視差圖只有很多

雙目立體匹配演算法--SAD(C++\FPGA)

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

Opencv立體匹配演算法BM、SGBM、GC演算法的狀態引數

原文來源:http://blog.csdn.net/chenyusiyuan/article/details/5967291 本文效果圖資原始碼:http://download.csdn.net/detail/this_is_chris/9565697,VS2010+o

立體匹配演算法_自適應視窗_Cross Based Support Region

1 自適應視窗 對於立體匹配區域性演算法而言,匹配代價計算 和 支援視窗選擇是很重要的兩個問題:匹配代價計算通過前面的文章已經介紹了關於Adaptive Support-Weight和Rank Transform兩種方法,對於支援視窗來說的,通常我們選取一個矩形窗,既然要自

SAD立體匹配演算法在opencv中的實現

SAD演算法具體原理見相關影象處理書籍。 該程式是opencv中文論壇的牛人貢獻的,感謝他的工作。 [c-sharp] view plaincopyprint? // Sum of Absolute Difference(SAD) #include <

立體匹配演算法(Stereo Matching)及其在OpenCV中的應用

模擬人的兩隻眼睛的Stereo相機最近變得很受歡迎。通過對stereo相機拍攝的左右兩張圖進行匹配找出視差圖,可以還原物體的3D資訊。 立體匹配(Stereo matching)的步驟如下: 1: 預處理:亮度歸一化,去噪,影象增強,濾波等等 2: 匹配Cost計算

立體匹配十大概念綜述---立體匹配演算法介紹

首先介紹一個很好的簡介國外PPT(入門必讀以及演算法介紹):在我的百度雲盤上: 一、概念         立體匹配演算法主要是通過建立一個能量代價函式,通過此能量代價函式最小化來估計畫素點視差值。立體匹配演算法的實質就是一個最優化求解問題,通過建立合理的能量函式,增加

Cross-Scale Cost Aggregation for Stereo Matching立體匹配演算法介紹

最近,研究了下CVPR2014上的一篇基於多尺度代價聚合的立體匹配演算法,這個作者提供了原始碼,運行了下,發現效果真心不錯,不開後端處理的話,時間在0.4s左右。這個演算法比較牛逼的有兩點: 1:結合多尺度思想,對原始影象進行下采樣,然後在每層影象上計算匹配代

立體匹配演算法

//Stereo Match By SAD #include <opencv2/opencv.hpp> #include <vector> #include <algorithm> #include <iostream> #include <win

自適應權值的立體匹配演算法——AdaptWeight

我在本科期間研究的方向一直是計算機視覺,研究生加入雙目視覺專案組後,感覺有的知識還是比較無知,所以萌新開始狂補知識點,剛好研究到自適應權的立體匹配演算法。 * 如有疑問,請留言;如文中有錯誤的觀點,