日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCv中实现了三种立体匹配算法:

發布時間:2025/7/25 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCv中实现了三种立体匹配算法: 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCv中實現了三種立體匹配算法:


BM算法


SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information


GC算法 算法文獻:Realistic CG Stereo Image Dataset with Ground Truth Disparity Maps


參考:http://blog.csdn.net/wqvbjhc/article/details/6260844


BM算法:速度很快,效果一般


復制代碼
void BM()
{
  IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? CvStereoBMState* BMState=cvCreateStereoBMState();
? ? assert(BMState);
? ? BMState->preFilterSize=9;
? ? BMState->preFilterCap=31;
? ? BMState->SADWindowSize=15;
? ? BMState->minDisparity=0;
? ? BMState->numberOfDisparities=64;
? ? BMState->textureThreshold=10;
? ? BMState->uniquenessRatio=15;
? ? BMState->speckleWindowSize=100;
? ? BMState->speckleRange=32;
? ? BMState->disp12MaxDiff=1;


? ? CvMat* disp=cvCreateMat(img1->height,img1->width,CV_16S);
? ? CvMat* vdisp=cvCreateMat(img1->height,img1->width,CV_8U);
? ? int64 t=getTickCount();
? ? cvFindStereoCorrespondenceBM(img1,img2,disp,BMState);
? ? t=getTickCount()-t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? cvSave("disp.xml",disp);
? ? cvNormalize(disp,vdisp,0,255,CV_MINMAX);
? ? cvNamedWindow("BM_disparity",0);
? ? cvShowImage("BM_disparity",vdisp);
? ? cvWaitKey(0);
? ? //cvSaveImage("cones\\BM_disparity.png",vdisp);
? ? cvReleaseMat(&disp);
? ? cvReleaseMat(&vdisp);
? ? cvDestroyWindow("BM_disparity");
}
復制代碼
? ?


  left.png             right.png ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?disparity.jpg


SGBM算法,作為一種全局匹配算法,立體匹配的效果明顯好于局部匹配算法,但是同時復雜度上也要遠遠大于局部匹配算法。算法主要是參考Stereo Processing by Semiglobal Matching and Mutual Information。


opencv中實現的SGBM算法計算匹配代價沒有按照原始論文的互信息作為代價,而是按照塊匹配的代價。


參考:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=23854


復制代碼
#include <highgui.h>
#include <cv.h>
#include <cxcore.h>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{


? ? IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? cv::StereoSGBM sgbm;
? ? int SADWindowSize = 9;
? ? sgbm.preFilterCap = 63;
? ? sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;
? ? int cn = img1->nChannels;
? ? int numberOfDisparities=64;
? ? sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
? ? sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
? ? sgbm.minDisparity = 0;
? ? sgbm.numberOfDisparities = numberOfDisparities;
? ? sgbm.uniquenessRatio = 10;
? ? sgbm.speckleWindowSize = 100;
? ? sgbm.speckleRange = 32;
? ? sgbm.disp12MaxDiff = 1;
? ? Mat disp, disp8;
? ? int64 t = getTickCount();
? ? sgbm((Mat)img1, (Mat)img2, disp);
? ? t = getTickCount() - t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));


? ? namedWindow("left", 1);
? ? cvShowImage("left", img1);
? ? namedWindow("right", 1);
? ? cvShowImage("right", img2);
? ? namedWindow("disparity", 1);
? ? imshow("disparity", disp8);
? ? waitKey();
? ? imwrite("sgbm_disparity.png", disp8); ??
? ? cvDestroyAllWindows();
? ? return 0;
}
復制代碼
??


        left.png       right.png ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?disparity.jpg         


GC算法 效果最好,速度最慢


復制代碼
void GC()
{
? ? IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? CvStereoGCState* GCState=cvCreateStereoGCState(64,3);
? ? assert(GCState);
? ? cout<<"start matching using GC"<<endl;
? ? CvMat* gcdispleft=cvCreateMat(img1->height,img1->width,CV_16S);
? ? CvMat* gcdispright=cvCreateMat(img2->height,img2->width,CV_16S);
? ? CvMat* gcvdisp=cvCreateMat(img1->height,img1->width,CV_8U);
? ? int64 t=getTickCount();
? ? cvFindStereoCorrespondenceGC(img1,img2,gcdispleft,gcdispright,GCState);
? ? t=getTickCount()-t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? //cvNormalize(gcdispleft,gcvdisp,0,255,CV_MINMAX);
? ? //cvSaveImage("GC_left_disparity.png",gcvdisp);
? ? cvNormalize(gcdispright,gcvdisp,0,255,CV_MINMAX);
? ? cvSaveImage("GC_right_disparity.png",gcvdisp);




? ? cvNamedWindow("GC_disparity",0);
? ? cvShowImage("GC_disparity",gcvdisp);
? ? cvWaitKey(0);
? ? cvReleaseMat(&gcdispleft);
? ? cvReleaseMat(&gcdispright);
? ? cvReleaseMat(&gcvdisp);
}
復制代碼
?


? ? ? ? ? ? ?


     left.png       right.png ? ? ? ? ? ? ? ?disparity.jpg  ? ? ??


如何設置BM、SGBM和GC算法的狀態參數?


參看:http://blog.csdn.net/chenyusiyuan/article/details/5967291

總結

以上是生活随笔為你收集整理的OpenCv中实现了三种立体匹配算法:的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。