日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/7/25 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCv中实现了三种立体匹配算法: 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
OpenCv中實(shí)現(xiàn)了三種立體匹配算法:


BM算法


SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information


GC算法 算法文獻(xiàn):Realistic CG Stereo Image Dataset with Ground Truth Disparity Maps


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


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


復(fù)制代碼
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");
}
復(fù)制代碼
? ?


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


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


opencv中實(shí)現(xiàn)的SGBM算法計(jì)算匹配代價(jià)沒有按照原始論文的互信息作為代價(jià),而是按照塊匹配的代價(jià)。


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


復(fù)制代碼
#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;
}
復(fù)制代碼
??


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


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


復(fù)制代碼
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);
}
復(fù)制代碼
?


? ? ? ? ? ? ?


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


如何設(shè)置BM、SGBM和GC算法的狀態(tài)參數(shù)?


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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。